본문 바로가기
openCV

[openCV] Mat연산자

by _eunji_ 2020. 1. 11.

컬러 공간 변환

void cvtColor(Mat src, Mat dst, int code, int dstCn=0)

  • src는 입력 영상, dst는 출력 영상, code는 컬러 변환 코드, dstCn은 출력 영상의 채널 수이다.
  • code는  CV_BGR2GRAY,VB_BGR2HSV,CV_BGR2YCrCb… 등으로 아래 표가 주요 컬러 변환 코드이다.
입력 영상(src) 변환 코드(code) 출력 영상(dst)
BGR cv2.COLOR_BGR2GRAY GRAY
GRAY cv2.COLOR_GRAY2BGR BGR
BGR cv2.COLOR_BGR2HSV HSV
HSV cv2.COLOR_HSV2BGR BGR
BGR cv2.COLOR_BGR2YCrCb YCrCb
YCrCb cv2.COLOR_YCrCb2BGR BGR
import cv2
import numpy as np

src = cv2.imread('../data/cookie1.jpg')

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
yCrCv = cv2.cvtColor(src,cv2.COLOR_BGR2YCrCb)

cv2.imshow('gray',gray)
cv2.imshow('hsv',hsv)
cv2.imshow('yCrCv',yCrCv)

cv2.waitKey()
cv2.destroyAllWindows()

cookie1 원본 이미지

 

 

영상 채널 분리와 병합

void split(Mat src, Mat* mv)

  • 입력 매트릭스가 여러 채널을 가졌다면 각각의 채널로 분리 하는 함수이다.
  • 즉, 다중 채널 영상을 리스트에 단일 채널 영상으로 분리하는 것이다.

Merge(intputArrayOfArray mv, OutputArray dst)

  • 단일 채널 영상을 병합하여 다중 채널 영상을 생성하는 것이다.
import cv2
import numpy as np

src = cv2.imread('../data/cookie1.jpg')

dst = cv2.split(src)

#openCV상 색상은 bgr순서이기 때문에 0-채널이 blue, 1-채널이 green, 2-채널이 red
cv2.imshow('blue',dst[0])
cv2.imshow('green',dst[1])
cv2.imshow('red',dst[2])

cv2.waitKey()
cv2.destroyAllWindows()

split 결과

import cv2
import numpy as np

src = cv2.imread('../data/cookie1.jpg')
b,g,r = cv2.split(src)
dst= cv2.merge([b,g,r])

cv2.imshow('dst',dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

 

관심 영역, ROI(Region iof interest)

selectROI(windowName, img[, showCrosshair[, fromCenter]]) 

  • windowName이라는 이름을 가진 윈도우에 img 를 출력하고 showCrosshair = True이면 선택 영역에 격자가 표시되고 fromCenter = True 이면 마우스 클릭 위치 중심을 기준으로 박스가 선택된다.
import cv2
import numpy as np

src = cv2.imread('../data/cookie1.jpg')
roi = cv2.selectROI(src)

#roi[0]은 x, roi[1]은 y, roi[2]는 가로 크기, roi[3]은 세로 크기
img = src[roi[1]:roi[1]+roi[3],roi[0]:roi[0]+roi[2]]

cv2.imshow('img',img)

cv2.waitKey()
cv2.destroyAllWindows()

 

연산

Addition/Subtraction operation

Void add(Mat src1, Mat src2, Mar dst, Mat mask=noArray(), int dtype=-1)

Saturate(src1+src2) 결과가 0~255사이 값으로 나오게 만드는 함수

          

Void add(Mat src1, double scale, Mat src2, Mat dst)

Void absdiff(Mat src1, Mat src2,Mat dst) => subtractsaturate할 때 절댓값 씌우지 않고 absdiff는 절댓값을 씌운다

Void subtract(Mat src1, Mat src2, Mar dst, Mat mask=noArray(), int dtype=-1)

 

import cv2
import numpy as np

src = cv2.imread('../data/cookie1.jpg',cv2.IMREAD_GRAYSCALE)
src2 = np.zeros(shape=(300,300), dtype=np.uint8) + 100

dst1=src+src2 #덧셈 결과가 255를 넘는 경우 256으로 나눈 나머지를 계산
dst2=cv2.add(src,src2) # 덧셈 결과가 255를 넘는 경우 255로 계산


cv2.imshow('dst1',dst1)
cv2.imshow('dst2',dst2)

cv2.waitKey()
cv2.destroyAllWindows()

 

 

Threshold operation

Double threshold (Mat src, Mat dst, double thresh,double maxval, int type)

입력 영상이 주어져 있고 특정한 픽셀의 값이 임계값 이상일 때 해당 픽셀을 특정한 값으로 변환시켜서 dst에 저장

Type 5가지

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

void adaptiveThreshold(Mat src, Mat dst, double maxval,int adaptiveMethod,int thresholdtype, int blocksize , double C)

  • 일정한 크기를 갖는 이미지 구역마다 이진화를 적용시키는 것
  • Blocksize : 인접한 박스의 크기(3,5,7,)
  • C : 평균이나 가중치에서 상수 C를 뺀 값

 

void inRange(cv::inputArray src, cv::inputArray lowerb, cv::inputArray upperb, cv::OutputArray dst)

상한값과 하한값 사이이면 흰색, 아니면 검정색을 출력하여 흑백 영상을 만드는 것

 

Mat convertTo(OutputArray m, int rtype,double alpha=1,double beta=0)

행렬의 타입을 변경

 

Mat setTo(InputArray value InputArray mask=noArray())

행렬의 원소 값을 변경

 

Void convertScaleAbs(InputArray src, OutputArray dst,double alpha=1,double beta=0)

행렬 src의 요소에 alpha 값 곱한 후 beta값을 더한 절댓값에 saturate_cast<uchar>해서 dst에 저장

'openCV' 카테고리의 다른 글

[openCV] 메모리 관리 및 픽셀 엑세스  (0) 2020.01.11
[openCV] Drawing함수  (0) 2020.01.11
[openCV] openCV기초  (0) 2020.01.07
[openCV] 색공간의 이해  (0) 2020.01.06
[openCV] 디지털 영상과 디지털 비디오  (0) 2020.01.06

댓글