openCV学习笔记(二)------图像平滑处理和边缘检测

1.对图片进行平滑处理:通过图像数据与高斯或者其他核进行卷积有效的减少图像信息内容,平滑处理其实就是调用openCV的一个库函数。
调用的库函数为:

CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst,
                      int smoothtype CV_DEFAULT(CV_GAUSSIAN),
                      int size1 CV_DEFAULT(3),
                      int size2 CV_DEFAULT(0),
                      double sigma1 CV_DEFAULT(0),//可以默认,不写
                      double sigma2 CV_DEFAULT(0));//可以默认,不写

实现代码:

void smooth(IplImage* image)
{
    //create some windows to show the
    //input and output images in
    cvNamedWindow("Smooth_in", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Smooth_out");

    //create a window to show our input image
    cvShowImage("Smooth_in", image);
    //create an image to hold the smoothed ouput
    IplImage* out = cvCreateImage(
        cvGetSize(image),
        IPL_DEPTH_8U,
        3
    );

    //do some smoothing
    //每个像素周围3*3的区域进行高斯平滑处理
    cvSmooth(image, out, CV_GAUSSIAN, 3, 3);

    //show the smoothed image in the output window
    cvShowImage("Smooth_out", out);


    //Be tidy
    cvReleaseImage(&out);//一旦用完加载到内存的图像文件,就可以释放为该文件所分配的内存

    //Wait for the user to hit a key, then clean up the window
    cvWaitKey(0);
    cvDestroyWindow("Smooth_in");
    cvDestroyWindow("Smooth_out");
}

这里写图片描述
2.边缘检测
送入要进行边缘检测的图像只能是单通道的图像;

CVAPI(void)  cvCanny( const CvArr* image,//原图像,必须是单通道灰度图
                      CvArr* edges, //边缘检测后的图像
                      double threshold1,//阈值1
                      double threshold2, //阈值2
                      int  aperture_size CV_DEFAULT(3) );//sobel算子值

实现代码:

IplImage *g_pSrcImage, *g_pCannyImg;

void on_trackbar(int threhold)
{
    //canny边缘检测
    cvCanny(g_pSrcImage, g_pCannyImg, threhold, threhold*3, 3);
    cvShowImage("边缘检测图", g_pCannyImg);//显示边缘检测窗口
}

int doCanny()
{

    g_pSrcImage = cvLoadImage("D:\\picture\\hah.jpg", 0);//将图像文件加载至内存

    if (g_pSrcImage->nChannels != 1)
    {
        return(0); //Canny only handles gray scale images
    }
    g_pCannyImg = cvCreateImage(
        cvGetSize(g_pSrcImage),
        IPL_DEPTH_8U,
        1
    );

    cvNamedWindow("原图");
    cvNamedWindow("边缘检测图");

    //创建滑动条
    int pos = 1;
    cvCreateTrackbar("滑块", "边缘检测图", &pos, 300, on_trackbar);

    cvShowImage("原图", g_pSrcImage);
    on_trackbar(1);

    cvWaitKey(0);

    cvReleaseImage(&g_pSrcImage);
    cvReleaseImage(&g_pCannyImg);
    cvDestroyAllWindows();
    return 0;
};

void main()
{
    doCanny();
}

这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章