opencv Example 5-4 Threshold versus adaptive threshold

对灰度图像应用自适应阈值,将图像转换成二值图像

参数: 

src

8位源单通道图像

dst

与src相同大小、相同类型的目标图像

maxValue

分配给满足条件的像素的非零值

adaptiveMethod

使用的自适应阀值算法,参考 cv::AdaptiveThresholdTypes

thresholdType

阀值类型:THRESH_BINARY or THRESH_BINARY_INV

参考 cv::ThresholdTypes.

blockSize

用于计算像素阈值的像素邻域的大小:3、5、7等

C

常数减去平均数或加权平均数(见下文)。通常,它是正的,但也可能是零或负的。

/** Adaptive threshold methods */

enum

{

    CV_ADAPTIVE_THRESH_MEAN_C  =0,

    CV_ADAPTIVE_THRESH_GAUSSIAN_C  =1

};

使用以上自适应阀值方法时,自适应阀值T(X,Y)在每个像素点都不同。通过计算像素点周围的bxb区域的加权平均,然后减去一个常数来得到自适应阀值,b由参数blocksize指定,常数C指定。如果使用CV_ADAPTIVE_THRESH_MEAN_C,那么对区域的所有像素平均加权,如果使用了CV_ADAPTIVE_THRESH_GAUSSIAN_C方法,那么区域中的(x,y)周围的像素根据高斯函数按照它们离中心点的距离进行加权计算。
thresholdType 是和cvThreshold一样的。

test:

#include <cv.h>
#include <highgui.h>
#include <math.h>
IplImage *Igray=0, *It = 0, *Iat;
int main( int argc, char** argv ){
     if(argc != 7){return -1;          }
     //Command line
     double threshold = (double)atof(argv[1]);
     int threshold_type = atoi(argv[2])?
	 	CV_THRESH_BINARY : CV_THRESH_BINARY_INV;
     int adaptive_method = atoi(argv[3])?
	 	CV_ADAPTIVE_THRESH_MEAN_C : CV_ADAPTIVE_THRESH_GAUSSIAN_C;
     int block_size = atoi(argv[4]);
     double offset = (double)atof(argv[5]);

	 //Read in gray image
     if((Igray = cvLoadImage( argv[6], CV_LOAD_IMAGE_GRAYSCALE)) == 0){
          return     -1;
	 }
     // Create the grayscale output images
     It = cvCreateImage(cvSize(Igray->width,Igray->height),
                          IPL_DEPTH_8U, 1);
     Iat = cvCreateImage(cvSize(Igray->width,Igray->height),
                          IPL_DEPTH_8U, 1);
     //Threshold
     cvThreshold(Igray,It,threshold,255,threshold_type);
     cvAdaptiveThreshold(Igray, Iat, 255, adaptive_method,
                          threshold_type, block_size, offset);
	 

	 //PUT UP 2 WINDOWS
     cvNamedWindow("Raw",1);
     cvNamedWindow("Threshold",1);
     cvNamedWindow("Adaptive Threshold",1);

	 //Show the results
     cvShowImage("Raw",Igray);
     cvShowImage("Threshold",It);
     cvShowImage("Adaptive Threshold",Iat);
     cvWaitKey(0);

	 //Clean up
     cvReleaseImage(&Igray);
     cvReleaseImage(&It);
     cvReleaseImage(&Iat);
	 cvDestroyWindow("Raw");
	 cvDestroyWindow("Threshold");
	 cvDestroyWindow("Adaptive Threshold");
	 return(0);
}

测试:

结果:

                                                        灰度图像 



                    自适应阀值图像 CV_ADAPTIVE_THRESH_MEAN_C



                                    固定阀值=15

                                               

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/85773141