1)加法与减法。
假设 f(x,y),g(x,y)分别为两幅已知的图像,图像的加法和减法操作就是直接在每个位置的像素上做运算(两幅图像的尺寸需保持一致),最终得到的图像 s(x,y),可能会出现以下问题:
会出现不在 [ 0-255 ] 之间的像素点存在,最简单的操作就是小于 0 的像素点置为 0,大于 255 的像素点置为 255,或者可以做最大最小值均衡,将图像的对比度拉回来;可能会出现 float,double 等,一般来说最后图像像素的类型都是无符号整数 unit8。
加法公式: s(x,y) = f(x,y) + g(x,y)
减法公式: s(x,y) = f(x,y) - g(x,y)
可以使用函数 cv2.add(), cv2.addWeighted()将两幅图像进行加法运算,两幅图像的大小,类型必须一致,或者第二个图像可以使一个简单的标量值。
2)平均值去噪
带有噪声的图像可以看作原始图像函数与噪声函数的和:
f(x,y)=I(x,y)+Noise(x,y)
当样本量足够大时,噪声 Noise(x,y)对图像的影响可以忽略。所以通过对样本就行平均可以起到去噪效果。OpenCV 中有一个专门的平均滤波模板供使用— —归一化卷积模板,所有的滤波模板都是使卷积框覆盖区域所有像素点与模板相乘后得到的值作为中心像素的值。
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg' )
是保存plt图像,如果不使用可以注释掉
这个代码要两张图片进行相加,所以还要改变第十行图片地址
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def put(path):
image = cv2.imread(path, 1)
img2 = cv2.imread('test.jpg', 1)
height, width = image.shape[:2]
new_img2 = cv2.resize(img2, (width, height), interpolation=cv2.INTER_CUBIC) # 将相加图像设置为何原图一样大小
# 图像相加, 要把两张图片的宽高设置为一样才可以加减
# add_img = cv2.add(new_img2,image)
# 第二种图像相加,可给图像赋予不同的权重(0到1之间),使得它具有混合感或透明感。
add_img = cv2.addWeighted(new_img2,0.5,image,0.5,0)
# 平均值去噪
img_medianBlur = cv2.medianBlur(image, 3)
# 图像相减
sub_img = image - img_medianBlur
fig = plt.figure(figsize=(8,7))
ax0 = fig.add_subplot(221)
ax0.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax0.title.set_text('原图')
ax1 = fig.add_subplot(222)
ax1.imshow(cv2.cvtColor(add_img, cv2.COLOR_BGR2RGB))
ax1.title.set_text('图像相加')
ax2 = fig.add_subplot(223)
ax2.imshow(cv2.cvtColor(img_medianBlur, cv2.COLOR_BGR2RGB))
ax2.title.set_text('平均值去噪')
ax3 = fig.add_subplot(224)
ax3.imshow(cv2.cvtColor(sub_img, cv2.COLOR_BGR2RGB))
ax3.title.set_text('原图减去噪图像')
# plt.savefig('2.new.jpg')
plt.show()
put(r'../image/image2.jpg')