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 # 回転変換行列の算出 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
コメント