LoginSignup
0
1

More than 3 years have passed since last update.

OpenCVを用いた画像処理の基礎【まとめ】Python

Posted at

opencvをimportして使えるようにする

import cv2
import numpy as np
from matplotlib import pyplot as plt

・Opencvによる画像の読み込み

opencvによる画像の読み込み
img = cv2.imread('apple-picuture.jpg')

・OpenCVによって扱われる画像はnumpyアレーで(高さ、横幅、カラー)の順に格納されている

img = cv2.imread('apple-picuture.jpg')
img.shape
>>>(320,320,3)

・OpenCVによって扱われる画像はBGRの順番で画素値が格納されている

img = cv2.imread('apple-picuture.jpg')
img[0][0]
>>>(121,23,56) (Blue,Green,Red)の順番

・OpenCVによる画像の表示
画像が表示されたらその画像をクリックしてどこかのキーボードを入力するとウィンドウが閉じます

# 画像を表示する
img = cv2.imread('apple-picuture.jpg')
cv2.imshow('image',img)

# キーボード入力を待つ
cv2.waitKey(0)

# すべてウィンドウを閉じる
cv2.destroyAllWindows()

・OpenCVによる画像の保存
今回はtest.jpgという名前で同じ階層に画像を保存
うまくいくとTrueと出力される

img = cv2.imread('apple-picuture.jpg')
# osをimport
import os
#画像の保存
cv2.imwrite('test.jpg',img)
>>>True

・OpenCVによるリサイズ

img = cv2.imread('apple-picuture.jpg')
img_resize = cv2.resize(img,(160,200))
img_resize.shape
>>>(200, 160, 3) (高さ,横幅,チャンネル数)

・OpenCVによるリサイズの引数について
cv2.resize()の引数は以下のようになっています
cv2.resize(src, dsize, fx, fy, interpolation)
fx,fyは画像を何倍にするのかを表します
例えば縦を1.5倍、横幅を2倍にするならば①のようになります
interpolationはデフォルトでINTER_LINEARになっていますが他にも
・INTER_NEAREST – 最近傍補間
・INTER_AREA – ピクセル領域の関係を利用したリサンプリング。画像を大幅に縮小する場合、モアレを避けることができる手法
などがあります②

リサイズの引数について
img = cv2.imread('apple-picuture.jpg')
#①
img_resize = cv2.resize(img,(img.shape[0],img.shape[1]),1.5,2)
>>>(480,640,3) 元は(320,320,3)

#② サイズは元のまま
img_area = cv2.resize(img,(320,320),interpolation=cv2.INTER_AREA)

・グレースケールへの変換
通常画像は3チャンネルのRGBで表されますが、グレースケールでは1チャンネルで表されます。
メリットとしては演算が3分の1になることや、2値化がやりやすいということです
ちなみにグレースケールは以下のような計算式になっています
Gray = 0.2989R + 0.5870G + 0.1140B

グレースケールへの変換
#1つ目
img = cv2.imread('apple-picuture.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#補足(HSVへの変換)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

#2つ目(画像を読み込むときに2つ目の引数に0を入れるだけ)
img = cv2.imread('apple-picuture.jpg',0)

・ヒストグラム均一化
ヒストグラム均一化によって画像をより明暗をはっきりとした画像に変換できます
今回はグレースケールで表された画像に対してヒストグラム均一化を行っています
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
channnels : グレースケールの場合は0
histSize : ビンの数を表していて、全画素値を対象とするのであれば [256] を指定します.
ranges : ヒストグラムを計測したい画素値の範囲を表す RANGE です.通常は [0,256] を指定します

ヒストグラム均一化
img = cv2.imread('apple-picuture.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])

・γ(ガンマ)変換
γ変換とは画像の明るさの変換方法のこと
Y = 255 x ( Y ÷ 255)( 1 / γ)
これがγ変換の式になっており
γが1の時は Y=x となり直線(下記の画像の1)
γが大きくなれば明るい画像、小さくなれば暗い画像になります

ヒストグラム均一化
img = cv2.imread('apple-picuture.jpg',0)
def create_gamma_img(gamma, img):
  gamma_cvt = np.zeros((256,1), dtype=np.uint8)
  for i in range(256):
    gamma_cvt[i][0] = 255*(float(i)/255)**(1.0/gamma)
  return cv2.LUT(img, gamma_cvt)

・2値化
2値化とはある閾値を越えると255,小さいと0という風にして画像をモノクロにする手法です。
1つ目は通常使われる2値化の方法で、retには閾値が格納されています
2つ目は相対的に明るいか暗いかを判断して2値化してくれる方法です

2値化
img = cv2.imread('apple-picuture.jpg',0)
#1つ目
ret , img_0 = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
#2つ目
img_ada = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,1)
0
1
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
0
1