图像锐化:相同数学操作为何得到不同图像数组?
为什么直接加减图像实现非锐化掩模会得到异常结果?
我尝试通过非锐化掩模(Unsharp Masking)对图像进行锐化,该方法的数学逻辑是:用原图像减去高斯模糊图像得到差值,再将差值加回原图像(即 锐化图 = 原图像 + (原图像 - 高斯模糊图) = 2*原图像 - 高斯模糊图)。
第一段代码(得到异常结果):
img = cv2.imread('redhat.jpg') gauss = cv2.GaussianBlur(img,(7,7),0) diff = img - gauss sharp = img + diff cv2_imshow(img) cv2_imshow(sharp)
- 原图像:红帽子的正常彩色图像
- 得到的锐化图像:存在严重色彩失真、色块异常的图像
第二段代码(得到正确结果):
img = cv2.imread('redhat.jpg') gauss = cv2.GaussianBlur(img,(7,7),0) sharp = cv2.addWeighted(img, 2, gauss, -1, 0) cv2_imshow(img) cv2_imshow(sharp)
- 得到的锐化图像:边缘清晰、色彩正常的正确锐化图像
两段代码数学逻辑等价,但结果差异巨大,核心原因是像素值的数值类型处理方式不同:
- OpenCV读取的图像默认是
uint8类型(仅能存储0-255的无符号整数)。第一段代码直接用-和+运算符计算时,会触发uint8的溢出截断:- 当
img - gauss得到负数时,会被直接截断为0; - 当
img + diff的结果超过255时,会被截断为255;
这种截断破坏了像素的正常数值范围,最终导致色彩失真。
- 当
cv2.addWeighted函数会自动处理数值溢出:它先将计算过程中的数值转换为更高精度的类型(如int32),完成运算后再把结果裁剪到0-255的合法范围内,最后转回uint8类型,因此能得到符合预期的锐化效果。
内容的提问来源于stack exchange,提问作者Icky Witchy
相关产品推荐
相关产品推荐

