Threshold : 이미지를 이진화 하여 흑/백을 나누는 기술
threshold 함수에는 cv.threshold 와 cv.adaptivethreshold 가 있다.
기본임계처리
cv.threshold(Mat src, Mat dst, double thresh, double maxval, int type)
Mat src : input image
Mat dst : output image
double thresh : 임계값
double maxval : 임계값을 넘었을 때의 value
int type : threshold type
[threshold type]
THRESH_BINARY : 픽셀 값이 threshold 보다 크면 maxval(255 흰색), 아니면 0(검정)
THRESH_BINARY_INV :픽셀 값이 threshold 보다 크면 0, 아니면 maxval
THRESH_TRUNC : 픽셀 값이 threshold 보다 크면 임계값, 아니면 픽셀 값 그대로 할당
THRESH_TOZERO : 픽셀 값이 threshold 보다 크면 픽셀값 그대로, 작으면 0 할당
THRESH_TOZERO_INV : 픽셀 값이 threshold 보다 크면 0, 작으면 픽셀값 그대로
적응임계처리
기본 임계처리는 임계값을 이미지 전체에 적용하여 처리하기 때문에 하나의 이미지에 음영이 다르면 일부 영역이 모두 흰색 또는 검정색으로 보여지게 되므로 적응임계처리를 이용한다. (이미지의 작은 영역별로 thresholding)
cv.adaptiveThreshold(Mat src, Mat dst, double maxval, int adaptiveMethod, int thresholdType, int blockSize, double C)
Mat src : input image
Mat dst : output image
double maxval : 임계값을 넘었을 때의 value
int adaptiveMethod : 임계값을 결정하는 계산 방법
int thresholdType : threshold type (THRESH_BINARY, THRESH_BINARY_INV)
int blockSize : thresholding을 적용할 영역의 사이즈(3, 5, 7,9 같은 홀수를 사용해야 한다.)
double C : 평균에서 뺄 상수값
[adaptive method]
ADAPTIVE_THRESH_MEAN_C : 적용할 픽셀 (x,y)를 기준으로 (blocksize * blocksize)안에 있는 픽셀값의 평균 - C 값을 문턱값으로 설정
ADAPTIVE_THRESH_GAUSSIAN_C : 적용할 픽셀 (x,y)를 기준으로 (blocksize * blocksize)안에 있는 가우시안 윈도우 기반 가중치의 합 - C 값을 문턱값으로 설정
#include "cv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(){
Mat image = imread("lena.png");
cvtColor(image,image,CV_BGR2GRAY);
Mat dst1,dst2;
adaptiveThreshold(image,dst1,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,7,10);
adaptiveThreshold(image,dst2,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,10);
imshow("dst1",dst1);
imshow("dst2",dst2);
imshow("input",image);
waitKey(0);
}
Inrange
범위를 설정해서 그 범위 안에 들어가면 흰색, 범위 안에 들어가지 않으면 검은색으로 출력
void inRange(cv::InputArray src, cv::InputArray lowerb, cv::InputArray upperb, cv::OutputArray dst)
src : input image
lowerb : lower boundary (scalar로 씀)
upperb : upper boundary (scalar로 씀)
dst : output image (same size with src and CV_8U)
#include "cv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(){
Mat image = imread("hand.jpg");
Mat dst;
cvtColor(image,image,CV_BGR2YCrCb);
inRange(image,Scalar(0,133,77),Scalar(255,173,127),dst);
imshow("inrage",image);
imshow("dst",dst);
waitKey(0);
return 0;
}
'ੈ✩‧₊˚Computer Science > 컴퓨터비전' 카테고리의 다른 글
[OpenCV] 추적(tracking) (0) | 2020.11.23 |
---|---|
[OpenCV] Pedestrian detection (보행자 검출) (0) | 2020.11.18 |
[OpenCV] Face detection (얼굴 검출) (0) | 2020.11.18 |
[OpenCV] 배경 제거 (Background subtraction) (0) | 2020.11.03 |