O・TA・KU Dreamer

自分が日々思っていることについて語るブログです。

Python+OpenCVで遊んで見た

久々の更新になります、おはこんばんちわ、zyozer00です。

早いものでもう7月です。暑すぎる中最近は僕はと言いますと、家の中でゴロゴロしたり、アニメ見たり、ドラマ見たり、バラエティ見たり、ネットサーフィンしたり、パソコンカタカタしたり、もう半ニートと言っていいほどの生活を送っていますwww

今日のブログは、つい最近パソコンカタカタをしている中で、まあプログラミングをしてる中でですね、自分の得た知識を自己満足、そしてメモ書きして残すという目的で、ここにアップしていきたいと思います。

前置きはここまでにして、つい最近Pythonというプログラミング言語OpenCVという画像処理によく使われるライブラリを使って遊んで見た活動報告なるものをしていこうと思います。


目次

最初に

PythonOpenCVのインストール方法をここに載せておきます。
なお対象はMacユーザー向けとなっています。
Pythonインストール方法
qiita.com
OpenCV導入方法
www.tcom242242.site

他のサイトもありますが、この2つのサイトを見ながら環境構築するのが一番だと感じます。

二値化

ではお遊び報告をしていきます。まずは二値化です
二値化とは濃淡のある画像を白と黒の二階調に変換する処理のことです。

以下がそのソースコードと結果です。

import cv2

# グレースケールで画像を読み込む(画像ファイル名は自分で指定してください)
img = cv2.imread("zingul.jpg",cv2.IMREAD_GRAYSCALE)

# しきい値で白黒二値化を行う
th=120
img[img > th] = 255
img[img < th] = 0

#ファイルに書き出す
cv2.imwrite("zingul-bin.jpg",img)

実行結果
実験画像
f:id:zyozer00:20170705225426j:plain
二値化後
f:id:zyozer00:20170705225501j:plain

授業でC++で作れと言われた時のプログラムはこれよりもっと書いた記憶があるのにPythonだとたったこの数行でできてしまう。すごい。。

エッジ検出

では同様にエッジ検出もしてみようと思います。
エッジ検出とは、デジタル画像の画像の明るさが鋭敏に、より形式的に言えば不連続に変化している箇所を特定するもの(Wikipediaさん参照)です。
簡単に言えばまあ輪郭検出のことです。

以下がソースコードと結果です。

import cv2

#グレースケールで画像を読み込む(画像ファイル名は自分で指定してください)
img = cv2.imread("zingul.jpg",cv2.IMREAD_GRAYSCALE)

#エッジ検出
canny_img = cv2.Canny(img,80,200) #第1引数に画像データ、第2引数と第3引数にエッジのしきい値を指定

canny_img = 255 - canny_img # ネガポジ反転

cv2.imwrite("zingul-edge.png", canny_img)

結果
f:id:zyozer00:20170705231625p:plain
あっ、僕の好きなAqoursのメンバーがぐにゃぐにゃに。。。。
しかしこんな数行でできてしまう。ほほう。。楽しいww

顔認識

言わずと知れた顔認識です。
OpenCVにはインストーディレクトリに学習済みの特徴データが多く用意されているらしく、人間だけでなく動物の顔もそのデータに含まれているそうなので、特に顔の特徴をもとに判別するアルゴリズムを意識しなくてもいいらしいです(初めて知った!)。

では早速遊んでみようと思います。

以下がソースコードと結果です。

import cv2

cacade_file = ("data/haarcascades/haarcascade_frontalface_alt.xml")


image_file = "face_sample.jpg"

#画像の読み込みとグレースケール化(一旦グレースケール化する理由は処理速度を少しでも早くするためのもの)
img = cv2.imread(image_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#顔認識器を生成
cascade = cv2.CascadeClassifier(cacade_file)
#顔認識器を使い、顔認識を実行
face_list = cascade.detectMultiScale(img_gray,minSize=(150,150))

if len(face_list) == 0:
    print("顔認識失敗")
    quit()

#認識した顔の部分に赤色の枠を描画
for(x,y,w,h) in face_list:
    print("顔の座標=",x,y,w,h)
    color= (0,0,255)
    pen_w = 8
    cv2.rectangle(img,(x,y),(x+w,y+h),color,thickness=pen_w)

#結果の画像を書き出す
cv2.imwrite("face_sample2.jpg",img)

結果
実験画像
f:id:zyozer00:20170705233820j:plain
顔認識後
f:id:zyozer00:20170705233845j:plain
それにしてもこのフリー素材のお姉さん綺麗だな。。。
ちなみにさっきまで使ってたアニメ画像でやると認識に失敗しますwww

OpenCVアニメのイラストも認識できるようになってwwww


以上お遊び報告でしたww