为何skimage的white_tophat运算结果与手动实现的顶帽运算存在差异
代码问题原因
核心逻辑错误:白顶帽的运算规则是「待处理图像 - 待处理图像自身的开运算结果」,你手动计算时开运算的输入对象和后续减法的输入对象不匹配:
- 你调用
morphology.opening时传入的是原始灰度图img,但后续是用反转后的图像img_not减去该开运算结果,完全不符合白顶帽的定义 - skimage的
morphology.white_tophat会自动对传入的img_not先做开运算,再用img_not减去开运算结果,和你错误手动计算的结果必然存在较大差异。
修正后代码
import numpy as np from skimage import morphology import cv2 as cv img = cv.imread('images/TEST.jpg', cv.IMREAD_GRAYSCALE) img_not = cv.bitwise_not(img) se = np.ones((50,50), np.uint8) # 修正点:开运算的输入改为和白顶帽处理对象一致的img_not opened = morphology.opening(img_not, se) wth_my= img_not - opened wth=morphology.white_tophat(img_not, se) # 验证二者结果一致 print(np.allclose(wth_my, wth)) cv.imwrite('images/TEST_Opened.jpg', opened) cv.imwrite('images/TEST_WTH_MY.jpg', wth_my) cv.imwrite('images/TEST_WTH.jpg', wth) cv.waitKey(0) cv.destroyAllWindows()
补充提示:OpenCV读取的灰度图默认是uint8类型,直接做减法时如果被减数小于减数会出现下溢截断,处理高动态范围图像时建议先转换为int32类型运算,再裁剪回uint8范围避免精度损失。
内容的提问来源于stack exchange,提问作者ussrback
相关产品推荐
相关产品推荐

