Opencv实现图像的灰度处理,二值化,阀值选择
前几天接触了图像的处理,发现用OPencv处理确实比較方便。毕竟是非常多东西都封装好的。可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多算法,傅里叶。积分,卷积,频谱,加权。
。。,反正我看了半天,是云里雾里的。所以就想先就笼统的过一遍,以后遇到了再详细分析,比較这方面的基础没那么扎实。
先来记录下眼下学习到的一些知识。
首先是图像的灰度处理:
CV_LOAD_IMAGE_GRAYSCALE,这是最简单之间的办法,在加载图像时直接处理
IplImage* Igray=cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);
得到的图像就是单通道的,也能够用这个函数:CVAPI(void) cvCvtColor( const CvArr* src, CvArr* dst, int code );
code=CV_BGR2GRAY;
opencv还提供了非常多方式,我这边就不一一举例了。
图像的二值化是将图像上的像素点的灰度值设置为0或255。也就是将整个图像呈现出明显的黑白效果。
灰度处理后就能够二值化了,这是方便图像处理的重要步骤,但貌似不适合对颜色有要求的图像处理,对轮廓有要求的比較有效。
函数是这个:CVAPI(double) cvThreshold( const CvArr* src, CvArr* dst,
double threshold, double max_value,
int threshold_type );
threshold是阀值。max_value取值255最大值
threshold_type:就是显示的轮廓会有不同
/* Types of thresholding */
#define CV_THRESH_BINARY 0 /* value = value > threshold ?
max_value : 0 */
#define CV_THRESH_BINARY_INV 1 /* value = value > threshold ? 0 : max_value */
#define CV_THRESH_TRUNC 2 /* value = value > threshold ?
threshold : value */
#define CV_THRESH_TOZERO 3 /* value = value > threshold ? value : 0 */
#define CV_THRESH_TOZERO_INV 4 /* value = value > threshold ? 0 : value */
#define CV_THRESH_MASK 7
#define CV_THRESH_OTSU 8 /* use Otsu algorithm to choose the optimal threshold value;
combine the flag with one of the above CV_THRESH_* values */
阀值选取:
一般来说会取100,127等固定值。这类取值比較任意。的到的图像也还能够,可是这边比較推荐的一个方式是自适应阀值:
IplImage* Igray=0,*It=0,*Iat;
int threshold_type = CV_THRESH_BINARY;
int adaptive_method = CV_ADAPTIVE_THRESH_GAUSSIAN_C;
int blocksize = 31;
double offset =15;
int threshold=100;
if(0==(Igray=cvLoadImage("test.jpg",CV_LOAD_IMAGE_GRAYSCALE))){
return -1;
}
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);//阀值100
cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,//自适应阀值,blocksize为奇数
threshold_type,blocksize,offset);