手动实现dilation(图像膨胀)时内核中心像素无法置白如何修复?
图像膨胀实现问题修复方案
问题根源
你的代码存在三个核心错误:
- 实现逻辑不符合需求:膨胀操作要求检测到白色像素时,将内核覆盖的所有区域都置为白色,你当前仅修改内核区域的中心像素,自然无法达到膨胀效果
- 冗余无效计算:
cv2.bitwise_and、np.amax的调用完全不符合你预设的“印内核”的实现思路,做了无用计算 - 初始化逻辑隐患:你直接复制填充后的原图作为输出图像的初始值,容易出现旧值干扰
修复后代码
默认使用3x3全1内核,可根据需求调整内核尺寸和形状:
import numpy as np import cv2 from matplotlib import pyplot as plt # 输入二值图im ksize = 3 element = np.ones((ksize, ksize), dtype=np.uint8) height, width = im.shape border = ksize // 2 # 原图边缘填充 paddedIm = cv2.copyMakeBorder(im, border, border, border, border, cv2.BORDER_CONSTANT, value=0) # 输出图像初始化为全黑,避免旧值干扰 paddedDilatedIm = np.zeros_like(paddedIm) for h_i in range(border, height + border): for w_i in range(border, width + border): # 原图像当前位置为白色,印内核 if im[h_i - border, w_i - border] == 1: roi = paddedDilatedIm[h_i - border : h_i + border + 1, w_i - border : w_i + border + 1] # 逻辑或保证已有白色像素不会被覆盖 paddedDilatedIm[h_i - border : h_i + border + 1, w_i - border : w_i + border + 1] = np.logical_or(roi, element) # 裁剪掉填充边缘,得到和原图尺寸一致的膨胀结果 dilatedIm = paddedDilatedIm[border : height + border, border : width + border].astype(np.uint8)
验证说明
运行上述代码后,所有原白色像素点都会向外扩展对应内核尺寸的白色区域,符合二值图像膨胀的预期效果。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

