前提・実現したいこと
複数枚の写真からガラスなどの反射による映り込みを除去した背景写真を生成する論文からプログラムを実装しようとしています.
この論文内でエッジ画像から4連結した画像のみをプロットする処理を実装したいです.
順を追って説明します.
上記論文ではまず,入力画像からエッジを取得します.このエッジ画像はエッジ部を白,それ以外を黒とする画像です.以下に実際のエッジ画像の例を図1に示します.
このエッジ画像を使って,各画素を探索します.このとき,探索対象画素の周囲の9画素の内,エッジの画素である画素が4画素以上ならば,その探索画素をプロットする処理を実装したいです.
私自身で実装したコードを該当のソースコードに示します.
些細なことでも良いのでアドバイス頂けますと助かります.
発生している問題
該当のソースコードから得られた出力画像を図2に示します.
該当のソースコードから得られた出力画像の問題点として,そもそも,エッジのない画素にエッジをプロットしているという問題が起こっています.以下に具体的な例の図3,図4,図5,図6に示します.
図4,図6を比較すると,図4のエッジ画像で存在していたエッジが図6では消えていることがわかります.
該当のソースコード
Python
1import cv2 2import numpy as np 3 4def count_neibor(binary_image): 5 image_thinned = binary_image.copy() 6 #画像の縦と横のサイズを取得 7 rows, columns = image_thinned.shape 8 #プロットする画像を宣言 9 dist_image = np.zeros(image_thinned.shape,dtype=np.uint8) 10 11 #各画素を探索 12 for x in range(1, rows - 1): 13 for y in range(1, columns -1): 14 15 #探索画素から近傍画素を設定 16 neighbour_points = neighbours(x, y, image_thinned) 17 #近傍画素にエッジが4以上あるならdist_imageに探索画素をプロット 18 if(255*4 <= sum(neighbour_points)): 19 dist_image[x,y] = 255 20 21 return dist_image 22 23def neighbours(x, y, image): 24 return [image[x-1][y], image[x-1][y+1], image[x][y+1], image[x+1][y+1], 25 image[x+1][y], image[x+1][y-1], image[x][y-1], image[x-1][y-1]] 26 27def main(): 28 29 #エッジ画像をグレースケールで取得 30 image = cv2.imread("canny1.png",0) 31 32 #エッジ画像から4連結した画素のみを生成 33 dist_image = count_neibor(image) 34 35 cv2.imwrite("count_neibourhood.png", dist_image) 36 cv2.imshow('input',image) 37 cv2.imshow('dist_image',dist_image) 38 cv2.waitKey(0) 39 cv2.destroyAllWindows() 40 41if __name__ == "__main__": 42 main()
補足情報(FW/ツールのバージョンなど)
numpy 1.14.0
opencv 3.4.1
python 3.6.4
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/03 03:22