When will you grow up?

14.Threshold를 이용한 이진 영상 변환 본문

02. Study/Computer Vision(openframworks&opencv)

14.Threshold를 이용한 이진 영상 변환

미카이 2016. 10. 22. 18:26

Threshold

이진 영상 변환을 시킬수 있다. 어떤 영상내에서 화소값들의 특성을 서로 양분하는 하나의 경계화소값을 찾아주는 역할을 한다. 즉 영상 전체적인 특성을 둘로 나누는 경계값을 찾는다는 의미입니다.


opencv 에서 제공되는 threshold사용방법

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)//입력영상,결과영상,선택된 경계 값, 수행하려는 경계화 타입으로 maxval의미를조절


타입                        dst(x,y)

THRESH_BINARY      ->  src(x,y)가 thresh보다 더 크면 maxval 아니면 0

THRESH_BINARY_INV->  src(x,y)가 thresh보다 더 크면 0 아니면 maxval

THRESH_TRUNC      ->  src(x,y)가 thresh보다 thresh 아니면 src(x,y)

THRESH_TOZERO     ->  src(x,y)가 thresh보다 src(x,y) 아니면 thresh

THRESH_TOZERO_INV-> src(x,y)가 thresh보다  0 아니면 src(x,y)


특수한 값인 THRESH_OTSU는 이전 값과 함께 threshold 함수가 경계 값을 자동으로 추정


threshold함수는 영상 전체에 단일 경계 값을 사용하는 반면에,

adaptive thresholding(적응형 경계화)는 각 화소에 대한 다른 경계 값을 추정하며, 입력 영상이 덜 균등하다면(예: 조명이 고르지 않은 영역)은 더 나은 결과를 만든다.


adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)

//얼추 threshold함수와 비슷하지만 thresholdType 파라미터는 THRESH_BINARY 또는 THRESH_BINARY_INV중 하나여야 한다. 이함수는 계산한 이웃의 가중 평균에 상수(c)를 빼서 각 화소에 대한 경계 값을 계산한다.


결과 입니다.

threshold_value : 127

threshold_value : -127




//전역 선언
Mat src1, dst1, adaptDst;
int threshold_value, block_size, C;

void thresholding(int, void*)
{
	threshold(src1, dst1, threshold_value, 255, THRESH_BINARY);
	imshow("Thresholding", dst1);
}
void adaptThreshAndShow()
{
	adaptiveThreshold(src1, adaptDst, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, block_size, C);
	imshow("Adaptive Thresholding", adaptDst);
}
void adaptiveThresholding1(int, void*)
{
	static int prev_block_size = block_size;
	if ((block_size % 2) == 0)//size가 홀수인지 확인
	{
		if (block_size > prev_block_size) block_size++;
		if (block_size < prev_block_size) block_size--;
	}
	if (block_size <= 1)  block_size = 3;
	adaptThreshAndShow();
}
void adaptiveThresholding2(int, void*)
{
	adaptThreshAndShow();
}
//setup
Mat image = imread("223.JPG",0);

	src1 = imread("444.JPG", 0);
	dst1 = src1.clone();
	adaptDst = src1.clone();

	//3개의 창 생성
	namedWindow("Source", WINDOW_AUTOSIZE);
	namedWindow("Thresholding", WINDOW_AUTOSIZE);
	namedWindow("Adaptive Thresholding", WINDOW_AUTOSIZE);
	imshow("Source", src1);
	
	//트랙바 생성
	threshold_value = -127;
	block_size = 7;
	C = 10;
	createTrackbar("threshold", "Thresholding", &threshold_value, 255, thresholding);
	createTrackbar("block_size","Adaptive Thresholding",&block_size,25,adaptiveThresholding1);
	createTrackbar("C","Adaptive Thresholding",&C,255,adaptiveThresholding2);

	//처음으로 연산 수행
	thresholding(threshold_value,0);
	adaptiveThresholding1(block_size, 0);
	adaptiveThresholding2(C, 0);


-참고 : 

책 : OpenCV프로그래밍

OpenCV도큐먼트 : http://opencv.org/documentation.html 

Comments