[OpenCV]4 图像处理



一、综述

本节我们将来探讨关于图像处理方面的诸多技术和应用。在学完了第一个常用的工具包之后,学习这一节将更加轻松。废话不多说,切入正题。

二、平滑处理和图像形态学

1、滤波器

"平滑处理“或者也称为”模糊处理“,英文名为blurring。对于平滑处理,我们先来介绍一个重要的函数,所有的操作都由这个函数来实现。

void cvSmooth

{

const CvArr* src,

CvArr* dst,

intsmoothtype=CV_GAUSSIAN,

int param1 = 3,

int param2 = 0,

double param3 = 0,

double param4 = 0

};

如你所见,src和dst都是平滑处理的输入和输出图像。smoothtype共有5种类型,包括:CV_BLUR,CV_BLUR_NO_SCALE,CV_MEDIAN_CV_GAUSSIAN,CV_BILATERAL。下面我们挑几个介绍。

中值滤波器(CV_MEDIAN):它是一种非线性数字滤波器,经常用于去除图像或者其他信号中的杂讯。中值滤波是图像处理中的一个常用步骤,它对于斑点噪声(speckle noise)和椒盐噪音(salt-and-pepper
noise)来说尤其有用,以后我们将会介绍着两种噪声。

高斯滤波(CV_GAUSSIAN):用卷积核与输入图像的每个点进行卷积,将最终计算结果之和作为输出图像的像素值。对于高斯模糊,前2个参数代表滤波器窗口的宽度和高度可选择第三个参数来代表高斯卷积核的sigma值(其是最大宽度的四分之一)。高斯函数是单值函数,另外其宽度决定了平滑程度。

双边滤波(CV_BILATERAL):双边滤波的最大优点便是其可以做到边缘保存。进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此临近点的像素变化不会很明显。但是随机的两个点就可能形成很大的像素差,这就是说空间上噪声点不是相互联系的。但是这种方法在接近边缘处就无效了。因此,高斯滤波会磨破边缘,而双边滤波器能够提供一种不会将边缘的平滑掉的方法,不过因此也需要更多的时间。至于应用上,这种滤波的效果大体上讲便是使画面更像一幅水彩画,也可以用于图像分割。

2、膨胀和腐蚀

膨胀是将一些图像,即为下列示例中的A部分和核B部分进行卷积。核可以是任意大小或形状,它拥有一个单独定义的参考点(anchor point)。而腐蚀是膨胀的反操作。在OpenCV中,我们用void
cvErode(IplImage* src, IplImage* dst, IplConvKernel* B = NULL,int iterations = 1);

和void cvDilate(IplImage* src, IplImage* dst, IplConvKernel* B = NULL,int iterations = 1);。

3、自定义核

通过cvCreateStrcturingElementEx函数我们可以创建自定义的IplConvKernel核。IplConvKernel的形状取值:CV_SHAPE_RECT,CV_SHAPE_CROSS,
CV_SHAPE_ELLIPSE, CV_SHAPE_CUSTOM。

4、形态学

下面我们再来介绍一个新的函数。

voidcvMorphologyEx(const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel*element, int operation, int iterations = 1)。该函数新加了2个参数,一个是temp数组一个是operation,后者用来指定形态学的操作方法。主要有:CV_MOP_OPEN,
CV_MOP_CLOSE, CV_MOP_GRADIENT, CV_MOP_TOPHAT,CV_MOP_BLASKHAT。

5、开运算和闭运算

在开运算的情况下,我们首先将其腐蚀然后膨胀。开运算通常可以用来统计二值图像中的区域数。在闭运算的情况下,我们首先将其膨胀然后腐蚀。闭运算消除了低于其邻近点的孤立点,而开运算则消除了高于其邻近点的孤立点。

6、形态学梯度

形态学梯度用来描述图像亮度变化的剧烈程度。以下是其的公式:gradient( src) = dilate (src )- erode (src)

7、礼帽和黑帽

TopHat (src) =src – open (src)

BlackHat (src) =close (src) – src

三、漫水填充

1.漫水填充的介绍

漫水填充的英文名是Flood Fill,它用来标记或者分离图像的一部分以便对其进行进一步的处理或分析。

2.函数分析

voidcvFloodFill(IplImage* img, CvPoint seedPoint, CvScalar newVal, CvScalar loDiff= cvScalarAll(0), CvScalar upDiff = cvScalarAll(0),CvConnectedComp*
comp =NULL, int flaags = 4, CvArr* mask = NULL); newVal是像素点被染色的值,如果一个像素点的值不低于被染色的相邻点减去loDiff且不高于其加上upDiff,那么这个像素点就会被染色。如果flags参数包含CV_FLOODFILL_FIXED_RANGE,这时每个像素点都将与种子点而不是相邻点比较。mask参数所代表的掩码既可以作为cvFloodFill()函数的输入值,也可以作为输出值。如果其非空,那么它必须是一个单通道、8位、像素宽度和高度均比原图像大两个像素的图像。

四、尺寸及图像金字塔

1.尺寸的调整

我们常用cvResize()函数来放大或缩小图像。该函数可以将原图像精确转换为目标图像的尺寸。cvResize()中有3种插值方式:CV_INTER_NN,
CV_INTER_LINEAR,CV_INTER_AREA,CV_INTER_CUBIC。

2.图像金字塔

图像金字塔是一个图像集合,集合中的所有图像都源于同一个原始图像,而且是通过对原始图像连续采样获得,直到达到某个终止条件才停止采样。我们常用的有高斯金字塔和拉普拉斯金字塔,分别为向下采样图像和从底层向上采样重建一个图像。

最常用的用途便是用金字塔来进行图像分割,先建立一个图像金字塔,然后建立起父与子的关系,通过这种方式,快速初始分割可以先在金字塔高层的低分辨率图像上完成,然后逐层对分割加以优化。OpenCV中用一下函数来进行此算法。

voidcvPyrSegmentation( IplImage* src, IplImage* dst, CvMemStorage* storage, CvSeq**comp, int level, double threshold1, double threshold2);关于src和dst,特别需要注意的一点是,由于图像金字塔各层的长和宽都必须是整数,所以要求起始图像的长和宽都能被2整除,并且能被2整除的次数不能少于金字塔的总层数。例如,对于5曾的金字塔,长度为48是满足要求的,因为48=2*2*2*2*3。

CvMemStorage*storage = cvCreateMemStorage()可以用来分配存储区域。

五、阈值化

1.介绍

阈值化的基本思想是将给定的一个数组,根据数组中的每个元素的值是否低于或高于阈值而进行的相关处理。

2、具体函数

doublecvThreshold(CvArr* src, CvArr* dst, double threshold, double max_value, intthreshold_type);其中的阈值的类型为:CV_THRESH_BINARY,
CV_THRESH_BINARY_INV, CV_THRESH_TRUNC,CV_THRESH_TOZERO_INV, CV_THRESH_TOZERO。

3.阈值化

最好不要对8位数组进行加法运算,因为在较高的位可能会溢出。不过可以使用加权加法算法(cvAddWeighted())对三个通道求和。cvThreshold()函数只能处理8位或浮点灰度图像。目标图像必须与源图像的类型是一致,或者为8位图像。事实上,cvThreshold()还允许源图像和目标图像是同一图像。

4.自适应阈值

针对有很强照明或反射梯度的图像,需要根据梯度进行阈值化时,自适应阈值技术非常有用。这种方法由以下函数实现:

void cvAdaptiveThreshold(CvArr* src, CvArr* dst, double max_val, intadaptive_method = CV_ADAPTIVE_THRESH_MEAN_C, int threshold_type
=CV_THRESH_BINARY, int block_size =3, double param1 = 5);

时间: 2024-10-21 18:29:55

[OpenCV]4 图像处理的相关文章

windows平台下基于QT和OpenCV搭建图像处理平台

在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并且生成了相应的免费视频.这篇博客的主要内容,就是基于最新版本的相应工具,在windows平台下,"基于QT和OpenCV搭建图像处理平台",并且进一步研究如何基于QT所见即所得的便利,进行图像处理操作,最终还要和vs做一个比较,进行初步小结. 主要分为3个部分,一个是当前模式下,windows+Q

vs2013在图像处理中的应用(6):使用OpenCV进行图像处理

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 很久没有摸图像处理的东西了,近期刚好需要有此需求,希望能够有一个比较好用的开发环境.在学校的时候做图像处理一直用的是matlab,不过现在正好在做VELT的开发,尝试用vs2013+python构造一个适合于自己用的开发环境. opencv是一个用于图像处理的强大工具,考虑到python的支持,我们选择2.4.11版本

[OpenCV]5 图像处理

一.综述 本节我们将来探讨关于图像处理方面的诸多技术和应用.在学完了第一个常用的工具包之后,学习这一节将更加轻松.废话不多说,切入正题. 二.平滑处理和图像形态学 1.滤波器 "平滑处理“或者也称为”模糊处理“,英文名为blurring.对于平滑处理,我们先来介绍一个重要的函数,所有的操作都由这个函数来实现. void cvSmooth { const CvArr* src, CvArr* dst, intsmoothtype=CV_GAUSSIAN, int param1 = 3, int p

Opencv python图像处理-图像相似度计算

一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你儿子. 还有其他物品.什么桌子带腿.镜子反光能在里面倒影出东西,各种各样的特征,我们通过学习.归纳,自然而然能够很快识别分类出新物品. 而没有学习训练过的机器就没办法了. 但是图像是一个个像素点组成的,我们就可以通过不同图像之间这些差异性就判断两个图的相似度了.其中颜色特征是最常用的,(其余常用的特

关于OpenCV做图像处理内存释放的一些问题

转载:http://http://blog.sina.com.cn/s/blog_67a7426a0101czyr.html 工程运行,发现内存持续增长,到一定的时候就发生了内存泄漏. 内存泄露的定义 内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放.比如用malloc,calloc,realloc,new分配的内存是在堆上的,需要用free,delete显示的回收.内存泄露最明显的是程序很慢,在运行程序时会看到程序占用的内存一直"砰砰砰"的往上涨,最后导致程

Python+OpenCV图像处理(一)——读取显示一张图片

配置好所有环境后,开始利用python+opencv进行图像处理第一步. 读取和显示一张图片: import cv2 as cv src=cv.imread('E:\imageload\example.png') cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) cv.waitKey(0) cv.destroyAllWindows() 输出效果: 代码解释: src=cv.imread(

【OpenCV入门教程之一】 OpenCV 2.4.8 +VS2010的开发环境配置

目录(?)[-] 因为读研期间的研究方向是图像处理所以浅墨这段时间闭门研究了很多OpenCV和图像处理相关的知识与内容眼看自己积累到一定的程度了于是决定开始开设这个OpenCV系列专栏总结自己所学也分享知识给大家 还是先放出待会儿的测试用图 下载和安装OpenCV SDK sources里面是源代码想查看完整的源代码需要用cmake来解包如何解包大家百度一下就可以或者下次浅墨来专门讲一讲这里就先不多说了 配置环境变量 工程包含include目录的配置 工程库lib目录的配置 链接库的配置 在Wi

opencv在arm和x86上的移植

一.开发环境 操作系统:fedora14 Opencv版本:2.0 Qt版本:4.7 arm:mini6410 交叉编译工具:arm-linux-gcc-4.5.1 二.安装与配置 Linux系统的安装,交叉Qt-creator的安装还有交叉编译工具的安装,网上说的基本都没什么问题,测试后都可以用.这里安装Qt-Creator遇到了一点小问题,按照网上的和mini6410开发手册上的安装方法太复杂了,用QtSdk-offline-linux-x86-v1.2.1.run安装方便又准确. 这篇文章

使用OpenCL+OpenCV实现图像旋转(一)

[题外话]近期申请了一个微信公众号:平凡程式人生.有兴趣的朋友可以关注,那里将会涉及更多更新OpenCL+OpenCV以及图像处理方面的文章. 最近在学习<OPENCL异构计算>,其中有一个实例是使用OpenCL实现图像旋转.这个实例中并没有涉及读取.保存.显示图像等操作,其中也存在一些小bug.在学习OpenCL之初,完整地实现这个实例还是很有意义的事情. 1.图像旋转原理 所谓图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程.这个点通常就是图像的中心. 由于是按照中心旋