9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenCVのチュートリアルをやる

Last updated at Posted at 2019-01-11

#前書き
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を使った画像の表示方法も学びます

読み込んで、表示するところまで。
おそらく後で、加工して保存したりするからここではスキップ。

sample.py
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()
image.png NSFW [レナさん](https://gigazine.net/news/20090618_lenna/)

基本的な処理

ここはしっかりやりますかね。

セルの色の取得

BGR値です。index = 0が「青」表してるということです。RGBじゃないのね。

sample.py
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)

sample.py
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()
image-2.png

肩口にキスマークならぬ、唇コピペしたらセクシーになるかと思ったんだけどな。。。怖い。

画像の色成分の分割と統合

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()

Green_と_Red_と_image.png

BGRだからもっと緑なら緑色になるのかと思ったら、抽出した値でグレースケール画像にしてるのね。

そういうことなら

sample.py
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()
image-3.png

イメージ通りの画像が出てきた。

画像の境界領域を作る(パディング)

先程の唇画像を。

image-2.png
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()
image-4.png

唇に枠が付きました。

#感想
画像処理は目に見えて結果が見えるから面白いっすね。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?