[예습] Mat operator
Color space conversion
- Color space(색공간)
- RGB
- HSV
- YCbCr
- void cvtColor(Mat src, Mat dst, int code, int dstCn =0)
- Convert an image frame one color space to another
- Mat src: 입력 matrix
- Mat dst: 결과 matrix
- int code: 변환할 Color space code
- CV_BGR2GRAY: RGB -> Grayscale
- CV_BGR2HSV: RGB -> HSV
- CV_BGR2YCrCb: RGB -> YCbCr
- CV_BGR2Lab: RGB -> Lab
- int dstCn: 결과 channel number, IF(=0) src와 dst에 의해 자동으로 결정
- void split(Mat src, Mat* mv)
- multi-channel을 single-channel로 분리
- Mat* mv: output array
- merge(InputArrayOfArray mv, OutputArray dst)
- 여러 개의 single-channel을 하나의 multi-channel로 합병
ROI
- Region of Interest(관심영역)
- 계산량 감소를 위해 범위를 축소
- ROI에서 값 변경시 original image에서도 영향
Rect rect(100, 30, 250, 300)
- 100, 30: 좌상단 좌표
- 250: width
- 300: height
Addition/Subtraction operation
- void add (Mat src1, Mat src2, Mat dst, Mat mask=noArray(), int dtype = -1)
- Mat src1, src2: operand
- Mat mask: optional operation mask(특정한 Roi 부분에서만 더할시 사용)
- int dtype: 결과영상의 depth(intensity level)
- IF dtype = -1 )
src1 = src2 = Intensity Level
- IF dtype = -1 )
- dst(l) = saturate(src1(l)+src2(l)) if mask(l) != 0
- saturate 함수: 결과가 표현할 수 있는 범위에 오도록 설정
- IF) src1, src2: 0-255 (8-bit single channel array)
src1(255) + src2(255) = dst(255)
src1(0) - src2(0) = dst(0)
- IF) src1, src2: 0-255 (8-bit single channel array)
- saturate 함수: 결과가 표현할 수 있는 범위에 오도록 설정
- void scaleAdd(Mat src1, double scale, Mat src2, Mat dst)
- dst(l) = scale * src1(l) + src2(l)
- void absdiff(Mat src1, Mat src2, Mat dst)
- dst(l) = saturate( | src1(l)-src2(l) | )
- void subtract(Mat src1, Mat src2, Mat dst, Mat mask=noArray(), int dtype = -1)
- dst(l) = saturate( src1(l) - src2(l) ) if mask(l) != 0
- absdiff과 절대값 차이
Threshold operation
- double threshold (Mat src, Mat dst, double thresh, double maxval, int type)
- 입력영상의 특정한 픽셀 값이 threshold 값 이상 혹은 이하의 경우, 해당 픽셀을 특정한 값으로 변환
- Maxval: Maximum value
-
Type = THRESH_BINARY
dst(l) = maximal (IF, src(l) > thresh)
= 0 (Otherwise) - Type:
- THRESH_BINARY
- THRESH_BINARY_INV : THRESH_BINARY 반대
- THRESH_TRUNC : Threshold 이상의 값 -> Threshold 값
- THRESH_TOZERO : Threshold 이하의 값 -> 0
- THRESH_TOZERO_INV : Threshold 이상의 값 -> 0
- 입력(src)은 grayscale 영상(one-channel)만 가능
- 전형적으로 grayscale 영상으로부터 binary image를 생성
- binary image: 각각의 픽셀 값이 0 혹은 1(0 혹은 255) 두 가지 값만 가질 수 있는 영상
- 입력영상의 특정한 픽셀 값이 threshold 값 이상 혹은 이하의 경우, 해당 픽셀을 특정한 값으로 변환
- void adaptiveThreshold (Mat src, Mat dst, double maxval, int adaptiveMethod, int thresholdType, int blockSize, double C)
- Local Thresholding
- adaptiveMethod
- ADAPTIVE_THRESH_MEAN_C : 주변 픽셀의 평균으로 threshold를 결정
- ADAPTIVE_THRESH_GAUSSIAN_C : 주변 픽셀의 가중치 평균으로 threshold를 결정
- thresholdType
- THRESH_BINARY
- THRESH_BINARY_INV
- blockSize: 인접을 결정하는 파라미터 (3, 5, 7)
- C : 평균이나 가중치 평균을 구한 값에서 특정한 상수 C 값을 뺀 값이 결과값(dst)
- dst(x,y) = Mean(blocksize x blocksize) - C or GAUSSIAN(blocksize x blocksize) - C
- void inRange(cv::InputArray src, cv::InputArray lowerb, cv::InputArray upperb, cv::OutputArray dst)
- Lowerb: lower boundary
- Upperb: upper boundary
- Between loweb, upperb: 255, Otherwise: 0
cvtColor(image, image, CV_BGR2YCrCb); inRange(image, Scalar(0, 133,77), Scalar(255, 173, 127), image);
Y: 0~255, Cr: 133~173, Cb: 77~127 에 해당하는 픽셀만 255로 변환
Others
Mat Copy
- Shallow copy
- Mat data structure consists of header and data
- the address is copied (포인터, 주소 공유)
- Use ‘=’
- Mat m_shallow = m1;
- Deep copy
- Use clone()
- 새로운 Matrix 생성과 copyTo() 수행
- Mat m_deep = m1.clone();
- copyTo (another way of copying matrix)
- void copyTo(OutputArray m, InputArray mask)
- m: 복사본이 저장될 행렬.
만약 *this 행렬과 크기 및 타입이 다르면 메모리를 새로 할당한 후 픽셀 값을 복사 - mask: *this와 같은 크기의 작업 마스크.
CV_8U 유형 마스크 행렬의 원소 값이 0이 아닌 좌표에서만 행렬 원소를 복사합니다
- m: 복사본이 저장될 행렬.
- void copyTo(OutputArray m, InputArray mask)
Mat Conversion
- Mat convertTo(OutputArray m, int rtype, double alpha=1, double beta=0)
- 입력 Array의 데이터 타입을 변환
- rtype: 변환시킬 type
- alpha, beta: 픽셀의 값을 변환 시켜주고 싶을 때 사용
- m(x, y) = saturate_cast
(alpha * (*this)(x,y) + beta) - (*this)(x,y): 원래 픽셀값
- saturate 함수: 결과가 표현할 수 있는 범위에 오도록 설정
- IF) src1, src2: 0-255 (8-bit single channel array)
src1(255) + src2(255) = dst(255)
src1(0) - src2(0) = dst(0)
- IF) src1, src2: 0-255 (8-bit single channel array)
- Mat setTo(InputArray value, InputArray mask=noArray()
- 특정한 메트릭스에 대해서 각각의 메트릭스의 픽셀 값들을 value로 치환
- Mask: 특정한 ROI에 대해서 수행, 설정이 없으면 default All
- Void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
- Dst(l) = saturate_cast<uchar> (|src(l)| * alpha + beta)
- 항상 type은 unsigned character
- convertTo와 매우 유사하나, 차이점: <uchar>, |src(l)|