第三篇 学习OpenCV之图像变换(1)

图像可以进行多种方式的变换,其中一种简单的变换就是对图像进行平滑处理,通过对图像数据与高斯或者其他核函数进行卷积,有效的减少图像信息内容。
高斯模糊,也叫高斯平滑,根据高斯曲线调节象素色值,有选择地模糊图像,通常用它来减少图像噪声以及降低细节层次。
接下来,将编程实现载入一幅图像并进行平滑处理。

// 作者:GongchuangSu ( http://blog.csdn.net/gongchuangsu )
// 时间:2015.06.22
// 说明:载入图像并利用高斯模糊进行平滑处理

#include "cv.h"
#include "highgui.h"
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

//图像平滑处理函数
void doSmooth(IplImage* in)
{
    cvNamedWindow("Image_dst");
    //为处理后的图像分配存储空间
    IplImage* dst = cvCreateImage(
        cvGetSize(in),
        IPL_DEPTH_8U,
        3
    );
    //平滑处理
    cvSmooth( in, dst, CV_GAUSSIAN, 5, 5 );
    cvShowImage("Image_dst",dst);
    cvReleaseImage( &dst );
}

int main()
{
    const char*ImageName="人物.jpg";
    IplImage* src = cvLoadImage( ImageName );
    cvNamedWindow("Image_src");
    cvShowImage("Image_src",src);
    //调用处理函数
    doSmooth( src );
    cvWaitKey(0);
    cvReleaseImage( &src );
    cvDestroyAllWindows();
}

1. cvCreateImage

函数原型:IplImage* cvCreateImage(CvSize size, int depth, int channels)
函数说明:创建图像头并分配数据。
size:图像的宽度和高度。可直接用函数CvGetSize取得某个图像的大小并返回,也可用函数cvSize( int width, int height )赋值,具体如下。该函数cvSize内部已定义,可直接调用。

CvSize  cvSize( int width, int height )
{
    CvSize s;

    s.width = width;
    s.height = height;

    return s;
}

depth:图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels:每个像素的颜色通道数。可选择1,2,3或4。该函数只能创建通道是交叉存取的图像,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1···

2. CvSize

结构体CvSize表示一个矩阵或一个图像的大小。

typedef strcut CvSize
{
  int width;   //宽度
  int height;  //高度
}size;

3. CvGetSize

函数原型:CvSize cvGetSize(const CvArr* arr)
函数说明:返回矩阵或图像ROI的大小(ROI:Region Of Interest 感兴趣区)。函数返回矩阵或图像的行数(CvSize::height)和列数(CvSize::width),如果是图像就返回ROI的大小。

4. CvArr

不确定数组 typedef void CvArr;
CvArr* 仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如 IplImage*, CvMat* 甚至 CvSeq*. 最终的数组类型是在运行时通过分析数组头的前4 个字节判断。

5. cvSmooth

函数原型:void cvSmooth(const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0, double param4=0 )
函数说明:图像平滑处理的各种方法。
src:输入图像。
dst:输出图像。
smoothtype:平滑方法。
CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像;
CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1?param2);
CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 ;
CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波;
CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2。
param1:平滑操作的第一个参数,孔径的宽度。一定是个正奇数(1,3,5···)
param2:平滑操作的第二个参数,孔径的高度。对于CV_MEDIAN 和CV_BILATERAL ,该参数被忽略;对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。其他情况下,它一定是个正奇数。
param3:对应高斯参数的 Gaussian sigma (标准差)。具体参考手册。
注:简单模糊和高斯模糊支持1-或3-通道,8-比特和32-比特浮点图像。中值和双向滤波工作于1-或3-通道,8-位图像。

运行结果:

处理前:

这里写图片描述

处理后:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值