随笔分类 - OpenCV
一些OpenCV的知识。
摘要:当我们得到一张轮廓之后,我们可以对其运用convexHull方法,寻找该轮廓的凸包。一个轮廓可以有无数个包围它的外壳,而其中表面积最小的一个外壳,就是凸包。voidconvexHull(InputArraypoints, OutputArrayhull, boolclockwise=false, b...
阅读全文
摘要:我们常常需要对一幅图像做轮廓的查找,尤其是在做物体的检测与识别的时候。一般的步骤就是先使用canny方法来得到一幅图像的边缘情况。然后使用findContours方法来得到边缘图像的轮廓。最后使用drawContours方法来绘制轮廓。canny我们都很清楚它的使用方法了。这里简单地说一下findC...
阅读全文
摘要:模板匹配就是在给定一幅图像和一幅模板(一般模板比图像的尺寸小很多)的情况下,找到这个图像中最最相似于模板的位置,比如第一幅是给定的图片,第二幅是模板,第三幅就是搜索到的匹配的位置。这个搜索的过程,我没有在源码中求索,但是根据tutorial,应该是采用sliding window的方法,利用滑动的窗...
阅读全文
摘要:一、直方图均衡化考虑四种图像。在暗色图像中,直方图的组成成分集中在灰度级低的一侧。明亮图像的直方图倾向于灰度级高的一侧。低对比度图像的直方图窄而集中于灰度级的中部。高对比度图像的直方图的成分覆盖了灰度级很宽的范围。在遇到前三种图像的时候,可能我们需要直方图均衡化,用来使一幅图像的像素占有全部可能的灰...
阅读全文
摘要:仿射变换的作用是将图像做旋转、拉伸。仿射变换是通过一个中间矩阵来使源图像像素的位置变换到指定的目标图像的像素的位置,原理类似于上文的remapping。所以仿射变换也是矩阵的一种运用。于是仿射变换一般分成两步:第一、寻找变换的中间矩阵;第二、进行变换。要找到变换的中间矩阵,一般使用三个点来寻找它,因...
阅读全文
摘要:何谓remapping呢?翻译过来就是重映射。因为每个图像本身就是f(x, y),是像素位置为自变量的像素值的函数。然后我们对这些位置上的像素的值再次进行变换,g(x, y) = f(h(x, y)),h(x, y)就是重映射的函数,g(x, y)就是重映射的结果。想象如果h(x, y) = f(I...
阅读全文
摘要:这些笔记的最初,我是以接近于源码分析的形式来梳理自己学习OpenCV的过程。然而写下来,一是执行力,二是时间的问题,确实越写越马虎了。用我老师的话:观其大略了。但是,暂时就这么写着吧。在笔记《十七》中,我们简单地谈到了霍夫变换检测直线的原理,就是判断相邻像素点的值(x, y)对应的r-theta曲线...
阅读全文
摘要:一般我们在检测物体轮廓的时候,会有检测直线的需求,这时可以用到OpenCV当中的霍夫变换实现。霍夫变换的原理的简单阐述见:http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html#hough-...
阅读全文
摘要:Canny方法被许多人认为是拿来做边缘检测的最佳的方法。在维基百科上有关于Canny方法的比较详细的介绍:http://en.wikipedia.org/wiki/Canny_edge_detector所以下面只是简单地提一下,因为暂时没有充裕的时间去阅读OpenCV实现Canny的源代码。Cann...
阅读全文
摘要:在笔记十四中,我们使用了Sobel算子对图像进行边缘检测,理论依据是像素变化最快的地方最有可能是边缘处,所以使用sobel算子对图像做微分,得到的结果图像当中灰度较大的区域,即为边缘处。在这里,我们使用Laplace算子来做边缘检测,也是类似的道理,只不过换成了二阶微分,在一阶微分的极大值的地方,二...
阅读全文
摘要:1. 什么是Sobel算子2. 为什么要对图像做微分3. 如何对图像做微分当我们要对图像进行边缘检测的时候,我们注意到,在边缘处像素的强度的变化率是很大的。而微分恰好是表示这种变化率的很好的方式。在对图像做微分的时候,我们也是对像素做卷积运算,而这里我们使用的kernel,就是Sobel算子。在使用...
阅读全文
摘要:看这个题目,为什么要为一幅图像加上边框呢?第一,做卷积的需要。当我们做卷积的时候,kernel往往不小于3X3的矩阵,那么首行、末行、首列、末列的元素就不能正确地与这个kernel做卷积。当我们给图像加上边框之后,就解决了这个问题。第二、两幅大小不一致的图像进行操作的时候,为了保证运算的正确性,我们...
阅读全文
摘要:在《OpenCV笔记(七)》中,写了四种线性滤波的方法:箱式滤波器、高斯滤波器、中值滤波器和双边滤波器。在OpenCV中,我们可以使用filter2D函数自定义kernel进行线性滤波。void filter2D(InputArray src, OutputArray dst, int ddepth...
阅读全文
摘要:对图像进行阈值的操作,可以认为是一种简单的分割前景和背景的方法。这种分割的方法一般用在前景像素和背景像素的强度值反差比较明显的情况下,如下图:我们可以看到这幅苹果的图像,代表前景的是苹果,代表背景的是白色部分。这幅图像前景背景分明,所以可以取一个阈值,如200。在图像中,凡是灰度低于200的像素,我...
阅读全文
摘要:图像金字塔(Image Pyramids)可以用来处理图像的缩放。有两种广为使用的图像金字塔:高斯金字塔和拉普拉斯金字塔。这里介绍高斯金字塔。高斯金字塔有两种操作:upsample和downsample,可以理解为图像的放大和缩小。以下图为例:图像如果downsample,则col和row均变成之前...
阅读全文
摘要:Erode和Dilate是基本的形态学运算,根据这两种运算,我们能够组成更多形态学运算。一、开运算 Openningdst = open(src, element) = dilate(erode(src, element))开运算就是将一幅图像先腐蚀再膨胀,主要作用是移除白色的小区域。二、闭运算 C...
阅读全文
摘要:一、膨胀和腐蚀膨胀和腐蚀(Dilating and Eroding)是基本的形态学操作。在OpenCV中定义了erode和dilate函数完成相应的功能。膨胀和腐蚀主要作用有三:去除噪声;将分离的部分邻近连接起来;将密布的像素形成一块整体。膨胀操作也类似于线性滤波,不过使用的是最大值滤波器,以ker...
阅读全文
摘要:Opencv中处理图像平滑的手段主要有4种:箱式滤波器、高斯滤波器、中值滤波器、双边滤波器。1. 箱式滤波器 Normalized Box Filter箱式滤波器将当前像素的值替换为所有kernel范围内像素的值的平均值。公式如下:如果是3x3的核,则它对应的核是1/9 * [1, 1, 1; 1,...
阅读全文
摘要:一、随机数产生器在OpenCV中,我们主要使用RNG类(即Random Number Generator)来产生随机数。RNG rng(); // 默认以0xffffffff作为随机数产生器的种子我们也可以以系统的当前时间作为随机数产生器的种子。这也是常用的手段。#include RNG rng( ...
阅读全文
摘要:用OpenCV的话,也要会一些绘图的操作。主要是画线、圆、矩形、椭圆。绘图的话,首先要了解两种类型:Point和Scalar。Point就是点的类,我们用它来表示图像当中的点,比如Point pt; pt.x = 10; pt.y = 8;或者Point pt = Point(10, 8);Scal...
阅读全文