我的erode()函数不会产生与openCV的侵蚀函数相同的输出

时间:2017-11-18 23:36:32

标签: python image opencv image-processing

所以我对图像“外部”的像素使用了边框,因此内核可以使用边框的像素来获得最小值。 我不知道为什么我的函数会产生与内置函数不同的输出 - 我仔细检查了两个输出(写入图像并放大)并仔细观察我不能注意到像素的差异!

导入cv2     导入numpy为np

GetElementById

1 个答案:

答案 0 :(得分:0)

你的代码很好,除了两个小问题:

首先,imgEroded是三通道图像,而erode是单通道图像(您将img视为灰度),因此只需创建一个单通道{{1 }}

其次,您在imgEroded矩阵的索引编制中只有一个像素。如果您为n这样的数组建立索引,则意味着从索引arr[i-3:i+2]开始,然后转到一直到 i-3,这意味着您正在为i+2编制索引。这个大小为5,这是正确的,但中心不是i-3, i-2, i-1, i, i+1,而是i。所以你应该索引i-1。当然与i-2:i+3相同。这也意味着你实际上只需要j两个像素宽而不是三个,但这并不是什么大不了的事。

有了这两个变化:

copyMakeBorder()

imgEroded = np.zeros((512+6,512+6), np.uint8)

在相应的行上,n = np.matrix(reflect[i-2:i+3, j-2:j+3]) 打印print(np.array_equal(erode, imgEroded))

仅供参考,以帮助调试看起来类似的图像,我发现打印numpy图像数组非常有用;这就是我发现两个错误的方式。 1-ch对3-ch很明显,但在纠正之后我只是注意到第二个矩阵基本相同但在每个方向上移动了一个像素。