OpenCV对图像做简单处理——平滑滤波

首先必须知道几个关键函数——cvLoadImage,cvCreateImage和cvSmooth。

一、主要函数的简单介绍

1.1 cvLoadImage

函数功能:把图片加载到内存中

函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );

函数说明:

filename :要被读入的文件的文件名(包括后缀);

flags :指定读入图像的颜色和深度:

指定的颜色可以将输入的图片转为3通道(CV_LOAD_IMAGE_COLOR),单通道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)。

1.2 cvCreateImage

函数功能:创建指定图像结构空间的呃图像

函数原型:IplImage* cvCreateImage(CvSize size, intdepth, intchannels);

函数说明:

第一个参数表示图像的大小。

第二个参数表示图像的深度,可以为IPL_DEPTH_8U,IPL_DEPTH_16U等等。

第三个参数表示图像的通道数。

1.3 cvSmooth

函数功能:对图像做简单的模糊处理

函数原型:void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1, int param2, double param3, double param4 );

函数说明:

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

平滑操作的第一个参数.

param2

平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。

param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算:

sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核,n=param2 对应垂直核.

对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小由sigma 计算 (以保证足够精确的操作).

二、程序代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void smooth(IplImage *image);

int main(int argc, char **argv){
    IplImage *img = cvLoadImage(argv[1]);
    smooth(img);
}

/*对图像做简单的平滑处理
方法:对传进来的图片每个像素点3*3区域做高斯平滑*/
void smooth(IplImage *image){
    cvNamedWindow("Example4-in");//创建两个窗口
    cvNamedWindow("Example4-out");

    cvShowImage("Example4-in", image);//把加载的图片image在example4-in窗口中显示

    IplImage *out = cvCreateImage(//cvCreateImage创建图像结构空间
        cvGetSize(image),//大小与传入的图像等大
        IPL_DEPTH_8U,//像素点的数据类型
        3//当前图像3通道
        );

    //平滑处理,输入,输出,高斯,3*3
    cvSmooth(image,out,CV_GAUSSIAN,3,3);

    cvShowImage("Example4-out",out);

    cvReleaseImage(&image);//释放内存
    cvReleaseImage(&out);

    cvWaitKey(0);//等待按键
    cvDestroyWindow("Example4-in");//销毁窗口
    cvDestroyWindow("Example4-out");
}

三、程序运行结果

时间: 2024-10-28 12:46:03

OpenCV对图像做简单处理——平滑滤波的相关文章

Opencv对图像做腐蚀和膨胀处理的结果

在数字图像处理中,图像的形态学变换占有很重要的地位.基本的形态转换就是膨胀和腐蚀,它们能实现多种功能:例如消除噪声.分割出独立的图像元素以及在图像中连接相邻的元素.当然形态学也常备用于求出图像的梯度. 一. 关键函数介绍 下面就介绍OpenCV中对图像进行二值化的关键函数 cvErode() 函数功能:对图像进行腐蚀 函数原型:void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iteratio

Opencv对图像做边缘检测——canny算子

图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法.Canny 边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍,本文主要介绍如何在OpenCV中对图像进行Canny 边缘检测,下面就来看看这个函数的原型. 一. 主要函数 1.1 cvCanny 函数功能:采用Canny方法对图像进行边缘检测 函数原型:

八.使用OpenCv对图像进行平滑操作

1.cvSmooth函数 函数 cvSmooth 可使用简单模糊.简单无缩放变换的模糊.中值模糊.高斯模糊.双边滤波的任何一种方法平滑图像.每一种方法都有自己的特点以及局限. 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSoble和cvaplace相似)和32位浮点数到32位浮点数的变换格式. 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像.这两种方法可以(in-place)方式处理图像. 中值和双向滤波工作于 1- 或 3-通道, 8

Python OpenCV 实现图像滤波

一.实验过程 我使用的是python语言+openCV来实现图像滤波. 使用imread()函数读取图片,使用imshow()函数显示图片,waitKey()函数含义为按下任意键继续: 代码示例: img = cv2.imread("photo1.bmp") cv2.imshow("img",img) cv2.waitKey(0) 结果: 我们可以用pil来实现在图片上显示文字,首先先安装pillow 实例代码: #cv2和PIL中颜色的hex码的储存顺序不同,需转

图像去雾 利用最小值滤波(待改进)

图像去雾 我的个神啊~ 调了这么久终于阶段性"胜利了" -- 利用最小值滤波正确实现图像去雾. 因为是C语言实现,很多细节都要注意,很砸时间--本来看起来很简单的程序,就是有bug,debug的时间很长了,这也是一种锻炼吧,难得的实战机会.磨C 这把刀这么久了,是该做做具体应用了!刀子是否锋利,要接受考验! 程序很大程度上没有利用OpenCV的一些数据操作的接口,除了图像显示和读取之外,其他的数据处理部分都是自己实现的.这几天的时间全砸进去了~ 暑假哇~时间过的慢点可好~ 由于项目正在

《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践

<在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波> --Gabor增强的具体实践   一.问题提出 一般认为"Gabor小波感受野模拟线性滤波器,能对图像进行较好的智能收敛,从而智能增强图像.Gabor小波是智能收敛增强的物理模型" 那么,问题是在实际过程中,如何实现"Gabor小波的智能收敛",达到"智能增强效果"? 二.解题思路 使用工具,能够简单地得到Gabor增强的核:而对于想要增强效果的物体,首先要得到它的梯度数据

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可

Java基于opencv实现图像数字识别(一)

Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用BufferedImage这个类进行操作:尝试着做了一下,做到灰度化,和二值化就做不下去了:然后几乎就没有啥java的资料了,最多的好像都是c++,惹不起.惹不起...... 我也想尝试着用c++做一下,百度到了c++基于opencv来做图像识别的:但是要下vs啊,十几个g呢,我内存这么小,配置这么麻烦,而且vs

Java基于opencv实现图像数字识别(二)—基本流程

Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要是表格中数字的识别,但这个不是重点.重点是通过这个我们可以举一反三,来实现我们自己的业务. 图像的识别主要分为两步:图片预处理和图像识别:这两步都很重要 图像预处理: 1. 图像灰度化:二值化 2. 图像降噪,去除干扰线 3. 图像腐蚀.膨胀处理 4. 字符分割 5. 字符归一化 图像识别: 1.