【人工智能项目】工业钢板焊缝图像去噪处理

【人工智能项目】工业钢板焊缝图像去噪处理

在这里插入图片描述

最近,论文盲审了~ 工作等谈薪了~。没大有什么事情了,就准备把研究生阶段做过的一些东西分享出来,希望给大家有所帮助。

本次分享的是有关一些高分辨率图像背景较为复杂的图像一些去噪处理方法,我当时处理的图像的分辨率大小是6000x1500分辨率,主要是当时工业背景较为复杂,待检测的缺陷对象与背景的差异不明显,因此需要对背景去噪,缺陷点增强的处理。

在这里插入图片描述

读取图片

首先给出本次处理的原始图片。
在这里插入图片描述
从原图中可以看出缺陷点与背景差异极其不明显,若想送入神经网络中必需要先对其进行预处理工作。

import cv2 
img = cv2.imread("src.tif",1)
#第二个参数是通道数和位深的参数,
#IMREAD_UNCHANGED = -1#不进行转化,比如保存为了16位的图片,读取出来仍然为16位。
#IMREAD_GRAYSCALE = 0#进行转化为灰度图,比如保存为了16位的图片,读取出来为8位,类型为CV_8UC1。
#IMREAD_COLOR = 1#进行转化为RGB三通道图像,图像深度转为8位
#IMREAD_ANYDEPTH = 2#保持图像深度不变,进行转化为灰度图。
#IMREAD_ANYCOLOR = 4#若图像通道数小于等于3,则保持原通道数不变;若通道数大于3则只取取前三个通道。图像深度转为8位
print (img.shape)
print (img.dtype) 
print (img.min())
print (img.max())
#创建窗口并显示图像
# cv2.namedWindow("Image")
# cv2.imshow("Image",img)
# cv2.waitKey(0)
# #释放窗口
# cv2.destroyAllWindows() 

(2072, 6822, 3)
uint8
80
252

图像模糊预处理

通过将图像与低通滤波器内核进行卷积来实现图像模糊。这对于消除噪音很有用。它实际上从图像中消除了高频部分(例如噪声,边缘)。因此,在此操作中边缘有些模糊。(有一些模糊技术也可以不模糊边缘)。OpenCV主要提供四种类型的模糊技术。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


plt.imshow(img2),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

# 中位模糊
blur = cv.blur(img2,(5,5))
plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
cv2.imwrite("blur.jpg",blur)

在这里插入图片描述

# 高斯滤波
blur = cv.GaussianBlur(img,(3,3),0)
plt.imshow(blur),plt.title('GaussianBlur')
plt.xticks([]), plt.yticks([])
plt.show()
cv2.imwrite("GaussianBlur.jpg",blur)

在这里插入图片描述

# 双边滤波
blur = cv.bilateralFilter(img,9,75,75)
plt.imshow(blur),plt.title('bilateralFilter')
plt.xticks([]), plt.yticks([])
plt.show()
cv2.imwrite("bilateralFilter.jpg",blur)

在这里插入图片描述

对比度增强

在进行对比度增强之前,先看一下图像的灰度直方图的分布情况。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
 
def calcGrayHist(I):
    # 计算灰度直方图
    h, w = I.shape[:2]
    grayHist = np.zeros([256], np.uint64)
    for i in range(h):
        for j in range(w):
            grayHist[I[i][j]] += 1
    return grayHist
 
img = cv.imread("src.tif")
grayHist = calcGrayHist(img)
x = np.arange(256)
# 绘制灰度直方图
plt.plot(x, grayHist, 'r', linewidth=2, c='black')
plt.xlabel("gray Label")
plt.ylabel("number of pixels")
plt.show()
# cv.imshow("img", img)
# cv.waitKey()

在这里插入图片描述

# 线性变换
# 对图像进行 线性变换
def linear_transform(img, a, b):
    '''
    :param img: [h, w, 3] 彩色图像
    :param a:  float  这里需要是浮点数,把图片uint8类型的数据强制转成float64
    :param b:  float
    :return: out = a * img + b
    '''
    out = a * img + b
    out[out > 255] = 255
    out = np.around(out)
    out = out.astype(np.uint8)
    return out

# a = 2, b=10
img = cv2.imread("src.tif") # 这里需要指定一个 img_path
img = linear_transform(img, 1, 10)
img =  cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img)

cv2.imwrite("linear.jpg",img)

在这里插入图片描述

# 直方图正规化
 
img = cv.imread("src.tif", 0)
# 计算原图中出现的最小灰度级和最大灰度级
# 使用函数计算
Imin, Imax = cv.minMaxLoc(img)[:2]
# 使用numpy计算
# Imax = np.max(img)
# Imin = np.min(img)
Omin, Omax = 0, 255
# 计算a和b的值
a = float(Omax - Omin) / (Imax - Imin)
b = Omin - a * Imin
out = a * img + b
out = out.astype(np.uint8)
# cv.imshow("img", img)
# plt.imshow("out",out)
# cv.imshow("out", out)
# cv.waitKey()
cv2.imwrite("normalize.jpg",out)
# 伽马变换
img = cv.imread("src.tif", 0)
# 图像归一化
fi = img / 255.0
# 伽马变换
gamma = 0.4
out = np.power(fi, gamma)
cv2.imwrite("gamma.jpg",out)
# 直方图均衡化
# 对图像进行 均衡化
def equalize_transfrom(gray_img):
    return cv.equalizeHist(gray_img)

img = cv2.imread("GaussianBlur.jpg") # 这里需要指定一个 img_path
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
b_out = equalize_transfrom(b)
g_out = equalize_transfrom(g)
r_out = equalize_transfrom(r)
equa_out = np.stack((b_out, g_out, r_out), axis=-1)
img =  cv2.cvtColor(equa_out,cv2.COLOR_BGR2RGB)
plt.imshow(img)

# 保存图片
cv2.imwrite("equalize.jpg",img)

在这里插入图片描述

# 高斯滤波
blur = cv.GaussianBlur(img,(3,3),0)
plt.imshow(blur),plt.title('GaussianBlur')
plt.xticks([]), plt.yticks([])
plt.show()
cv2.imwrite("GaussianBlur.jpg",blur)

在这里插入图片描述

# 全局直方图均衡化
import math

def equalHist(img):
    # 灰度图像矩阵的高、宽
    h, w,_ = img.shape
    # 第一步:计算灰度直方图
    grayHist = calcGrayHist(img)
    # 第二步:计算累加灰度直方图
    zeroCumuMoment = np.zeros([256], np.uint32)
    for p in range(256):
        if p == 0:
            zeroCumuMoment[p] = grayHist[0]
        else:
            zeroCumuMoment[p] = zeroCumuMoment[p - 1] + grayHist[p]
    # 第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系
    outPut_q = np.zeros([256], np.uint8)
    cofficient = 256.0 / (h * w)
    for p in range(256):
        q = cofficient * float(zeroCumuMoment[p]) - 1
        if q >= 0:
            outPut_q[p] = math.floor(q)
        else:
            outPut_q[p] = 0
    # 第四步:得到直方图均衡化后的图像
    equalHistImage = np.zeros(img.shape, np.uint8)
    for i in range(h):
        for j in range(w):
            equalHistImage[i][j] = outPut_q[img[i][j]]
    return equalHistImage
 
img = cv.imread("src.tif", 0)
# 使用自己写的函数实现
equa = equalHist(blur)
cv2.imwrite("equalize2.jpg",equa)
# 自动色彩均衡
img = cv2.imread("equalize.jpg",1) # 这里需要指定一个 img_path
b, g, r = cv2.split(img)
B = np.mean(b)
G = np.mean(g)
R = np.mean(r)
K = (R + G + B) / 3
Kb = K / B
Kg = K / G
Kr = K / R
cv2.addWeighted(b, Kb, 0, 0, 0, b)
cv2.addWeighted(g, Kg, 0, 0, 0, g)
cv2.addWeighted(r, Kr, 0, 0, 0, r)
merged = cv2.merge([b,g,r])
plt.imshow(merged)
cv.imwrite('merged.jpg',merged)

在这里插入图片描述

# 自适应直方图均衡
import numpy as np
import cv2 as cv
img = cv2.imread("merged.jpg",0) # 这里需要指定一个 img_path
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
plt.imshow(cl1)
cv.imwrite('clahe_2.jpg',cl1)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mind_programmonkey

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值