#前書き
OpenCVの開発環境は作ったので、実際になにか動かしてみます。
今回はOpenCV-Pythonのチュートリアル、OpenCV-Python Tutorialsの**日本語版**をやっていきます。
多少アレンジすると思う。
シリーズ
#開発環境
機種名 : MacBook Pro
OS : Mojave 10.14.2
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB
python系
% pip freeze
numpy==1.15.4
opencv-python==4.0.0.21
画像データ
神奈川大学から画像データをお借りしてやります。
神奈川工科大学 情報学部 情報工学科 信号処理応用研究室
#本題
画像を扱う
ここでは画像ファイルを読み込む方法,表示する方法,保存する方法を学びます
以下の関数の使い方を学びます : cv2.imread(), cv2.imshow() , cv2.imwrite()
さらに,Matplotlibを使った画像の表示方法も学びます
読み込んで、表示するところまで。
おそらく後で、加工して保存したりするからここではスキップ。
import numpy as np
import cv2
# 読み込み
## cv2.IMREAD_COLOR : カラー画像として読み込む.画像の透明度は無視される.デフォルト値
## cv2.IMREAD_GRAYSCALE : グレースケール画像として読み込む
## cv2.IMREAD_UNCHANGED : アルファチャンネルも含めた画像として読み込む
img = cv2.imread('Lenna.bmp',cv2.IMREAD_UNCHANGED)
# 表示
# Windowのサイズ可変もできるみたいだけど
# 今回は特に気にしないから放置
## window名,対象画像
cv2.imshow('image',img)
## 何かしらのキー入力があるまで待機
cv2.waitKey(0)
## すべてのWindowを閉じる
cv2.destroyAllWindows()
基本的な処理
ここはしっかりやりますかね。
セルの色の取得
BGR値です。index = 0が「青」表してるということです。RGBじゃないのね。
import numpy as np
import cv2
# カラー画像読み込み
img = cv2.imread('Lenna.bmp')
# BGR値
px = img[100,100]
print ("BGR:" + str(px))
# 青
blue = img[100,100,0]
print("青:" + str(blue))
# よりよい画素へのアクセス方法と変更方法
red = img.item(100,100,2)
print ("赤:" + str(red))
print ("属性値:" + str(img.shape))
print ("合計画素数:" + str(img.size))
print ("データ型:" + str(img.dtype))
% python sample.py
BGR [ 84 45 129 ]
青 84
赤 129
属性値 (256, 256, 3)
合計画素数 196608
データ型 uint8
画像中の注目領域(ROI:Region of Interest)
import numpy as np
import cv2
# カラー画像読み込み
img = cv2.imread('Lenna.bmp')
# 指定領域で切り抜いて
x1 = 130
y1 = 170
x2 = 160
y2 = 185
lips = img[y1:y2, x1:x2]
# 指定範囲に貼り付け(サイズが違うと怒られた。)
img[y1+50:y2+50, x1:x2] = lips
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
肩口にキスマークならぬ、唇コピペしたらセクシーになるかと思ったんだけどな。。。怖い。
画像の色成分の分割と統合
import numpy as np
import cv2
# カラー画像読み込み
img = cv2.imread('Lenna.bmp')
# bgr分割
b,g,r = cv2.split(img)
cv2.imshow('Blue',b)
cv2.imshow('Green',g)
cv2.imshow('Red',r)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
BGRだからもっと緑なら緑色になるのかと思ったら、抽出した値でグレースケール画像にしてるのね。
そういうことなら
import numpy as np
import cv2
# カラー画像読み込み
img = cv2.imread('Lenna.bmp')
# bgの成分を0に
img[:,:,0] = 0
img[:,:,1] = 0
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
イメージ通りの画像が出てきた。
画像の境界領域を作る(パディング)
先程の唇画像を。
import numpy as np
import cv2
# カラー画像読み込み
img = cv2.imread('Lenna.bmp')
# 指定領域で切り抜いて
x1 = 130
y1 = 170
x2 = 160
y2 = 185
lips = img[y1:y2, x1:x2]
# 唇画像に縁をつける
# BORDER_CONSTANT:単一色の境界を追加します.次の引数で色の指定をします.
BLUE = [255,0,0]
constant = cv2.copyMakeBorder(lips,3,3,3,3,cv2.BORDER_CONSTANT,value=BLUE)
# 指定範囲に貼り付け
print(constant.shape)
img[y1+50-3:y2+50+3, x1-3:x2+3] = constant
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
唇に枠が付きました。
#感想
画像処理は目に見えて結果が見えるから面白いっすね。