Google ColabにてPython 3.8 + OpenCV 4.2.0 で画像処理をしています.
img1から一部を切り出して保存したimg2に対して,テンプレートマッチングによりimg1上のimg2部分を白塗りする関数を作成しようとしているのですが,うまく動きません.
引数image1,image2は画像パスで,返り値は白抜き後画像の配列情報img1を想定しています.
##試したこと
それぞれ下記スクリプトのif Judg == True:
内の中身です.
0. img2と同じサイズの白い画像(blank_img)を用意し,テンプレートマッチング結果maxLocから得られたマッチング部分に白い画像を貼り付ける
0. テンプレートマッチング結果maxLocから,img2と同じ大きさの部分を255(白)にする
0. maxLocから得られた部分にimg2と同じ大きさのcv2.rectangleで塗りつぶす
特にエラーが出ることもなく,処理に成功しないまま実行完了します...
python
1def erase_img(image1 , image2): #img1上でimg2と一致するものがあればそこを白塗りする関数 2#引数はimg1,img2のパス 3 4 img1 = cv2.imread(image1 , cv2.IMREAD_GRAYSCALE) #デカい方 5 img2 = cv2.imread(image2 , cv2.IMREAD_GRAYSCALE) #ちっこい方 6 blank_img = np.zeros(img2.shape , np.uint8) + 255 #ちっこい方と同じサイズの白画像作成 7 8 9 #ちっこいの検索開始 10 result = cv2.matchTemplate(img2, img1, cv2.TM_CCORR_NORMED) 11 12 #最も類似度が高い位置と低い位置を取得 13 minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) 14 15 #類似度が閾値を超えているか判定(後述) 16 Judg = Judge_Matching(maxVal) 17 18 if Judg == True: 19 img1[ maxLoc[1]: maxLoc[1] + img2.shape[1] , maxLoc[0] : maxLoc[0] + img2.shape[0] ] = blank_img 20 img1[ maxLoc[1]: maxLoc[1] + img2.shape[1] , maxLoc[0] : maxLoc[0] + img2.shape[0] ] = 255 #白塗りして保存 21 cv2.rectangle(img1, maxLoc , img2.shape , (0, 0, 255), -1) #黒塗りはどうや? 22 return img1 #返り値は処理後の画像
上記のJudge_Matchingは以下の単純な判定関数です.
python
1def Judge_Matching(num): 2 if num == 1: 3 return True 4 else: 5 return False
##main文
main
1targetimgs = glob.glob("./hoge/*.jpg") 2for targetimg in targetimgs: 3 print(targetimg) 4 baseimg = targetimg.replace("hoge" , "fuga") 5 print(baseimg) 6 img_out = erase_img( baseimg , targetimg ) 7 cv2_imshow(img_out) 8 cv2.imwrite(baseimg , img_out)
カレントディレクトリ内にhogeとfugaがあり,その中に一定の命名規則に従った画像が保存されています.hoge内の画像image1
は fuga内のimage1からトリミングしたもの
であり.上の例だとhoge内にLennaの目が,fuga内にLennaの全体がそれぞれ保存されています.
対応関係を整理しやすいように各画像の命名規則は揃えています.
最終行では関数からの返り値img_outでbaseimgを上書きしています.
かなり初歩的な点かもしれませんが,ここで5日ほど詰まっております.
ご教授のほど,よろしくお願いいたします.
回答2件
あなたの回答
tips
プレビュー