代码改变世界

OpenCV入门系列(5):对图片进行基本的变换

2012-08-06 14:56  TW-Freewind  阅读(1880)  评论(0)    收藏  举报

本文演示如何对一张图片进行三个基本变换:1. 模糊,2.缩放,3. 寻边。

由于都是对OpenCV内置的函数调用,所以代码都比较简单,主要目的是对图形变换有一个基本和直观的了解。

原理:读取图片->调用OpenCV函数处理->输出到窗口。

原图

首先看源图,所有的操作都基于它:

image

模糊

先看效果:

image

核心函数:cvSmooth

完整代码:

#include "cv.h"
#include "highgui.h"

int main(int argc, char** argv) {
    char* imagePath = "d:\\flower.jpg";
    IplImage* image = cvLoadImage(imagePath);

    cvNamedWindow("window-in");
    cvShowImage("window-in", image);

    cvNamedWindow("window-out");
    IplImage* out = cvCreateImage(
        cvGetSize(image),
        IPL_DEPTH_8U,
        3);
    cvSmooth(image, out, CV_GAUSSIAN, 15, 15);
    cvShowImage("window-out", out);

    cvWaitKey(0);
    cvReleaseImage(&out);
    cvReleaseImage(&image);
    cvDestroyWindow("window-in");
    cvDestroyWindow("window-out");
}

注意在cvSmooth那一行,采用的是高斯模糊,后面的数越大越模糊。

缩放

先看效果图:

image

核心函数:cvPyrDown

完整代码:

#include "cv.h"
#include "highgui.h"

int main(int argc, char** argv) {
    char* imagePath = "d:\\flower.jpg";
    IplImage* image = cvLoadImage(imagePath);

    cvNamedWindow("window-in");
    cvShowImage("window-in", image);

    cvNamedWindow("window-out");
    IplImage* out = cvCreateImage(cvSize(image->width/2, image->height/2), image->depth, image->nChannels);
    cvPyrDown(image, out);
    cvShowImage("window-out", out);


    cvWaitKey(0);
    cvReleaseImage(&out);
    cvReleaseImage(&image);
    cvDestroyWindow("window-in");
    cvDestroyWindow("window-out");
}

注意在创建新图时,就指定了最终的尺寸。

寻边

先看效果图:

image

核心代码:doCanny

完整代码:

#include "cv.h"
#include "highgui.h"

int main(int argc, char** argv) {
    char* imagePath = "d:\\flower.jpg";
    IplImage* image = cvLoadImage(imagePath);

    cvNamedWindow("window-in");
    cvShowImage("window-in", image);

    cvNamedWindow("window-out");
    IplImage* out = cvCreateImage(cvGetSize(image), image->depth, 1);
    cvCanny(image, out, 10, 100, 3);
    cvShowImage("window-out", out);

    cvWaitKey(0);
    cvReleaseImage(&out);
    cvReleaseImage(&image);
    cvDestroyWindow("window-in");
    cvDestroyWindow("window-out");
}

注意创建新图时,最后一个参数channel为1。