opencv imgproc


原文链接: opencv imgproc

[](#目录 "目录")目录

  1. 平滑图像 / 模糊
  2. 腐蚀和膨胀
  3. 形态变化 :开运算 、闭运算 、形态梯度、 顶帽 、黑帽
  4. Hit-or-Miss 击中击不中
  5. 图像金字塔
  6. 二值化
  7. 线性滤波器
  8. 霍夫变换:着直线、找圆
  9. 重映射
  10. 仿射变换
  11. 直方图
  12. 模板匹配
  13. 轮廓查找
  14. 凸包
  15. 多边形拟合


[](#一、-平滑图像-模糊 "一、 平滑图像/模糊")一、 平滑图像 / 模糊

  1. 模糊 cv :: blur
  2. 高斯平滑 cv :: GaussianBlur
  3. 中值滤波 cv :: medianBlur
  4. 双边滤波 cv :: bilateralFilter

[](#二、腐蚀和膨胀 "二、腐蚀和膨胀")二、腐蚀和膨胀

  1. 腐蚀 cv::erode 输出像素的值是原图被掩膜所覆盖的所有像素中取最小像素
  2. 膨胀 cv::dilate 输出像素的值是原图被掩膜所覆盖的所有像素中取最大像素

[](#三、-形态变化 "三、 形态变化")三、 形态变化

cv :: morphologyEx
开运算 、闭运算 、形态梯度、 顶帽 、黑帽

[](#四、-Hit-or-Miss-击中击不中 "四、 Hit-or-Miss 击中击不中")四、 Hit-or-Miss 击中击不中

cv :: morphologyEx 函数有一个参数 MORPH_HITMISS 实现击中击不中

PS:知乎上的大神说就是一个完全的模板匹配过程 原理看这篇比较简单 https://blog.csdn.net/horseinch/article/details/50127955 但是结合具体找钥匙的应用,一下子就明白啥叫击中击不中,猛推这篇博文,简直一语戳醒我~~ 击中击不中变换是形态学中用来检测特定形状所处位置的一个基本工具 https://blog.csdn.net/jinshengtao/article/details/20707711

[](#五、-图像金字塔 "五、 图像金字塔")五、 图像金字塔

可以看浅墨大神写的 ~ ~ https://blog.csdn.net/poem_qianmo/article/details/26157633

图像金字塔是图像中多尺度表达的一种,是来源于同一张原始图的图像集合。 越向上层级越大,图像越小,分辨率越低,金字塔底部是高分辨率图像,而顶部是低分辨率的近似。

[](#1-图像金字塔和采样 "1. 图像金字塔和采样")1. 图像金字塔和采样

  • 高斯金字塔:用来向下采样,从低层向上 (这句话一定要看下面这张图理解)
  • 拉普拉斯金字塔: 将拉普拉斯金字塔理解为高斯金字塔的逆形式

向上采样:pyrUp

向下采样:pyrDown

PS:采样方向和金字塔方向相反 (重要的事情不说三遍) 在这里卡了好久,金字塔的上下按照层级来,采样的上下按照尺寸来,直接上图吧,好理解~~

pryUp 不是 PryDown 的逆操作。图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以 0 填充,用指定的滤波器卷积,估计 “丢失” 像素的近似值。

pryDown( ) 是一个会丢失信息的函数。为了恢复原来更高的分辨率的图像,要获得由降采样操作丢失的信息,这些数据就和拉普拉斯金字塔有关系。

[](#2-图像金字塔的作用 "2. 图像金字塔的作用")2. 图像金字塔的作用

图像压缩

图像金字塔构建尺度空间,用于目标检测

下面这篇博文提到了 SIFT 特征,没想到图像金字塔引出的尺寸空间这么有用~~

https://blog.csdn.net/xiaowei_cqu/article/details/8069548

[](#六、阈值操作 "六、阈值操作")六、阈值操作

  • cv :: threshold

  • cv :: inRange

    区别:两个函数都能实现二值化

    但是 inRange() 可以同时针对多通道操作,使用起来非常方便

[](#七、-线性滤波器 "七、 线性滤波器")七、 线性滤波器

cv::filter2D

[](#八、设置边框 "八、设置边框")八、设置边框

cv::copyMakeBorder

除了字面上的添加边框外,还有一个实际用处,如果评估点位于图像的边缘,如何卷积图像? 大多数 OpenCV 功能是将给定的图像复制到另一个稍大的图像上,然后用上式自动填充边界

随机数生成器 RNG uniform 函数可以返回指定范围的随机数,gaussian 函数返回一个高斯随机数,fill 则用随机数填充矩阵 https://blog.csdn.net/zyttae/article/details/41719349

[](#九、-霍夫变换 "九、 霍夫变换")九、 霍夫变换

[](#1-Hough-Line变换-找直线 "1.Hough Line变换 找直线")1.Hough Line 变换 找直线

cv::HoughLines

cv::HoughLinesP

[](#2-Hough-Circle变换-找圆-圆心和半径 "2.Hough Circle变换 找圆(圆心和半径)")2.Hough Circle 变换 找圆 (圆心和半径)

cv::HoughCircles

[](#十、重映射(Remapping) "十、重映射(Remapping)")十、重映射(Remapping)

cv::remap

重映射,重新映射,就是从图像中的一个位置获取像素并将它们定位在新图像中的另一位置的过程。为了完成映射过程,可能需要对非整数像素位置进行一些插值,因为在源图像和目的图像之间不一定存在一对一像素的对应关系。

https://blog.csdn.net/poem_qianmo/article/details/30974513

[](#十一、仿射变换(Affine-Transformations) "十一、仿射变换(Affine Transformations)")十一、仿射变换(Affine Transformations)

  1. 实现仿射: cv::warpAffine 可以实现平移 (Translation)、缩放 (Scale)、旋转 (Rotation)

  2. 计算仿射矩阵的两种方法: cv::getRotationMatrix2D 根据三个系数 center 旋转中心 、angle 旋转角度、 scale、缩放系数计算仿射矩阵

    cv::getAffineTransform 根据三个点的映射计算仿射矩阵

2 x 3 的矩阵 M 来表示仿射变换

再上浅墨大神的教程~~ https://blog.csdn.net/poem_qianmo/article/details/33320997

[](#十二、直方图 "十二、直方图")十二、直方图

[](#1-计算直方图 "1.计算直方图")1. 计算直方图

cv::split 将图像分割成对应的平面,将图像分解为 R,G 和 B 平面

cv::calcHist 来计算图像数组的直方图

cv::normalize 对数组进行归一化

[](#2-直方图均衡化 "2.直方图均衡化")2. 直方图均衡化

对图像中像素个数多的灰度级进行展宽,像素个数少的灰度进行压缩,从而提高了对比度和灰度色调的变化,使图像更加清晰) cv::equalizeHis

[](#3-直方图比较 "3.直方图比较")3. 直方图比较

使用不同的指标来比较直方图,两个直方图相互匹配的程度,提供了四种比较方法 cv::compareHist

[](#4-反向投影 "4.反向投影")4. 反向投影

反向投影图是指图像的某一位置上像素值用对应在直方图的所属于的 bin 上的值来代替该像素值,不想看文字,可以看下面这篇博文的数学描述 https://blog.csdn.net/chenjiazhou12/article/details/22150421

PS:开始觉得这个反向投影能有啥用啊,如果你和我一样,看看下面,反向投影在定位上可是很有用~~ 反向投影用于在输入图像 (通常较大) 中查找特定的模板图像 (通常较小) 最匹配的点或者区域最亮。 cv::calcBackProject

[](#十三、-模板匹配 "十三、 模板匹配")十三、 模板匹配

通过滑动,从左到右,从上到下,在各个位置,比较模板和源图的匹配程度
矩阵 R 用于存放 metric,即匹配好坏程度的值 ,R 中 (x,y) 存放对应位置的匹配度量

cv::matchTemplate() 用来搜索模板和输入图像之间的匹配

cv::minMaxLoc() 用来查找 R 矩阵,即匹配好坏程度中的最大值和最小值 (以及位置)

[](#十四、轮廓查找 "十四、轮廓查找")十四、轮廓查找

cv::findContours 查找轮廓

cv::drawContours 画轮廓

[](#十五、凸包 "十五、凸包")十五、凸包

凸包又叫凸壳,凸包能包含点集中所有的点,如果在集合 A 内连接任意两个点的直线段都在 A 的内部,则称集合 A 是凸形的。字面意思,就是一个多边型,没有凹的地方。

https://blog.csdn.net/keith_bb/article/details/70194073

[](#十六、-多边形拟合 "十六、 多边形拟合")十六、 多边形拟合

cv::approxPolyDP 对边缘轮廓进行多边形拟合

对于拟合后的轮廓求包围盒

http://www.cnblogs.com/mikewolf2002/p/3427079.html

[](#十七、空间矩,中心矩,归一化中心矩,Hu矩 "十七、空间矩,中心矩,归一化中心矩,Hu矩")十七、空间矩,中心矩,归一化中心矩,Hu 矩

PS:关于矩的概念,若不想深究,只看公式,可以看下面这篇~~

  • 中心矩:平移不变性
  • 归一化中心矩:平移不变性,比例不变性
  • Hu 矩:利用二阶和三阶中心矩构造七个不变矩,具有平移、缩放、旋转不变性

https://blog.csdn.net/kuweicai/article/details/79027388

cv::moments 计算图像的中心矩

cv::HuMoments 由中心矩计算 Hu 矩

cv::contourArea 计算轮廓面积

cv::arcLength 计算封闭轮廓或曲线长度

[](#十八、判断点在多边形内部还是外部 "十八、判断点在多边形内部还是外部")十八、判断点在多边形内部还是外部

cv::pointPolygonTest 返回值是图像中的该点到某轮廓的最短距离,通过返回值的正负,判断该点在这个轮廓里面还是外面

[](#使用形态学操作来提取水平和垂直线,加水印的方法 "使用形态学操作来提取水平和垂直线,加水印的方法")使用形态学操作来提取水平和垂直线,加水印的方法

(1) 形态学是一组图像处理操作,其基于预定义的也称为内核的结构元素来处理图像,两个最基本的形态操作是腐蚀和膨胀。 获得水平线,根据结构元素先腐蚀得到水平线,再膨胀加粗

同理,获得竖直线,只不过结构元素需要改变 这种方法结构元素的大小和形状很关键,不然找直线还是用霍夫变换吧

(2) PS:这个程序里用到了 copyTo 加了个 mask 参数,查了一下,竟然是一种做水印的方法!!神奇~~ src.copyTo(dst) src.copyTo(dst, mask) 原理:src 为水印图片,mask 作为一个掩模板,mask 在 (i, j) 其值为 1,则把 src.at(i, j)处的值直接赋给 dst.at(i, j) mask 在 (i, j) 其值为 0,dst.at(i, j)处保留其原始像素值 (mask 可以由 src 经过阈值化得到,mask 为 1 的地方就是水印 src 需要加上去的地方,mask 为 0 的地方,就是水印 src,即原图 dst 不会被掩盖) 水印案例:可以参考下面这个博文~~ http://www.cnblogs.com/xianglan/archive/2011/07/30/2122186.html

`