目录
- 一、cv2.subtract()函数
- 二、cv2.subtract(image,blurred)和(image-blurred)处理效果对比
- 2.1 代码
- 2.2 输出结果
- 三、总结
一、cv2.subtract()函数
cv2.subtract是OpenCV库中的一个函数,用于进行图像减法运算。它可以很方便地进行两个图像之间的减法操作,也可以用来对一个图像进行常量的减法操作。
函数的调用语法如下:
cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)
参数说明:
src1:作为被减数的图像数组或一个标量。
src2:作为减数的图像数组或一个标量。
dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确定。
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
二、cv2.subtract(image,blurred)和(image-blurred)处理效果对比
2.1 代码
import cv2
image = cv2.imread('Images/Visible_Images/1.jpg')# 使用高斯滤波器进行滤波
blurred = cv2.GaussianBlur(gray, (5,5), 0)# 计算高频残差图像
residual_1 = gray - blurred
residual = cv2.subtract(image, blurred)cv2.imshow("original",original)
cv2.imshow("residual_1",residual_1)
cv2.imshow("residual",residual)cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 输出结果
下面左图为原图,中间图为(image-blurred)方法处理结果,右图为cv2.subtract(image,blurred)处理结果。
分析:
从上面的输出结果可以看出直接使用(image-blurred),即矩阵减法在出现负数时,由于类型是uint8,负数会变成256加该负数的值,导致差异很大,也就是像素值溢出,高频信息提取较差。使用(image-blurred)这种方法,必须通过if语句对(image-blurred)差值进行限制,如果差值小于0就赋值为0,如果差值大于255赋值为255。
cv2.subtract(image,blurred)处理结果较好的提取出了高频信息,cv2.subtract函数的结果比直接使用矩阵减法更自然和平滑,它能够确保结果始终在有效的图像数据范围内。如果计算的结果小于0或大于最大值(如255对于8位图像),它会将结果裁剪到有效范围。这可以防止数据溢出,并确保结果总是有效的图像数据。
三、总结
通过上面对比分析,建议直接使用cv2.subtract函数提取高频信息,高效省事。