こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- Pythonによる画像処理に興味がある。
- OpenCVの画像処理を適用し2値化した「白黒画像」を出力したい。
OpenCVとは
OpenCV(Open Source Computer Vision Library)とは、画像処理やコンピュータビジョンの分野で広く活用されているオープンソースライブラリです。画像データの数値処理に強いのが特徴であり、高度な統計アルゴリズムも多数含まれていることから、近年機械学習の分野でも広く利用されています。
【Python】OpenCVによる2値化処理|白黒画像の出力
PythonのOpenCVライブラリをもとに2値化画像を出力する方法について解説します。
OpenCVの cv2.threshold
メソッドを用いるのが特徴であり、ひな型は次のように記載できます。
ret,th_img = cv2.threshold(img, # 入力画像(グレースケール画像を指定すること)
0, # 閾値
255, # 閾値を超えた画素に割り当てる値
cv2.THRESH_BINARY # 閾値処理方法
)
第1引数には、2値化したい画像を指定します。この時、必ずグレースケールの画像を指定するようにしましょう。第2引数には、画素値を識別するための閾値を指定します。第3引数には、閾値を超えた画素に割り当てる値を指定します。第4引数には、OpenCVで用意された閾値処理メソッドを指定します。
閾値処理メソッドには以下があります。メソッドを変えることで出力される2値化画像の特徴も変化します。
- cv2.THRESH_OTSU
- cv2.THRESH_BINARY
- cv2.THRESH_TOZERO
- cv2.THRESH_TRUNC
実際の画像を用いてコードを実行してみましょう。いくつか例を示します。
画像の2値化|cv2.THRESH_BINARY
画像読込
部分にお手元の画像のディレクトリを指定し、以下を実行してみましょう。
import cv2
# 画像読込
img = cv2.imread("image_data.jpg")
# グレースケールに変換
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# モノクロ化
threshold = 100
ret,th_img = cv2.threshold(img, # 画像データ
100, # 閾値
255, # 閾値を超えた画素に割り当てる値
cv2.THRESH_BINARY # 閾値処理方法
)
# 閾値確認
print(ret)
# 2値化後の画像を表示
cv2.imshow("img",th_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
画像の2値化|cv2.THRESH_OTSU
閾値に0を指定し、cv2.THRESH_OTSU
を閾値処理方法として指定すると、閾値が自動で設定されます。
import cv2
# 画像読込
img = cv2.imread("image_data.jpg")
# グレースケールに変換
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 2値化
ret,th_img = cv2.threshold(img, # 入力画像(グレースケール画像を指定すること)
0, # 閾値
255, # 閾値を超えた画素に割り当てる値
cv2.THRESH_OTSU # 閾値処理方法
)
# 閾値確認
print(ret)
# 2値化後の画像を表示
cv2.imshow("img",th_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
【Python】OpenCV・トラックバーを用いた白黒画像の明るさ調節
トラックバーで閾値を変更し、白黒画像の明暗調節することができます。次のコードを実行してみましょう。
import cv2
# 画像読込
img = cv2.imread("image_data.jpg")
# グレースケールに変換
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# トラックバー作成
def trackbar(position):
# グローバル変数に指定
global threshold
threshold = position
# トラックバーのウィンドウ設定
cv2.namedWindow("img")
# 閾値
threshold = 100
# トラックバー関数
cv2.createTrackbar("trackbar", # トラックバー名
"img", # ウィンドウ名
threshold, # 閾値
255, # 閾値の最大値
trackbar # トラックバーの関数
)
# 画像の2値化処理
while True:
th_img = cv2.adaptiveThreshold(img, # 入力画像
255, # 閾値を超えた画素に割り当てる値
cv2.ADAPTIVE_THRESH_MEAN_C, # 適用的閾値処理(近傍領域の平均値採用)
cv2.THRESH_BINARY, # 閾値処理
3, # ピクセルのしきい値計算に利用するピクセル近傍のサイズ
threshold # 閾値
)
# 画像表示
cv2.imshow("img_trachbar",th_img)
cv2.imshow("img",img)
#エスケープキーを押すと強制終了
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
【参考】Python・OpenCVを用いた画像処理
当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。
用途 | 【Python×OpenCV】記事名 |
---|---|
画像変換 | 画像のリサイズ・拡大・縮小 |
画像変換 | 画像の回転・反転・平行移動|アフィン変換 |
画像変換 | 画像の明るさ調節|ガンマ補正 |
画像変換 | グレースケール・HSV・L*a*b|色空間の変換 |
画像変換 | モノクロ(白黒)画像変換|2値化処理 |
画像変換 | ヒストグラムの描画・ヒストグラム均一化処理 |
画像変換 | 画像上にテキスト・図形(直線・長方形・円)を描画 |
画像変換 | 画像の透視変換・遠近法 |
画像変換 | 画像のノイズ除去・平滑化 |
画像変換 | 画像の畳み込み(空間フィルタリング) |
特徴抽出 | エッジの検出方法 |
画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。
画像処理・コンピュータビジョンの勉強におすすめ入門本・動画教材7選|OpenCV解析結果をディープラーニングに適用!
「画像処理・コンピュータビジョン分野に興味があり、画像処理のプログラミングスキルを習得したい」「OpenCVを用いた画像解析手法を学びたい」このような方向けにおすすめの教材を紹介します。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら