所以我用了一个边界来表示“在”图像之外的像素,这样内核就可以使用边界的像素来获得最小值。 我不知道为什么我的函数会产生一个与内置函数不同的输出-我仔细检查了两个输出(写入图像和放大),并且非常仔细地看,我没有注意到像素的差异!在
进口cv2 将numpy作为np导入
img = cv2.imread('lena.png',cv2.IMREAD_GRAYSCALE)
reflect = cv2.copyMakeBorder(img,3,3,3,3,cv2.BORDER_REFLECT)
cv2.imshow('img', reflect)
cv2.waitKey(0)
imgEroded = np.zeros((512+6,512+6,3), np.uint8)
for i in range(0,reflect.shape[0]):
for j in range(0,reflect.shape[1]):
n = np.matrix(reflect[i-3:i+2, j-3:j+2])
if n.size > 0:
imgEroded[i][j] = n.min()
imgEroded = imgEroded[3:512+3, 3:512+3]
kernel = np.ones((5,5),np.uint8)
erode = cv2.erode(img,kernel)
# print erode.shape[:2]
cv2.imshow('erosionCorrect',erode)
cv2.imshow('erosion',imgEroded)
cv2.imwrite('myOutput.png',imgEroded)
cv2.imwrite('correct.png',erode)
print(np.array_equal(erode, imgEroded))
# cv2.imshow('real',erode)
cv2.waitKey(0)
您的代码除了两个小问题外没有问题:
首先,
imgEroded
是三通道图像,erode
是单通道图像(您将img
读作灰度),所以只需创建一个单通道imgEroded
。在第二,您的
n
矩阵的索引减少了一个像素。如果您索引一个类似arr[i-3:i+2]
的数组,这意味着从索引i-3
开始,一直到直到i+2
,这意味着您正在索引i-3, i-2, i-1, i, i+1
。它的大小是5,这是正确的,但是中心不是i
,而是i-1
。所以你应该索引i-2:i+3
。当然与j
相同。这也意味着您实际上只需要copyMakeBorder()
两个像素宽,而不是三个像素宽,但这并不是什么大问题。在有了这两个变化:
以及
^{pr2}$在相应的行上,
print(np.array_equal(erode, imgEroded))
打印True
。在为了帮助调试看起来相似的图像,我发现打印numpy图像数组非常有用;这就是我发现这两个错误的原因。但很明显,在每一秒,我都注意到了,每一个ch-1的方向都发生了变化。在
相关问题 更多 >
编程相关推荐