2017-11-18 3 views
0

私は、画像の「外側」にあるピクセルにボーダーを使用しました。 なぜ私の関数がinbuilt関数の出力と異なる出力を生成するのか分かりません - 私は両方の出力を慎重に調べて(画像に書き込み、ズームインしています)、非常に注意深く見ています!私のerode()関数は、openCVのerode関数と同じ出力を生成しません。

輸入CV2 輸入numpyのあなたのコードは、2つの小さな問題を除いて結構です

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) 

答えて

0

NPとして:

まず、imgErodederodeは、単一チャネル画像である一方、3チャンネルの画像れる(あなたが読んでimgをグレースケールとして表示)、単一チャネルのimgErodedを作成するだけです。

第2に、nマトリックスのインデックス作成で1ピクセル下がっています。 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と同じです。これはまた実際には2つのピクセルの幅がcopyMakeBorder()で3つではないことが必要であることを意味しますが、それは大きな問題ではありません。対応するライン上

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))プリントTrue:これら二つの変更により

。 FYI

は、同様の、私は スーパー有用であることがnumpyの画像アレイの印刷を見つける見えることデバッグイメージを支援します。それが私が両方のエラーを見つけた方法です。 1ch対3chは直ちに分かりますが、2番目の行列は基本的に同じですが、各方向にピクセルをシフトしたことに気付きました。

関連する問題