Python OpenCV 外接矩形が画像自体の外形を認識してしまう場合

まくまく
まくまく
Pythonの画像処理ライブラリ OpenCVで外接矩形を描写するとき、目的のオブジェクトでなく画像全体を認識してしまうときの対処法です。

元画像


使用する画像はこちら。白背景の中央に星形の図形が描写された画像です。

以下のプログラムを実行して、この星に外接する矩形を加えたいと思います。



処理と結果

プログラム①

#ライブラリのインポート
import cv2

#画像読み込み
img = cv2.imread('test.jpeg')

#グレースケールへ変換
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#2値化 (画像、閾値、閾値を超えた場合に変更する値、2値化の方法)
ret, img_th = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)

#輪郭検出
contours, hierarchy = cv2.findContours(img_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

#外接矩形を描写
for cnt in contours:
    x, y, xx, yy = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x,y), (x+xx, y+yy), (0,0,255),10)

cv2.imwrite("bittest.jpg", img)


赤い線が外接矩形です。星の図形に外接してほしいのに、画像自体の外形に接するようになっています。

2値化画像を確認


2値化画像を確認してみましょう。11行目の「img_th」のところです。

画像自体は白と黒できれいに2値化されていますが、背景が白、星が黒になっています。

今回は星を検出したいので、背景が黒、星を白にしなければなりません。

このため、2値化のあとに「cv2.bitwise_not」を加えてみましょう。

#2値化 (画像、閾値、閾値を超えた場合に変更する値、2値化の方法)
ret, img_th = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
img_th = cv2.bitwise_not(img_th)


白と黒を反転することができました。

最終プログラム

bitwiseによる反転を付け加えたコードはこちら。

#ライブラリのインポート
import cv2

#画像読み込み
img = cv2.imread('test.jpeg')

#グレースケールへ変換
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#2値化 (画像、閾値、閾値を超えた場合に変更する値、2値化の方法)
ret, img_th = cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
img_th = cv2.bitwise_not(img_th)

#輪郭検出
contours, hierarchy = cv2.findContours(img_th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

#外接矩形を描写
for cnt in contours:
    x, y, xx, yy = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x,y), (x+xx, y+yy), (0,0,255),10)

cv2.imwrite("bittest.jpg", img)

出力


星形図形の外接矩形を描写することができました。

Python OpenCVを用いた画像処理についてはこちらの記事でまとめています。>>>Python OpenCV 使い方まとめ

タイトルとURLをコピーしました