PythonでOpenCVを使用して画像処理を行う方法まとめ

python Python

PythonでOpenCVを使用して基本的な画像処理をする方法をまとめました。

環境

  • Python 3.6.3
  • OpenCV 3.4.1

処理

画像の読込・表示

import cv2

# 画像の読込(numpy.ndarrayで読み込まれる)
image = cv2.imread('img/Lena.jpg')
print(type(image))
## --------> <class 'numpy.ndarray'>

# 画像のWidth, Height, チャンネル数を取得
height, width, ch = image.shape
print(f"width={width}, height={height}, ch={ch}")
## --------> width=512, height=512, ch=3

# 画像を表示
cv2.imshow("image", image)
cv2.waitKey(0) #何かしらのキーが押されるまで待つ
cv2.destroyAllWindows() #すべてのWindowを破棄

画像の保存

import cv2

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# 画像の保存
cv2.imwrite('img/Wrote_Lena.jpg', image)

画像のリサイズ

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# 画像のWidth, Height, チャンネル数を取得
height, width, ch = image.shape
print(f"width={width}, height={height}, ch={ch}")
## --------> width=512, height=512, ch=3

# リサイズ
# (Width, Height)で渡す。ndarrayで指定する順序と逆!!
size = (200,100)
resized_image = cv2.resize(image, size)
height, width, ch = resized_image.shape
print(f"width={width}, height={height}, ch={ch}")
## --------> width=200, height=100, ch=3

# 画像を表示
cv2.imshow("image", resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の切り抜き

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# 画像切り取り([y1:y2-1,x1,x2-1,::])
slice_image = image[50:400,100:425,::]

# 画像を表示
cv2.imshow("image", slice_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

グレースケールへの変換

import cv2

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# グレースケールへの変換(1chになる)
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 画像を表示
cv2.imshow("image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

HSVへの変換

## HSV(Hue(色相), Saturation(彩度), Value(明度))

import cv2

# 画像の読込(numpy.ndarrayで読み込まれる)
image = cv2.imread('img/Lena.jpg')

# HSVへの変換
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
print(hsv_image)
## --------> [[[  3 110 225]
## --------> [  3 110 224]
## --------> [  3 111 223]
## --------> ...

RGBのヒストグラム表示

import cv2
import matplotlib.pyplot as plt
%matplotlib inline

import cv2

# 画像の読込(numpy.ndarrayで読み込まれる)
image = cv2.imread('img/Lena.jpg')

# ヒストグラム表示
color_names = ['blue', 'green', 'red']
for i, j in enumerate(color_names):
    hist = cv2.calcHist([image], [i], None, [256], [0,256])
    plt.plot(hist, color=j)

グレースケールのヒストグラム表示

import cv2
import matplotlib.pyplot as plt
%matplotlib inline

# 画像の読込(グレースケールで読込)
image = cv2.imread('img/Lena.jpg', 0)

# ヒストグラム表示
hist = cv2.calcHist([image], [0], None, [256], [0,256])
plt.plot(hist)

γ変換(画像の明るさ変化させる)

import cv2
import numpy as np

# 画像の読込(numpy.ndarrayで読み込まれる)
image = cv2.imread('img/Lena.jpg')

## γ値の定義(1より小さいと暗く、1より大きいと明るくなる)
gamma = 1.5

# ルックアップテーブルの生成
look_up_table = np.zeros((256,1), dtype=np.uint8)
for i in range(256):
    look_up_table[i][0] = 255* (float(i)/255) ** (1.0 / gamma)

# γ変換後の画像取得
image_gamma = cv2.LUT(image, look_up_table)

# 画像を表示
cv2.imshow("image", image_gamma)
cv2.waitKey(0)
cv2.destroyAllWindows()

γ=0.5

γ=1.0

γ=1.5

2値化

import cv2

# 画像の読込(グレースケール読込)
image = cv2.imread('img/Lena.jpg', 0)

# 閾値を指定
threshhold = 150

# 2値化(retvalに使用した閾値が、binary_imageに2値化した画像が入る)
# この場合はthreshholdを指定しているのでretvalに同じ値が入るが、
# cv2.THRESH_OTSU(大津の二値化)等の自動でthreshholdを算出する場合にretvalの値を使う。
retval, binary_image = cv2.threshold(image, threshhold, 255, cv2.THRESH_BINARY)

# 画像を表示
cv2.imshow("image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

アフィン変換(平行移動)

import cv2
import numpy as np

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# 移動量指定
dx, dy = 80, 80

# アフィン変換(平行移動)
affine_mat = np.float32([[1,0,dx], [0,1, dy]])
height, width = image.shape[:2]
image_affine = cv2.warpAffine(image, affine_mat, (width, height))

# 画像を表示
cv2.imshow("image", image_affine)
cv2.waitKey(0)
cv2.destroyAllWindows()

アフィン変換(回転)

import cv2
import numpy as np

# 画像の読込
image = cv2.imread('img/Lena.jpg')

# 中心位置取得
center = tuple(np.array([image.shape[1] * 0.5, image.shape[0] * 0.5]))

# 回転させたい角度°(ラジアンではない)
angle = 90.0

# 拡大比率
scale = 1.0

# 回転変換行列の算出![edges.png](https://qiita-image-store.s3.amazonaws.com/0/294506/5d919d71-d994-ab16-28d2-c0217b975ff0.png)

affine_mat = cv2.getRotationMatrix2D(center, angle, scale)

# アフィン変換(回転)
height, width = image.shape[:2]
rotation_image = cv2.warpAffine(image, affine_mat, (width, height), flags=cv2.INTER_CUBIC)

# 画像を表示
cv2.imshow("image", rotation_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

エッジ検出(Canny)

### エッジ検出(Canny)

import cv2
import numpy as np

# 画像の読込
image = cv2.imread('img/Lena.jpg')

edges = cv2.Canny(image,100,200)

# 画像を表示
cv2.imshow("image", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCVのバージョン確認

import cv2

print(cv2.__version__)
## --------> 3.4.1

コメント