画像データ処理の基本-OpenCV


Install OpenCV
pip install opencv-python
OpenCVはオープンソースの非専用コンピュータライブラリです.その他言語(C++、C、Java...)ジェジュンでも使えますが、画像処理の高度な機能を実現しているので、読み込みや使用が容易です.
OpenCV tutorial
上のリンクはPythonチュートリアルページのリンクです.さまざまな高度な例を紹介した.その中の画像から見ると特定の色の領域のみを抽出する例です.
前述の例示的なプレゼンテーションでは、画像は最終的に[width、Height、Channel]形状を有する配列であり、コンピュータのビジョンは最終的にこのような配列形式のデータ(?)を処理する.表示されます.
画像の内容に関心のある部分に特定の色がある場合は、この情報によって必要な部分と背景を区別し、関心のある部分だけを分けることができます.
この例では、画像の検索や青の検索を容易にするために、BGR(RGB)からHSVに色空間を変換し、その色に一致する領域のみを表示する.
読んでいるとおかしいです.
BGR???
OpenCVは、RGBではなくBGRを逆方向に使用します.

ソース:https://docs.opencv.org/master/df/d9d/tutorial_py_colorspaces.html
次のコードはOpenCVチュートリアルのWebサイトの例です.
import cv2 as cv
import numpy as np

cap = cv.VideoCapture(0)

while(1):
    # Take each frame
    _, frame = cap.read()
    
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
        
cv.destroyAllWindows()
しかし、私たちは知っています.
ビデオデータとか...いいえ...
だから私たちは....私はウェブサイトの上のピクチャーを切り取ります!!
変形のコードは以下のようになります.
import os
import cv2 as cv # 눈치 챘겠지만 OpenCV를 import 할 때 이름을 cv2라고 해줘야한다.
import numpy as np
from  matplotlib import pyplot as plt
%matplotlib inline

img_path = os.getcwd() + '/python_image_proc/data/practice.png'
img = cv.imread(img_path)

# Convert BGR to HSV
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

# define range of blue color in HSV
lower_blue = np.array([100,100,100])
upper_blue = np.array([130,255,255])

# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)

# Bitwise-AND mask and original image
res = cv.bitwise_and(img, img, mask=mask)

# BGR은 OpenCV에서의 RGB표현이니 matplotlib에서 표현하려면 RGB로 다시 바꿔야한다.
# plt가 기본적으로 grid를 그려서 그래프를 표현하기 때문에 grid를 False로 설정해준다.
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.grid(False) 
plt.show()

plt.imshow(cv.cvtColor(mask, cv.COLOR_BGR2RGB))
plt.grid(False)
plt.show()

plt.imshow(cv.cvtColor(res, cv.COLOR_BGR2RGB))
plt.grid(False)
plt.show()
上記の例を説明します.cv.imread()"Loads an image from a file."
ファイルから画像を読み込む関数.
リンク cvtColor()"Converts an image from one color space to another."
カラー空間を変換する関数です.
リンク cv.inRange()私たちが望んでいる部分だけを抽出する仕事です.
適用(low blue,upper blue)は、対応する画素が1であり、対応しない画素が0である配列を返します.
# 수치로 파란색 부분을 정의
lower_blue = np.array([100,100,100])
upper_blue = np.array([130,255,255])
# 위 값들을 기준으로 이미지에서 마스크를 생성한다.
mask = cv.inRange(hsv, lower_blue, upper_blue)
cv.bitwise_and()"computes bitwise conjunction of the two arrays (dst = src1 & src2) Calculates the per-element bit-wise conjunction of two arrays or an array and a scalar."
# Bitwise-AND mask and original image
res = cv.bitwise_and(img, img, mask=mask)
元の画像とmaskの値をAND演算し、必要な部分を返します.
2枚の画像を受け取ってANDビット演算を行い、上のコードを見るとこの機能(?)必要ではないので、2枚とも同じ画像(img,img)を入れて、最終的には同じ画像が現れます.でもシートパックを一緒にして、該当するエリアだけ開けます.
リンク cvtColor()BGRはOpenCVで使用されるRGB方式であり、MatplotlibはRGB方式で返さなければならない.
plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
plt.grid(False) 
plt.show()
plt.imshow(cv.cvtColor(mask, cv.COLOR_BGR2RGB))
plt.grid(False)
plt.show()
plt.imshow(cv.cvtColor(res, cv.COLOR_BGR2RGB))
plt.grid(False)
plt.show()

リファレンス

  • OpenCV公式ホームページ
  • 上の例
  • チュートリアル
  • OpenCV github