web-dev-qa-db-ja.com

OpenCVを使用して大きな#の白いピクセルの領域を検出する方法

画像内のロゴを検出して削除したいのですが。ピクセル数の多いオブジェクトを探して削除するというアイデアがあります。別のアイデアは、すべての白いピクセル(画像を反転した)をループして、大きな領域を形成するピクセルを探し、この領域を削除することです。これより良いアルゴリズムはありますか?また、OpenCVのどのメソッドが大きなピクセル数のオブジェクトを検出するのにも役立ちます。

17
chostDevil

これを行う方法があります。この方法がすべてに適用できるかどうかはわかりませんが、ここではうまくいきます。

以下はコードです(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:

detected contour drawn on the input image

Next is the mask image:

New mask image

次に、cv2.bitwise_not関数を使用して画像を反転します。ここでは、マスク画像に白が存在する入力画像の領域でのみ機能するように、マスク画像を指定する場所にマスクを指定するオプションがあります。

cv2.bitwise_not(gray2,gray2,mask)

そして最後に画像を表示します:

cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()

そしてここに結果があります:

enter image description here


注:

上記の方法は、白い正方形の「オレンジ」を保存するために行われます。そのため、アーティファクトがいくつかあります。そのオレンジも必要ない場合は、より正確にすることができます。

エリアフィルタリングされた等高線の外接する四角形を見つけ、黒色で塗りつぶされた四角形を描画します。

コード:

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()

結果:

検出された境界矩形:

enter image description here

次に、これらの長方形を黒で塗りつぶします。

enter image description here

「ORANGE」を使いたくない場合はもちろん、以前よりも優れています)

37
Abid Rahman K

モルフォロジーフィルター(おそらく交互の順次フィルター)を使用してマルチカラー画像を簡略化し、流域や粒度分析法などのセグメンテーションアルゴリズムを使用して、最大のオブジェクトを選択できます。あなたはオンラインでいくつかの実装を見つけるかもしれません。しかし、これはロゴが(例えば、背景上ではなく)離散している場合にのみ機能します

1
sivann