勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

OpenCVやってみる-3. 色々いじる

今回は、画像に色々手を加えてみたいと思います。

参考 :

OpenCV-Pythonチュートリアル — OpenCV-Python Tutorials 1 documentation

Python OpenCVの基礎 resieで画像サイズを変えてみる - Pythonの学習の過程とか

画像切り出し

シール1枚分の領域を切り出してみました。

>>> img3 = img[500:1000, 500:1000]
>>> img3.shape
(500, 500, 3)
>>> cv2.imshow('image3', img3)
>>> cv2.waitKey(0)

f:id:nokixa:20210319070922p:plain

resize色々

resizeで、補間方法のオプションがあるので試してみます。

>>> v,h = img.shape[:2]
>>> size = (int(h/10), int(v/10))
>>> img4 = cv2.resize(img, size, interpolation=cv2.INTER_NEAREST)
>>> cv2.imshow('image4', img4)
>>> cv2.waitKey(0)
13
>>> img4 = cv2.resize(img, size, interpolation=cv2.INTER_LINEAR)
>>> cv2.imshow('image4', img4)
>>> cv2.waitKey(0)
13
>>>
>>> img4 = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
>>> cv2.imshow('image4', img4)
>>> cv2.waitKey(0)
13
>>> img4 = cv2.resize(img, size, interpolation=cv2.INTER_CUBIC)
>>> cv2.imshow('image4', img4)
>>> cv2.waitKey(0)
13
>>> img4 = cv2.resize(img, size, interpolation=cv2.INTER_LANCZOS4)
>>> cv2.imshow('image4', img4)
>>> cv2.waitKey(0)
13
>>>

f:id:nokixa:20210319073135p:plain
INTER_NEARESTで

f:id:nokixa:20210319073334p:plain
INTER_LINEARで

f:id:nokixa:20210319073528p:plain
INTER_AREAで

f:id:nokixa:20210319073615p:plain
INTER_CUBICで

f:id:nokixa:20210319073719p:plain
INTER_LANCZOS4で

INTER_AREAの設定だと、他の設定に比べてなめらかな画像になっているように見えます。

  • シールの枠や点数の輪郭のぎざぎざが少ない
  • 下のほうの記入枠の細い線がちゃんと見える (他の設定は線の途中が切れている)

ぼかされているとも言えるのかも。

色空間の変換

上記の画像を使います。
まず、最初の読み込みではRGBフォーマットになっています。
読み込みデータの形状は、(垂直サイズ, 水平サイズ, 色)となっています。

>>> img4.shape
(403, 302, 3)

色は、BGRの順番になっているようです。

>>> cv2.imshow('image4_0', img4[:,:,0])
>>> cv2.waitKey(0)
13
>>> cv2.imshow('image4_1', img4[:,:,1])
>>> cv2.waitKey(0)
13
>>> cv2.imshow('image4_2', img4[:,:,2])
>>> cv2.waitKey(0)
13

f:id:nokixa:20210322072622p:plain

色フォーマットの変換をしてみます。
cv2.cvtColor()関数で変換ができます。グレースケールとHSV空間への変換を試してみたいと思います。

>>> img_gray = cv2.cvtColor(img4, cv2.COLOR_BGR2GRAY)
>>> img_gray.shape
(403, 302)
>>> cv2.imshow('Gray image',img_gray)
>>> cv2.waitKey(0)
13
>>> 

f:id:nokixa:20210325075025p:plain

>>> img_hsv = cv2.cvtColor(img4, cv2.COLOR_BGR2HSV)
>>> img_hsv.shape
(403, 302, 3)
>>> cv2.imshow('Hue',img_hsv[:,:,0])
>>> cv2.waitKey(0)
13
>>> cv2.imshow('Saturation',img_hsv[:,:,1])
>>> cv2.waitKey(0)
13
>>> cv2.imshow('Value',img_hsv[:,:,2])
>>> cv2.waitKey(0)
13
>>>

f:id:nokixa:20210325075925p:plain

HSVの各成分の意味は、

HSVの各成分はそれぞれ,Hueが色相,Saturation(Chroma)が彩度,Value(Lightness)が明度を意味します。

とのことです。
今回の画像ではちょっと分かりにくいですね…

labs.eecs.tottori-u.ac.jp

図形の描画

直線、円、矩形を描画してみます。
使うのは、cv2.line()cv2.circle()cv2.rectangle()関数です。

直線

点(10,10)から(290,10)まで、真っ青で3pxの太さの線を描画

  • 座標は、(水平, 垂直)の順、画像の左上が原点となる
  • 上記の座標では、水平な線が描画される
>>> img4_drawing = cv2.line(img4, (10,10), (290,10), (255,0,0),3)

f:id:nokixa:20210331224437p:plain
直線の描画

点(20,20)を中心として半径10、緑色の円を描画

  • 最後の引数は線の太さ、-1を指定すると塗りつぶしになる
>>> img4_drawing = cv2.circle(img4_drawing, (20,20), 10, (0,255,0), -1)

f:id:nokixa:20210331225426p:plain
円の描画

矩形

左上の角の座標が(50,50)、右下の角の座標が(100,100)、赤で5pxの太さの矩形を描画

  • この記事の最初のほうでやったシール1枚の領域を矩形で囲みます。
>>> img4_drawing = cv2.rectangle(img4_drawing, (50,50), (100,100), (0,0,255), 5)

f:id:nokixa:20210331230349p:plain
矩形の描画

ここまで

まだまだやってみたいことはありますが、一旦ここまでにします。
次回は、フィルタをかけたりしてみたい。
だんだん画像処理感が出てくると思います。