opencv第四章

1.载入一个带有有趣纹理的图像,使用cvSmooth()函数以多种方法平滑图像,参数为smoothtype = CV_GAUSSIAN.

a.使用对称的平滑的平滑窗口,大小依次是3x3,5x5,9x9,11x11,并显示结果。

b.用5x5高斯滤净器平滑图像两次和用两次11x11平滑器平滑一次的输出结果是最接近相同吗?为什么?

#include <cv.h>
#include <highgui.h>
int main()
{
    IplImage *img = cvLoadImage("3.jpg", 1);
    cvNamedWindow("原图", 1);
    cvShowImage("原图", img);
    IplImage *three = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *five = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *double_five = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *nine = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *eleven = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *double_eleven = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    
    cvSmooth(img, three, CV_GAUSSIAN, 3, 3);
    cvSmooth(img, five, CV_GAUSSIAN, 5, 5);
    cvSmooth(img, nine, CV_GAUSSIAN, 9, 9);
    cvSmooth(img, eleven, CV_GAUSSIAN, 11, 11);
    cvSmooth(five, double_five, CV_GAUSSIAN, 5, 5);
    cvSmooth(eleven, double_eleven, CV_GAUSSIAN, 11, 11);
    cvNamedWindow("three", 1);
    cvNamedWindow("five", 1);
    cvNamedWindow("nine", 1);
    cvNamedWindow("eleven", 1);
    cvNamedWindow("double_five", 1);
    cvNamedWindow("double_eleven", 1);
    cvShowImage("three", three);
    cvShowImage("five", five);
    cvShowImage("nine", nine);
    cvShowImage("eleven", eleven);
    cvShowImage("double_five", double_five);
    cvShowImage("double_eleven", double_eleven);
    cvWaitKey();
    cvReleaseImage(&img);
    cvReleaseImage(&three);
    cvReleaseImage(&five);
    cvReleaseImage(&double_five);
    cvReleaseImage(&nine);
    cvReleaseImage(&eleven);
    cvReleaseImage(&double_eleven);
    cvDestroyAllWindows();
    return 0;
}

 2.

#include <cv.h>
#include <highgui.h>
int main()
{
    IplImage *img = cvCreateImage(cvSize(400, 400), IPL_DEPTH_8U, 1);
    IplImage *five = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    IplImage *nine = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
    cvZero(img);
    cvNamedWindow("main1", 1);
    cvShowImage("main1", img);
    for (int i = 199; i <= 201; i++)
    {
        uchar *ptr = (uchar*)(img->imageData + i*img->widthStep);
        for (int j = 199; j <= 201; j++)
        {
            ptr[j] = 0xff;
        }
    }
    cvNamedWindow("main", 1);
    cvShowImage("main", img);

    cvSmooth(img, five, CV_GAUSSIAN,5,5);
    cvSmooth(five, five, CV_GAUSSIAN, 5, 5);

    cvNamedWindow("five", 1);
    cvShowImage("five", five);


    cvSmooth(five, nine, CV_GAUSSIAN, 9, 9);
    cvNamedWindow("nine", 1);
    cvShowImage("nine", nine);
    cvWaitKey();

    cvReleaseImage(&img);
    cvReleaseImage(&five);
    cvReleaseImage(&nine);
    cvDestroyAllWindows();
    return 0;
}

 4.

#include <cv.h>
#include <highgui.h>
int main()
{
    IplImage *img1 = cvLoadImage("111.jpg", 0);
    IplImage *img2 = cvLoadImage("112.jpg", 0);
    IplImage *img3 = cvCreateImage(cvSize(img1->width, img1->height), img1->depth, img1->nChannels);
    IplImage *img4 = cvCreateImage(cvSize(img1->width, img1->height), img1->depth, img1->nChannels);
    IplImage *img5 = cvCreateImage(cvSize(img1->width, img1->height), img1->depth, img1->nChannels);
    cvSub(img1, img2,img3,NULL);//img1 - img2
    cvAbs(img3, img3);    //    img3 的绝对值

    cvDilate(img3, img4, NULL, 1); //膨胀处理
    cvErode(img4, img5, NULL, 1);    //腐蚀操作
    cvNamedWindow("111.jpg", 1);
    cvNamedWindow("112.jpg", 1);
    cvNamedWindow("img3", 1);
    cvNamedWindow("img4", 1);
    cvNamedWindow("img5", 1);
    cvShowImage("111.jpg", img1);
    cvShowImage("112.jpg", img2);
    cvShowImage("img3", img3);
    cvShowImage("img4", img4);
    cvShowImage("img5", img5);
    cvWaitKey();
    cvReleaseImage(&img1);
    cvReleaseImage(&img2);
    cvReleaseImage(&img3);
    cvReleaseImage(&img4);
    cvReleaseImage(&img5);
    cvDestroyAllWindows();
    return 0;
}

 5

#include <cv.h>
#include <highgui.h>
int main()
{
    IplImage *img1 = cvLoadImage("100.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage *img2 = cvLoadImage("101.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage *img3 = cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels);
    IplImage *img4 = cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels);
    IplImage *img5 = cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels);
    cvSub(img1, img2, img3, NULL);//img1 - img2 = img3
    cvAbs(img3, img3); //img3 的绝对值
    cvThreshold(img3, img4, 0, 255, CV_THRESH_BINARY_INV);  //对img3进行二进制阀值操作
    IplConvKernel *element = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT, NULL);//自定义核
    cvMorphologyEx(img4, img5, NULL, element, CV_MOP_OPEN, 1);//进行开运算
    cvReleaseStructuringElement(&element); //释放核
    cvNamedWindow("img1", 1);
    cvNamedWindow("img2", 1);
    cvNamedWindow("img3", 1);
    cvNamedWindow("img4", 1);
    cvNamedWindow("img5", 1);
    cvShowImage("img1", img1);
    cvShowImage("img2", img2);
    cvShowImage("img3", img3);
    cvShowImage("img4", img4);
    cvShowImage("img5", img5);
    cvWaitKey();
    cvReleaseImage(&img1);
    cvReleaseImage(&img2);
    cvReleaseImage(&img3);
    cvReleaseImage(&img4);
    cvReleaseImage(&img5);
    cvDestroyAllWindows();
    return 0;
}
原文地址:https://www.cnblogs.com/chenyang920/p/5367557.html