【发布时间】: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