You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:09:11