임계값(Threshold)

영상 내 픽셀중에서 특정 값보다 큰값을 갖는 픽셀만 남기고 나머지 픽셀은 무시하는 작업이 필요한 경우가있다. 이 경우 OpenCV에서는 cvThreshold()함수를 사용한다.


double cvThreshold(

        const CvArr* src,             //입력영상

        CvArr* dst,                   //출력영상

        double threshold,             //임계값

        double max_value,             //최대값

        int threshold_type);          //임계값 타입 


임계값타입

  • THRESH_BINARY

    \texttt{dst} (x,y) =  \fork{\texttt{maxval}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

  • THRESH_BINARY_INV

    \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{maxval}}{otherwise}

  • THRESH_TRUNC

    \texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

  • THRESH_TOZERO

    \texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{thresh}$}{0}{otherwise}

  • THRESH_TOZERO_INV

    \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{thresh}$}{\texttt{src}(x,y)}{otherwise}

../../../_images/threshold.png


 #include <stdio.h>

#include <cv.h>

#include <highgui.h>

 

void sum_rgb(IplImage* src, IplImage* dst) {

        IplImage* r=cvCreateImage(cvGetSize((src)), IPL_DEPTH_8U, 1);

        IplImage* g=cvCreateImage(cvGetSize((src)), IPL_DEPTH_8U, 1);

        IplImage* b=cvCreateImage(cvGetSize((src)), IPL_DEPTH_8U, 1);

 

        cvSplit(src, r, g, b, NULL);

       

        IplImage* s=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);

 

        cvAddWeighted(r, 1./3., g, 1./3., 0.0, s);

        cvAddWeighted(s, 2./3., b, 1./3., 0.0, s);

 

        cvThreshold(s, dst, 100, 100, CV_THRESH_TRUNC);

 

        cvReleaseImage(&r);

        cvReleaseImage(&g);

        cvReleaseImage(&b);

        cvReleaseImage(&s);

}

 

int main(void) {

        cvNamedWindow("lueseypid", 1);

        IplImage* src=cvLoadImage("lueseypid.jpg");

        IplImage* dst=cvCreateImage(cvGetSize(src), src->depth, 1);

        sum_rgb(src, dst);

 

        cvShowImage("lueseypid", dst);

 

        while(1) {

               if((cvWaitKey(10) & 0x7f)==27)

                       break;

        }

 

        cvDestroyWindow("lueseypid");

        cvReleaseImage(&src);

        cvReleaseImage(&dst);

}


출력결과


적응형 임계값

주변 픽셀들의 분포를 분석하여 자동으로 임계값을 결정한다. OpenCV에서는 cvAdaptiveThreshold()함수에서 인자값에 따라 두종류의 적응형 임계값방법을 지원한다.


cvAdaptiveThreshold()

 void cvAdaptiveThreshold(

        const CvArr* src,

        CvArr* dst,

        double max_value,

        int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C

                  //CV_ADAPTIVE_THRESH_MEAN_C or CV_ADAPTIVE_THRESH_GAUSSIAN_C

        int threshold_type=CV_THRESH_BINARY,

        int block_size=3,

        double param1=5 );

cvAdaptiveThreshold() adaptive_method 인자값에 따라 두종류의 적응형 임계값을 지원한다. 두가지 경우 모두 적응형 임계값 

T(x, y)는 픽셀마다 다른값을 갖게 된다. T(x, y)는 각 픽셀 주변 \texttt{blockSize} \times \texttt{blockSize}에서 구한 가중치 평균값에서 param1으로 지정되는 상수값을뺀 값으로 결정된다.


adaptive_method

CV_ADAPTIVE_THRESH_MEAN_C : 가중치가 모두 동일한 값으로 설정된다.

- CV_ADAPTIVE_THRESH_GAUSSIAN_C : 가중치는 가우시안 함수의 형태로 지정되어 중심쪽의 픽셀에 가중치가 크게 부여된다.

threshold_type : cvThreshold()함수에서 사용되는 값과 동일함(위에 참고)








'Developer > OpenCV' 카테고리의 다른 글

시퀀스(Sequence)  (1) 2013.01.13
메모리 스토리지  (1) 2013.01.13
피라미드 영상(이미지 피라미드, Image Pyramid)  (0) 2013.01.10
HighGUI  (0) 2013.01.09
행렬과 영상에 관한연산 함수  (0) 2013.01.08
Posted by No names
,