Help us understand the problem. What is going on with this article?

Opencvの使い方まとめ

Opencvで画像処理

pythonの画像処理ライブラリであるopencvは画像処理・画像解析および機械学習等の機能を持ちます

前提となる知識

numpyです

実行構成

.
├── ./data
│   ├── ./data/1.jpg
│   ├── ./data/2.jpg
│   └── ./data/3.jpg
└── ./sample.py

スクリーンショット 2020-02-14 10.57.31.png

このような構成で実行していきます

import cv2
import numpy as np

を前提に書いていきます

画像の読みこみ

imread()を利用する
引数(パラメータ)としては

パラメータ 説明
filename 読み込む画像のファイル名
falg 0ならRGB(3bit)、1ならグレースケール(1bit)、-1ならRGBA(4bit)の画像として読み込み
img NumPy配列(読み込んだ画像の画素値を格納)

読み込んだ画像の画素値はNumPy配列に格納されます

実装例

img = cv2.imread('./data/1.jpg')
print(img)
print(img.shape)

#以下は出力
[[[177 191 210]
  [176 190 209]
  [175 189 208]
  ...
  [164 184 209]
  [164 184 209]
  [164 184 209]]

 [[177 191 210]
  [176 190 209]
  [175 189 208]
  ...
  [164 184 209]
  [164 184 209]
  [164 184 209]]

 [[177 191 210]
  [176 190 209]
  [175 189 208]
  ...
  [164 184 209]
  [164 184 209]
  [164 184 209]]

 ...

 [[ 44  40  35]
  [ 38  34  29]
  [ 49  45  40]
  ...
  [141 170 214]
  [141 170 214]
  [141 170 214]]

 [[ 45  41  36]
  [ 39  35  30]
  [ 50  46  41]
  ...
  [139 168 212]
  [139 168 212]
  [139 168 212]]

 [[ 46  42  37]
  [ 41  37  32]
  [ 53  49  44]
  ...
  [138 167 211]
  [138 167 211]
  [138 167 211]]]
(853, 1280, 3)

height:853
width: 1280
channels: 3
ということがわかります

今回はパラメータを入れてないのでRGBで表現されています
よってchannelsは3ということになります

次はパラメータを入れてみます

gray = cv2.imread('./data/1.jpg', 0)
print(gray)
print(gray.shape)

#以下は出力
[[195 194 193 ... 189 189 189]
 [195 194 193 ... 189 189 189]
 [195 194 193 ... 189 189 189]
 ...
 [ 39  33  44 ... 180 180 180]
 [ 40  34  45 ... 178 178 178]
 [ 41  36  48 ... 177 177 177]]
(853, 1280)

画像の書き込み

適当にnumpy配列を指定してあげて画像を書き込んでみます


img = np.array([[[36, 87, 237], [ 76, 7, 34], [24, 72, 3]],
                     [[0, 0 ,0], [255, 255, 255], [15, 15, 15]],
                     [[164, 73, 63], [ 36, 28, 27], [0, 3, 0]]])


cv2.imwrite("out.jpg", img)

out.jpg
height:3
width:3
なので小さすぎて見えませんが上の四角です(笑)
これは3×3の9個生成されています

スクリーンショット 2020-02-14 11.31.50.png

色変換

img = cv2.imread('./data/1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('out.jpg',gray)

out.jpg

スケーリング(拡大・縮小)・回転

内容の計算式などは少し難しいので理解できなければ手順として覚えましょう
スクリーンショット 2020-02-14 11.43.26.png
スクリーンショット 2020-02-14 11.50.57.png
を利用することによりできる
実装例


img = cv2.imread('./data/1.jpg')


# 回転の中心を求める centerにはタプルで入れる
height = img.shape[0]                         
width = img.shape[1]  
center = (int(width/2), int(height/2))


# 回転角度
angle = 45.0

# スケール
scale = 1.0

# 回転変換行列の算出
trans = cv2.getRotationMatrix2D(center, angle, scale)

# アフィン変換
rot_img = cv2.warpAffine(img, trans, (width,height))

cv2.imwrite('out.jpg',rot_img)

アフィン変換とは幾何学の分野で、ある図形を回転させたり引き延ばしたりする変換です
ここでスケールも変換することもできます

1.jpg
out.jpg
美しいアフィン変換ですね

またアフィン変換の理論や計算に関してqiitaでまとめたいと思います!

最後に

まだまだopencvでできることはありますので、また追加していきます
これからもどんどん挙げていきます
人工知能に興味のある方、大学生、大学院生、社会人、どなたでもお話ししましょう!!
twitter

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした