第五章 学习OpenCV——图像处理

第五部分 学习OpenCV——图像处理 学习OpenCV 第五章 练习题
摘要由CSDN通过智能技术生成

第五章 学习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);              
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值