opencv 函数笔记(1) resize,滤波,medianBlur,namedWindow


1.resize

函数原型

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

各个参数的意义比较直观,但是需要注意的是dsizefxfy必须不能同时为零,也就是说要么dsize不为零而fxfy同时可以为0,要么dsize0fxfy不同时为0resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation(内插)控制;


update:fx,fy分别指水平和垂直方向的比率;如果dsize 为零,则目标图像的大小是通过这两个参数来计算的:目标图像的宽度为原图像的宽度*fx,同理目标图像的高度为原图像的高度*fy;

如果dsize不为零,fx,fy会自动计算:fx=dsize.width/src.cols;fy=dsize.height/src.rows;

因此dsize和(fx,fy)只需设置其中一个,另外一个置为零就可以了~~


2.namedWindow函数

顾名思义,namedWindow函数,用于创建一个窗口。函数原型是这样的:

  1. void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );   

    第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

    第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

    • WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
    • WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。

WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

函数剖析:

首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。

namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。

我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。

但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。


3.滤波


滤波例子较全

以前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,比如中值滤波,均值滤波,也是自己实现的。

  在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));

  前两个参数是输出图像的指针,目标图像的指针;

  第三个参数是传入一个值,表示现在滤波的方式;

  最后四个值一般用来表示模板的大小

平滑类型  名称 支持 输入数据类型 输出数据类型 简要说明  

CV_BLUR

简单模糊       对每个像素点做size1*size2模板的求和sum,在ret=sum/(size1*size2)  

CV_BLUR_NO_SCALE

简单无缩放变化的模糊       对每个像素点做size1*size2模板的求和sum,ret=sum  
CV_MEDIAN 中值模糊       对图像进行size1*size2模板的取中位数,ret=中位数  
CV_GAUSSIAN 高斯模糊       是一种加权平均的过程,若使用3×3模板,则计算公式如下g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;  
CV_BILATERAL 双边滤波          

  

实例代码:

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

int main(){
    IplImage *img= cvLoadImage("C:/lv2.jpg");//读取图片
    cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE);

    cvShowImage("Example1",img);//在Example1显示图片
    //    cvCopy(img,temp);
    IplImage* temp=cvCreateImage( //创建一个size为image,三通道8位的彩色图
        cvGetSize(img),
        IPL_DEPTH_8U,
        );
    cvSmooth(img,temp,CV_BLUR,3,3);//简单模糊
    cvShowImage("Example2",temp);

    cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//简单无缩放变化的模糊
    cvShowImage("Example3",temp);

    cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊
    cvShowImage("Example4",temp);

    cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊
    cvShowImage("Example5",temp);

    cvSmooth(img,temp,CV_BILATERAL,1,150,240,480);//双边滤波
    cvShowImage("Example6",temp);

    cvWaitKey(0);//暂停用于显示图片


    cvReleaseImage(&img);//释放img所指向的内存空间并且
    cvDestroyWindow("Example1");
    cvDestroyWindow("Example2");
    cvDestroyWindow("Example3");
    cvDestroyWindow("Example4");
    cvDestroyWindow("Example5");
    cvDestroyWindow("Example6");
    
    return 0;
}



media滤波
medianBlur(sourceFrame,desFrame,5);

你可能感兴趣的:(opencv 函数笔记(1) resize,滤波,medianBlur,namedWindow)