码迷,mamicode.com
首页 > 其他好文 > 详细

【练习5.1】使用cvSmooth测试不同平滑处理方法的效果以及不同的平滑窗口对处理效果的影响

时间:2015-04-14 23:16:35      阅读:392      评论:0      收藏:0      [点我收藏+]

标签:

《学习OpenCV》中文版第5章第1题

提纲
题目要求
a程序代码
b程序代码
c程序代码
结果图片

 

 

 

 

 

题目要求:

注:相对书中的要求有扩充、调整

载入一个带有有趣纹理的图像。

a、使用cvSmooth函数以多种方法平滑图像

b、使用对称的平滑窗口,大小依次为3×3、5×5、9×9和11×11,并显示出结果

c、用5×5高斯滤波器平滑图像两次和用两个11×11平滑器平滑一次的输出结果是接近相同的吗?为什么?

d、对比不同平滑方法的处理效果,并查阅资料,找出处理效果的不同及各自的优势

 

a程序代码:

 

  1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
  2 //
  3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg
  4 
  5 
  6 #include "stdafx.h"
  7 #include <cv.h>
  8 #include <highgui.h>
  9 #include <iostream>
 10 using namespace cv;
 11 using namespace std;
 12 //函数声明-->--->-->--->-->--->-->--->//
 13 
 14  
 15 
 16 //<--<--<--<--<--<--<--<--<--函数声明//
 17 
 18 int _tmain(int argc, _TCHAR* argv[])
 19 {
 20     const char * fileName = "D:\\Work\\Work_Programming\\Source\\Image\\纹理\\纹理_灰度.jpg";    
 21 
 22     IplImage * img = cvLoadImage(fileName, CV_LOAD_IMAGE_UNCHANGED);    
 23     assert(img);
 24     
 25     IplImage * dst = cvCloneImage(img);
 26     //dst->origin = img->origin;
 27     cvZero(dst); 
 28 
 29     cvNamedWindow("ExerciseWindow", 0);    
 30     cvNamedWindow("简单模糊", 0);
 31     cvNamedWindow("简单无缩放模糊", 0);
 32     cvNamedWindow("中值滤波器模糊", 0);
 33     cvNamedWindow("高斯模糊", 0);
 34     cvNamedWindow("双边滤波", 0);
 35 
 36     cvShowImage("ExerciseWindow", img);
 37 
 38     //---------------------------简单模糊:开始--------------------------------//
 39     
 40     cvSmooth(img, dst, CV_BLUR, 5);
 41 
 42     /*int i = 0;
 43     while (i<5)
 44     {
 45         cvSmooth(dst, dst, CV_BLUR, 5);
 46         i++;
 47     }*/
 48     cvShowImage("简单模糊", dst);
 49 
 50 
 51     //---------------------------简单模糊:结束--------------------------------//        
 52      
 53     //---------------------------简单无缩放模糊:开始--------------------------------//
 54 
 55     //注意:使用CV_BLUR_NO_SCALE平滑类型,输入图像和输出图像必须有不同的数据精度
 56     IplImage * blur_NO_Scale = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_16S, img->nChannels);
 57     blur_NO_Scale->origin = img->origin;
 58     cvZero(blur_NO_Scale); 
 59 
 60     cvSmooth(img, blur_NO_Scale, CV_BLUR_NO_SCALE, 5);
 61  
 62     cvShowImage("简单无缩放模糊", blur_NO_Scale);
 63 
 64     //---------------------------简单无缩放模糊:结束--------------------------------//    
 65 
 66     //---------------------------中值滤波器:开始--------------------------------//
 67 
 68     //注意:CV_MEDIAN平滑类型不支持in place方式
 69     IplImage * image_Median = cvCloneImage(img);
 70     cvZero(image_Median);
 71 
 72     cvSmooth(img, image_Median, CV_MEDIAN, 5);
 73 
 74     cvShowImage("中值滤波器模糊", image_Median);
 75 
 76     //---------------------------中值滤波器:结束--------------------------------//    
 77 
 78     //---------------------------高斯模糊:开始--------------------------------//
 79 
 80     IplImage * image_Gauss = cvCloneImage(img);
 81     cvZero(image_Gauss);
 82 
 83     cvSmooth(img, image_Gauss, CV_GAUSSIAN, 5,5,3,3);
 84 
 85     cvShowImage("高斯模糊", image_Gauss);
 86 
 87     //---------------------------高斯模糊:结束--------------------------------//    
 88 
 89     //---------------------------双边滤波:开始--------------------------------//
 90 
 91     //特别注意:CV_BILATERAL平滑类型的输入和输出图像必须是8u,也就是灰度图
 92     //因该平滑类型不支持in place方式,故多次平滑时注意增加临时图像
 93 
 94     /*IplImage * img_Gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
 95     IplImage * image_BIL = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
 96     cvCvtColor(img, img_Gray, CV_BGR2GRAY);*/
 97     IplImage * image_BIL = cvCloneImage(img);
 98 
 99     IplImage * temp_image = cvCloneImage(img);
100     cvZero(temp_image);
101      
102     cvSmooth(img, temp_image, CV_BILATERAL, 3, 3, 11, 11);
103 
104     int j = 0;
105     while (j<100)
106     {
107         //注意:使用CV_BILATERAL平滑类型时cvSmooth参数中的最后两个11
108         cvSmooth(temp_image, image_BIL, CV_BILATERAL, 7, 7, 11, 11);
109         //cvSmooth(temp_image, image_BIL, CV_BILATERAL, 3, 3);
110 
111         cvCopyImage(image_BIL, temp_image);
112         j++;
113     }
114 
115     //cvSmooth(img, image_BIL, CV_BILATERAL, 3, 3,11,11);
116 
117     cvShowImage("双边滤波", image_BIL);
118 
119     //---------------------------双边滤波:结束--------------------------------//    
120 
121     cvWaitKey(0);
122 
123     cvReleaseImage(&img);
124     cvReleaseImage(&dst);
125     cvReleaseImage(&blur_NO_Scale);
126     cvReleaseImage(&image_Median);
127     cvReleaseImage(&image_Gauss);
128     cvReleaseImage(&image_BIL);
129 
130     cvDestroyWindow("ExerciseWindow");     
131     cvDestroyWindow("简单模糊"); 
132     cvDestroyWindow("简单无缩放模糊");
133     cvDestroyWindow("中值滤波器模糊");
134     cvDestroyWindow("高斯模糊");
135     cvDestroyWindow("双边滤波");
136 
137     return 0;
138 }
139  

 

接下来:

保持双边滤波器的处理图像

 

【练习5.1】使用cvSmooth测试不同平滑处理方法的效果以及不同的平滑窗口对处理效果的影响

标签:

原文地址:http://www.cnblogs.com/tingshuixuan2012/p/4426307.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!