【问题标题】:Is the code for dilation can be use in erosion to get the required result?膨胀代码是否可以在腐蚀中使用以获得所需的结果?
【发布时间】:2020-05-29 10:31:47
【问题描述】:

使用内置函数cv2.erode() 应用腐蚀的输出与没有OpenCV 内置腐蚀函数的输出不匹配。我的问题是“从头开始膨胀的代码(意味着不使用cv2.dilate())对于腐蚀是否相同?”

#Code for Erosion from scratch :

import cv2
import numpy as np
from dataPath import DATA_PATH
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['figure.figsize'] = (6.0, 6.0)
matplotlib.rcParams['image.cmap'] = 'gray'

im = np.zeros((10,10),dtype='uint8')

im[0,1] = 1
im[-1,0]= 1
im[-2,-1]=1
im[2,2] = 1
im[5:8,5:8] = 1

element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))

ksize = element.shape[0]
height,width = im.shape[:2]

border = ksize//2
# Create a padded image with zeros padding
#paddedIm = np.zeros((height + border*2, width + border*2))
paddedIm = cv2.copyMakeBorder(im, border, border, border, border, cv2.BORDER_CONSTANT, value = 1)
for h_i in range(border, height+border):
    for w_i in range(border,width+border):
        # When you find a white pixel
        if im[h_i-border,w_i-border]:
            print("White Pixel Found @ {},{}".format(h_i,w_i))

            paddedIm[ h_i - border : (h_i + border)+1, w_i - border : (w_i + border)+1] = \
                cv2.bitwise_and(paddedIm[ h_i - border : (h_i + border)+1, w_i - border : (w_i + border)+1],element)

            # Print the intermediate result
            print(paddedIm)
            plt.imshow(paddedIm);plt.show()

erodedImage = paddedIm[border:border+height,border:border+width]
plt.imshow(erodedImage)

输入图像: Image for erosion

使用cv2.erode()输出图像(预期输出图像): Final image from using cv2.erode

不使用内置函数进行腐蚀的输出图像(我得到的输出图像): Output Image without using cv2.erode

【问题讨论】:

  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
  • 侵蚀的代码与膨胀的代码不同,因为这是两种不同的操作。在您使用逻辑 OR 实现膨胀的情况下,将使用 AND 实现侵蚀。或者,可以反转输入图像,应用膨胀,然后反转结果以形成腐蚀。
  • @CrisLuengo 先生,我更改了cv2.bitwise_and(),但使用cv2.erode() 获得的输出与从代码中从头开始侵蚀的输出不同。
  • @CrisLuengo 我已经编辑了我的问题并给出了输入图像、预期输出图像和我得到的输出图像。尽快回复先生。
  • @CrisLuengo 先生,您能帮帮我吗?

标签: python opencv computer-vision


【解决方案1】:

有不同的方法可以实现二元膨胀和腐蚀。

用于膨胀的代码使用“标记”方法,在该方法中,您为每个前景像素标记结构元素(即,设置为前景由以给定像素为中心的结构元素覆盖的每个像素)。

该算法的腐蚀对应物是为每个背景像素标记结构元素:对于每个 background 像素,设置为 background 结构元素覆盖的每个像素居中在给定的像素上。

因此,if im[h_i-border,w_i-border]: 变为 if not im[h_i-border,w_i-border]:paddedIm[...] = cv2.bitwise_or(paddedIm[...],element) 变为 paddedIm[...] = cv2.bitwise_and(paddedIm[...],~element)。 (您可以预先计算 ~element 以提高效率。)

【讨论】:

  • 感谢先生的回答。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
相关资源
最近更新 更多