我的腐蚀()函数与openCV的腐蚀函数产生的输出不同

2024-09-30 01:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我用了一个边界来表示“在”图像之外的像素,这样内核就可以使用边界的像素来获得最小值。 我不知道为什么我的函数会产生一个与内置函数不同的输出-我仔细检查了两个输出(写入图像和放大),并且非常仔细地看,我没有注意到像素的差异!在

进口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)

Tags: 函数图像imgpngnp像素cv2边界
1条回答
网友
1楼 · 发布于 2024-09-30 01:35:03

您的代码除了两个小问题外没有问题:

首先,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()两个像素宽,而不是三个像素宽,但这并不是什么大问题。在

有了这两个变化:

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

以及

^{pr2}$

在相应的行上,print(np.array_equal(erode, imgEroded))打印True。在

为了帮助调试看起来相似的图像,我发现打印numpy图像数组非常有用;这就是我发现这两个错误的原因。但很明显,在每一秒,我都注意到了,每一个ch-1的方向都发生了变化。在

相关问题 更多 >

    热门问题