上一篇简单介绍了opencv的基础函数,在对图像进行预处理阶段,灰度图和二值图是一个非常常见的一种处理,许多处理必须要先对图像进行二值化,能为我们后续的处理带来方便,图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
-
函数功能:对图像进行边缘检测
函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。本函数支持的对图像取阈值的方法由 threshold_type 确定。
函数原型: void cvThreshold(
const CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
函数详解:
第一个参数表示输入图像,必须为单通道灰度图。
第二个参数表示输出的边缘图像,为单通道黑白图。
第三个参数表示阈值
第四个参数表示最大值。
第五个参数表示运算方法。
threshold_type=CV_THRESH_BINARY: 如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV: 如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
threshold_type=CV_THRESH_TRUNC: 如果 src(x,y)>threshold,dst(x,y) = threshold; 否则dst(x,y) = src(x,y).
threshold_type=CV_THRESH_TOZERO: 如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0。
threshold_type=CV_THRESH_TOZERO_INV: 如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).
函数功能:颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
函数原型:void cvCvtColor( const CvArr* src, CvArr* dst, int code );
函数详解:第一个参数表示输入图像
第二个参数表示输出图像
第三个参数代表色彩空间的转换,
CV_BGR2GRAY表示转换为灰度图,当选用CV_BGR2GRAY时,dst需要是单通道图片。
CV_BGR2HSV将图片从RGB空间转换为HSV空间。当选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1,这里灰度图转化即可,可以用cvLoadImage函数进行灰度图,只需将参数改写即可,详见第一篇
include
int main()
{
const char *pstrWindowsSrcTitle ="原图";
const char *pstrWindowsBinaryTitle = "二值图";
const char *pstrWindowsGrayTitle = "灰度图";
IplImage * pImage = cvLoadImage("1.jpg",1); //加载原图像
cvNamedWindow(pstrWindowsSrcTitle,1);
cvShowImage(pstrWindowsSrcTitle,pImage);
IplImage *GrayImage = cvCreateImage(cvGetSize(pImage),8,1);//转灰度图
cvCvtColor(pImage,GrayImage,CV_BGR2GRAY);
IplImage *BinaryImage = cvCreateImage(cvGetSize(pImage),8,1);
cvThreshold(GrayImage, BinaryImage, 100, 255, CV_THRESH_BINARY); //阈值化
cvNamedWindow(pstrWindowsGrayTitle,1);
cvShowImage(pstrWindowsGrayTitle,GrayImage);//显示灰度图
cvNamedWindow(pstrWindowsBinaryTitle,1);
cvShowImage(pstrWindowsBinaryTitle,BinaryImage);//显示二值图
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&pImage);
cvReleaseImage(&GrayImage);
cvReleaseImage(&BinaryImage);
}