Python : 画像の下処理、白黒反転、二極化、エッジ検出
画像処理をする際に、私が重要だと思っているのが、
まずは処理できる画像を撮ること、仕事で最も苦労しております。
次に画像の下処理です。
雑談になりますが、プログラミングとは別案件の仕事で、
1988年製の検査機を使ったのですが、感熱紙での記録となり、
これをグラフ化するためにプログラミングを今日していたのですが、
流れとしては、感熱紙をスキャナでpdfにして(実作業)
プログラムでは、pdfをjpgにして、曲がっていたので、ついでに回転。
この後に、画像の下処理をしてから、面積を取って、
縦軸の画素を数えるプログラムを作ってやっと、グラフ化できた!という流れですが、
下処理がまともにできていないと、次のプログラムに続かないのですよね。
というわけで、ここからが本題ですが、本日も仕事中に使いました、
画像の下処理についてです。
元の画像はLenaさんです。
私が主に使うのは、
・白黒画像を作成 → カラー画像を白黒にします。
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
・二極化
とりあえず半分の127を閾値として、白(0)と黒(255)に分けます。
127,255の所を変えると、画像が変わりますのでやってみるとよくわかると思います。
ret,th1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
・二極化、大津氏が作成してくれたプログラムだと思います。
二極化を使う際は基本、大津氏プログラムを使います。
ret,th_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
一発でそこそこの画像を出してくれるので、重宝しています。
・エッジ検出 画像の境界線を検出してくれます。
二極化同様で、100,200の数値を変えると画像が変わっていきます。
canny_frame = cv2.Canny(frame,100,200)
大津氏プログラムの画像を使い検出すると、この数字は何にしても変わらないです。
※すでに二極化してある画像は、0(黒)と255(白)の二色しかない状態のため、
ここの閾値はあろうがなかろうが、変化しようがないですので、
canny_frame = cv2.Canny(th_otsu,100,200)
これはちょっと微妙ですね。
プログラムは下記です。
#opencvをインポートします。
import cv2
#画像を読み込む
frame = cv2.imread('lena.jpg')
#白黒画像を作成
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#二極化 半分の127を起点
ret,th1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#二極化、大津氏プログラム
ret,th_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#エッジ検出
canny_frame = cv2.Canny(frame,100,200)
canny_frame_otsu = cv2.Canny(th_otsu,100,200)
#画像を開く
cv2.imshow('lena',frame)
cv2.imshow('lena_gray',gray)
cv2.imshow('lena_th1',th1)
cv2.imshow('lena_otsu',th_otsu)
cv2.imshow('lena_canny',canny_frame)
cv2.imshow('lena_canny_otsu',canny_frame_otsu)
#画像を保存
cv2.imwrite('image_file/lena.jpg',frame)
cv2.imwrite('image_file/lena_gray.jpg',gray)
cv2.imwrite('image_file/lena_th1.jpg',th1)
cv2.imwrite('image_file/lena_otsu.jpg',th_otsu)
cv2.imwrite('image_file/lena_canny.jpg',canny_frame)
cv2.imwrite('image_file/lena_canny_otsu.jpg',canny_frame_otsu)
#キー入力を待つ
cv2.waitKey(0)
#全ての開いたウインドウ閉じる
cv2.destroyAllWindows()