画像を削除するために、画像内のロゴを検出したい。ピクセル数の多いオブジェクトを探して削除するというアイデアがあります。もう1つのアイデアは、すべての白いピクセルをループして(画像を反転しました)、大きな領域を形成するピクセルを探してから、この領域を削除することです。これよりも優れたアルゴリズムはありますか?また、OpenCVのどのメソッドが、大きなピクセル数のオブジェクトを検出するのに役立ちます。
2 に答える
これを行う方法があります。この方法がすべてに適用できるかどうかはわかりませんが、ここではうまく機能します。
以下は(Pythonの)コードです:
まず、画像をグレースケールに変換し、画像のサイズを変更し、しきい値を適用して、サイズ変更されたグレースケール画像と同じサイズとタイプのマスク画像を作成します。(マスク画像は単なる黒い画像です)
import cv2
import numpy as np
img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()
mask = np.zeros(gray.shape,np.uint8)
次に、しきい値画像で輪郭を見つけます。500〜5000の領域の輪郭をフィルタリングします。おそらく文字ではなく、大きな白い塊になります。(この領域はこの画像に固有のものであることを忘れないでください。他の画像についてはわかりません。自分で見つける必要があります)。次に、白い色で塗りつぶされたマスク画像にこの輪郭を描きます。
contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if 200<cv2.contourArea(cnt)<5000:
cv2.drawContours(img,[cnt],0,(0,255,0),2)
cv2.drawContours(mask,[cnt],0,255,-1)
Below is the detected contour image:
Next is the mask image:
次に、関数を使用して画像を反転しcv2.bitwise_not
ます。マスク画像を指定するオプションがあり、マスク画像に白がある入力画像の領域でのみ関数が動作するようになります。
cv2.bitwise_not(gray2,gray2,mask)
そして最後に画像を表示します:
cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()
そしてここに結果があります:
ノート:
上記の方法は、白い四角に「ORANGE」を保存するために行われます。そのため、いくつかのアーティファクトがあります。そのオレンジも必要ない場合は、より正確にすることができます。
エリアフィルター処理された輪郭の境界長方形を見つけて、黒色で塗りつぶされた長方形を描画するだけです。
コード:
import cv2
import numpy as np
img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()
contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if 200<cv2.contourArea(cnt)<5000:
(x,y,w,h) = cv2.boundingRect(cnt)
cv2.rectangle(gray2,(x,y),(x+w,y+h),0,-1)
cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果 :
検出された境界長方形:
次に、それらの長方形を黒で塗りつぶします。
もちろん、「ORANGE」が欲しくないなら、以前よりもいいです)
モルフォロジーフィルター(おそらく交互のシーケンシャルフィルター)を使用してマルチカラー画像を単純化し、流域や粒度分布法などのセグメンテーションアルゴリズムを使用して、最大のオブジェクトを選択することができます。オンラインでいくつかの実装を見つけることができます。ただし、これはロゴが離散的である場合にのみ機能します(たとえば、背景にはありません)