第五章 学习OpenCV——图像处理
目录
例5-1 单一阈值与自适应阈值的比较
针对有很强照明或反射梯度的图像,需要根据梯度梯度进行阈值化时,cvAdaptiveThreshold()自适应阈值化比cvThreshold()单一阈值化具有更好的效果。具体代码如下:
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char* argv[])
{
IplImage *Igray, *It, *Iat; //图像
double threshold = 25; //阈值
int threshold_type = CV_THRESH_BINARY; //阈值类型
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C; //自适应方式
int block_size = 71; //区域大小
double offset = 15; //抵消的值
if ((Igray = cvLoadImage("D:\\Template\\OpenCV\\Template30_Threshold_Compare\\Debug\\1.jpg", CV_LOAD_IMAGE_GRAYSCALE) )== 0)
return -1;
It = cvCreateImage(cvGetSize(Igray), IPL_DEPTH_8U, 1); //二值阈值化图像
Iat = cvCreateImage(cvGetSize(Igray), IPL_DEPTH_8U, 1); //自适应阈值图像
cvThreshold(Igray, It, threshold, 255, threshold_type); //二值阈值化
cvAdaptiveThreshold(Igray, Iat, 255, adaptive_method, threshold_type, block_size, offset);
//自适应阈值化
cvNamedWindow("Raw", 1);
cvNamedWindow("Threshold", 1);
cvNamedWindow("Adaptive Threshold",1);
cvShowImage("Raw", Igray);
cvShowImage("Threshold", It);
cvShowImage("Adaptive Threshold", Iat);
cvWaitKey(0);
cvReleaseImage(&Igray);
cvReleaseImage(&It);
cvReleaseImage(&Iat);
cvDestroyWindow("Raw");
cvDestroyWindow("Threshold");
cvDestroyWindow("Adaptive Threshold");
return 0;
}
运行结果如下图:
例5-2 使用cvSmooth()函数以多种方式平滑图像
本例完成的工作如下:
1. 载入一个带有有趣纹理的图像;
2. 使用对称的平滑窗口,大小依次为3×3,5×5,9×9,11×11,并显示结果;
3. 用5×5高斯滤波器平滑图像两次和用两个11×11的平滑器平滑一次输出结果,对比显示;
4. 建立一个100×100的单通道图像,将图像全部像素设置为0,然后设置中心像素值等于255;
5. 利用5×5的高斯滤波器平滑此图像,并显示结果;
6. 利用9×9的高斯滤波器平滑此图像,并显示结果;
6. 重新对原始图像用5×5的高斯滤波器平滑两次,并显示结果;
7. 重新对原始图像用9×9的高斯滤波器平滑两次,并显示结果;
8. 设置param1=param2=9,依次将param3设置为1,4,6,进行高斯平滑,显示结果;
9. 设置param1=param2=0,依次将param3设置为1,4,6,进行高斯平滑,显示结果;
10. 设置param1=param2=0,param3=1,param4=9,进行高斯平滑,显示结果;
11. 设置param1=param2=0,param3=9,param4=1,进行高斯平滑,显示结果;
12. 设置param1=param2=0,param3=1,param4=9,平滑一次;再设置param1=param2=0,param3=9,param4=1,平滑一次,显示结果;
13. 设置param1=param2=0,param3=param4=9,平滑一次;再设置param1=param2=0,param3=param4=1,平滑一次,显示结果;
具体代码如下:
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char* argv[])
{
IplImage *In, *Gaussian3_3, *Gaussian5_5, *Gaussian11_11,*Gaussian5_5_Double; //图像
IplImage *Gaussian_test1, *Gaussian_out1, *Gaussian_out2, *Gaussian_out3; //图像
IplImage *Gaussian_test2, *Gaussian_out_1, *Gaussian_out_2, *Gaussian_out_3; //图像
IplImage *Gaussian_out_4, *Gaussian_out_5, *Gaussian_out_6; //图像
IplImage *Gaussian_out_7, *Gaussian_out_8, *Gaussian_out_9, *Gaussian_out_10; //图像
int smooth_type = CV_GAUSSIAN; //阈值类型
if ((In = cvLoadImage("D:\\Template\\OpenCV\\Template31_Smooth_Compare\\Debug\\3.png")) == 0)
return -1;
Gaussian3_3 = cvCreateImage(cvGetSize(In), IPL_DEPTH_8U, 3); //高斯平滑图像3*3
Gaussian5_5 = cvCreateImage(cvGetSize(In), IPL_DEPTH_8U, 3); //高斯平滑图像5*5
Gaussian11_11 = cvCreateImage(cvGetSize(In), IPL_DEPTH_8U, 3); //高斯平滑图像11*11
Gaussian5_5_Double = cvCreateImage(cvGetSize(In), IPL_DEPTH_8U, 3); //高斯平滑图像5*5两次
Gaussian_test1 = cvCreateImage(cvSize(200,200), IPL_DEPTH_8U, 1); //原图像
Gaussian_out1 = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 1); //高斯平滑图像5*5
Gaussian_out2 = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 1); //高斯平滑图像9*9
Gaussian_out3 = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 1); //高斯平滑图像5*5两次
if ((Gaussian_test2 = cvLoadImage("D:\\Template\\OpenCV\\Template31_Smooth_Compare\\Debug\\5.jpg")) == 0)
return -2;
Gaussian_out_1 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑9*9 param3:1
Gaussian_out_2 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑9*9 param3:4
Gaussian_out_3 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑9*9 param3:6
Gaussian_out_4 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑0*0 param3:1
Gaussian_out_5 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑0*0 param3:4
Gaussian_out_6 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3); //高斯平滑0*0 param3:6
Gaussian_out_7 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3);
//高斯平滑0*0 param3:1 param4:9
Gaussian_out_8 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3);
//高斯平滑0*0 param3:9 param4:1
Gaussian_out_9 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3);
//第一次:高斯平滑0*0 param3:1 param4:9 第二次:高斯平滑0*0 param3:9 param4:1
Gaussian_out_10 = cvCreateImage(cvGetSize(Gaussian_test2), IPL_DEPTH_8U, 3);
//第一次:高斯平滑0*0 param3=param4=9 第二次:高斯平滑0*0 param3=param4=0
cvZero(Gaussian_test1); //清零
cvSetReal2D(Gaussian_test1, 100, 100, 255); //中心像素为255
cvSmooth(In, Gaussian3_3, smooth_type, 3, 3); //高斯平滑
cvSmooth(In, Gaussian5_5, smooth_type, 5, 5); //高斯平滑
cvSmooth(In, Gaussian11_11, smooth_type, 11, 11); //高斯平滑
cvSmooth(Gaussian5_5, Gaussian5_5_Double, smooth_type, 5, 5); //高斯平滑
cvSmooth(Gaussian_test1, Gaussian_out1, smooth_type, 5, 5); //高斯平滑
cvSmooth(Gaussian_test1, Gaussian_out2, smooth_type, 9, 9); //高斯平滑
cvSmooth(Gaussian_out1, Gaussian_out3, smooth_type, 5, 5);