OpenCV3.4.3模块功能一览--源自Opencv中文网教程

【Mat 类】
Mat A, C;                                 // 只创建信息头部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存
Mat B(A);                                 // 使用拷贝构造函数,浅拷贝(只拷贝矩阵头,但指向的仍是同一个阵列)
C = A;                                    // 赋值运算符

对于Mat类庞大的计算量来自于矩阵的大小。所以要慎用深拷贝。

遍历图像的方法
推荐的效率最高的查找表赋值方法:

uchar* p;
for( i = 0; i < nRows; ++i)
{
    p = I.ptr(i);
    for ( j = 0; j < nCols; ++j)
    {
        p[j] = table[p[j]];             
    }
}

这里,我们获取了每一行开始处的指针,然后遍历至该行末尾。如果矩阵是以连续方式存储的,我们只需请求一次指针、然后一路遍历下去就行。
彩色图像 的情况有必要加以注意:因为三个通道的原因,我们需要遍历的元素数目也是3倍。

filter2D 函数,用于计卷积,当核的尺寸小于11*11时,是直接计算,大于时,用的是dft计算。
addWeighted 函数,用于实现两个矩阵求和,但是两个矩阵的尺寸必须一致,否则没有意义。

公式:
dst(x,y)=∑kernel(x′,y′)∗src(x+x′−anchor.x,y+y′−anchor.y)
-------- 0≤y′ ---------rows0≤x′

convertTo() 函数,对像素进行线性变化

公式:
m(x,y)=saturate_cast(α(∗this)(x,y)+β)

【图像处理imgproc】

滤波器
滤波器都是为了平滑(模糊)图像,简单初步消除细碎的噪声。

  1. 归一化块滤波器 (Normalized Box Filter)
    blur()
    最简单的滤波器, 输出像素值是核窗口内像素值的 均值

  2. 高斯滤波器 (Gaussian Filter)
    GaussianBlur()
    最有用的滤波器 (尽管不是最快的)。

    将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值 中间像素的加权系数是最大的,周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小 GaussianBlur() 最有用的滤波器 (尽管不是最快的) 将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值 中间像素的加权系数是最大的,周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小。

  3. 中值滤波器 (Median Filter)
    medianBlur()
    中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值 代替 。即取邻域像素的中值。所以一般要求邻域是奇数。

  4. 双边滤波 (Bilateral Filter)
    bilateralFilter()
    上述这些滤波器不仅仅削弱了噪声, 连带着把边缘也给磨掉了。 为避免这样的情形 (至少在一定程度上 ), 我们可以使用双边滤波。

    类似于高斯滤波器,双边滤波器也给每一个邻域像素分配一个加权系数。 这些加权系数包含两个部分,

    第一部分加权方式与高斯滤波一样,第二部分的权重则取决于该邻域像素与当前像素的灰度差值。
    在一定程度上,不仅可以消除噪声,还可以保证一定的边缘存在。

    双边滤波器的参数,d:滤波器尺寸,sigmaColor:颜色范围的尺寸,sigmaSpace:

功能越强大的滤波器,计算量越大,原理也越复杂。


形态学
形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。

  • 开运算:先对图像(前景)腐蚀再膨胀;能够去除细小的噪声。背景多一些。
  • 闭运算:先对图像(前景)膨胀再腐蚀;能够填充小型黑洞(黑色区域)。前景多一些。
  • 形态梯度:膨胀图与腐蚀图之差,能够保留物体的边缘轮廓。
  • 顶帽(Top Hat):原图像与开运算结果图之差。
  • 黑帽(Black Hat):闭运算结果图与原图像之差。

膨胀和腐蚀要灵活理解,对前景的膨胀等效于对背景的腐蚀。


放大缩小图像
OpenCV中更常用的放大和缩小函数是resize函数。图像金字塔也是视觉运用中广泛采用的一项技术

图像金字塔:高斯金字塔(Gaussian pyramid): 用来向下采样;拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像
pyrUp放大:通过与内核卷积,获取“新增像素”的近似值
pyrDown缩小:通过与高斯内核卷积,将偶数行和列除去。结果图像只有原图的四分之一,

放大缩小,会导致图像的失真


分割

阈值化

threshold
最简单的图像分割。是基于前景与背景之间的灰度差异。属于像素级分割。
阈值化类型:

  1. 二进制阈值化:选定阈值T=125,大125像素值设为255,小于则为0.最终生成一幅二值图;
  2. 反二进制阈值化:与1相反,大于125的像素值设为0,小于则为255.生成一幅二值图;
  3. 截断阈值化:选定阈值T=125,大于125的像素值设为125,小于则保持原像素值不变;
  4. 阈值化为0:与3相反,大于125的像素值保持不变,小于则设置为0;
  5. 反阈值化为0:与3类似,大于125的像素值设置为0,小于则保持原像素值不变。
  6. 还有两种是自适应阈值。Otsu

梯度算子

  1. Sobel算子
    • 用来计算图像灰度函数的近似梯度。
    • 一般计算Sobel采用近似梯度的方法:近似梯度G约等于|Gx|+|Gy|。
    • Sobel 算子结合了高斯平滑和微分求导。
    • 当内核大小是3时,Sobel内核会产生比较明显的误差;

OpenCV提供了 Scharr 函数,仅在内核大小为3时,该函数可用,且精度高于sobel,运行速度与sobel一样快。

  • 步骤:根据公式来计算,先计算x方向梯度,并取其绝对值;再计算y方向的梯度,并取其绝对值;再计算绝对值之和。
  • 参数: ( xorder = 1, yorder = 0, ksize = 3) 计算x方向梯度;( xorder = 0, yorder = 1, ksize = 3)计算y方向梯度
    !【这里为什么要用近似梯度?试验结果,近似梯度比直接用3*3的模板算梯度,得出的边缘更明显。回头要再看看梯度这块】
  1. Laplacian算子
    使用二阶导数来检测边缘。
    相比sobel,laplace算子简单一些,但是不能滤除一些噪声。

convertScaleAbs,将图数值转换成绝对值。
RNG类,随机值

在进行边缘检测之前,opencv给的例子中,都进行了高斯滤波。消除部分噪声。


更复杂,更有效的算子
Canny算子
边缘检测的最优算法

  • 识别出实际的边缘,尽可能的减少噪声(算法原理中运用到了高斯模糊)
  • 高定位
  • 图像中的边缘只能标识一次。
  • canny的阈值比例(低:高)通常采用1:2,1:3 [比例源自冈萨雷斯书]

检测其他:
霍夫线,圆检测:检测线
霍夫线检测:普通坐标转换到极坐标

HoughLines:标准霍夫线变换
原理在上面的部分已经说明了. 它能给我们提供一组参数对 (ρ,θ) 的集合来表示检测到的直线
在OpenCV 中通过函数 HoughLines 来实现

HoughLinesP:统计概率霍夫线变换
这是执行起来效率更高的霍夫线变换. 它输出检测到的直线的端点 (x0, y0, x1, y1)
在OpenCV 中它通过函数 HoughLinesP 来实现

霍夫圆: HoughCircles


重映射
简单理解:对源图像重新映射一下。把阵列重新摆一下。

把一个图像中一个位置的像素放置到另一个图片指定位置的过程.
dst(x,y)=src(mapx(x,y),mapy(x,y))
源图像与目标图像的像素坐标不是一一对应的.所以有必要获得一些插值为非整数像素坐标 。

重映射,可以来实旋转拉伸期间,肯定会存在一些像素的丢失。

remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT,
Scalar(0,0, 0) ); map_x:x方向的映射; map_y:y方向的映射;两个map与src的大小要一致。

仿射变换
一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移);
可以使用仿射变换来实现:缩放(线性变换),平移(向量加),旋转(线性变换)
warpAffine
这个先了解有这么个东西把,后面用到的时候,再去研究具体的算法。


直方图均衡化:
equalizeHist
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
针对像素分布过于集中的情况下,表现为:图像过亮或者过暗。均衡化,可以均匀像素的分布,表现为调图像的对比度。

直方图:
calcHist
计算一个数组的分布。
normalize
归一化,将数组的值限定在某个范围内。
compareHist
对比两个直方图。可以对比图像的RGB直方分量,也可以对比HSV直方分量。


模板匹配



  • 在图像中找寻轮廓: 先用canny检测边缘,再用findContours找寻轮廓。
    findContours具体的算法实现,后期可以再仔细研究研究。
  • 计算物体的凸包: 先用阈值处理,分割图像。再用findContours寻找轮廓,再对每个轮廓计算其凸包convexHull。
    convexHull:在一个集合中,寻找凸起的部分。灰度值高的部分。需要先进行阈值处理。
  • 创建包围轮廓的矩形和圆形边界框: approxPolyDPminEnclosingCircle
    由给定的几个点,求出最小外接矩形和最小外接圆;
  • 为轮廓创建可倾斜的边界框和椭圆: fitEllipse

轮廓矩
使用OpenCV函数 moments 计算图像所有的矩(最高到3阶)
使用OpenCV函数 contourArea 来计算轮廓面积
使用OpenCV函数 arcLength 来计算轮廓或曲线长度

多边形测试
pointPolygonTest



【特征处理feature2d 】

特征应该是独一无二的,在场景中很容易识别出来的特性。
图像特征类型:边缘角点(感兴趣关键点);斑点(Blobs)(感兴趣区域)。

【角点】
【角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。】

cornerHarris角点检测; Harris-Stephens方法检测角点。梯度协方差矩阵
参数设置得不对,会崩溃的。而且算得很慢,慢,慢。
具体的算法,后期用到了,再分析。

Shi-Tomasi角点检测子:
goodFeaturesToTrack
不太懂,但是运行速度比cornersHarris快很多

自定义创建角点检测子:
cornerEigenValsAndVecs 来计算像素对应的本征值和本征向量来确定其是否是角点。
cornerMinEigenVal 通过最小化本征值来进行角点检测。
用上述两个函数实现一个定制化的Harris detector,类似Shi-Tomasi检测子。

亚像素级的角点检测:
cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置)

SIFT 和 SURF是带专利的接口

-----------------------end------------------------------------------------
以上是自己简单尝试了一下,未做深入研究,不喜勿喷,欢迎拍砖以求斧正。学图像,隐隐约约觉得,算法的参数调试应该很复杂,而且图像能做出来的东西,应该可以很大,可以做成系统。可以作为研究课题。
它已经超出了一般应用的范围。而且,调试的手法也跟普通程序有一定的差别,普通程序,就是看看参数就好了,但是图像的调试可能要看图像的输出。看实际的效果,由人眼来判断是否达到要求。同时图像的调试不必拘泥于细枝末节,要关注整体。

你可能感兴趣的:(数字图像处理,图像,opencv,功能,接口)