OpenCV 常用函数汇总(normalize、getStructuringElement、erode、dilate)

简单认知

Mat 认知

取值类型和范围
  • CV_8U 8位无符号整数 0~255
  • CV_8S 8位符号整数 -128~127
  • CV_16U 16位无符号整数 0~65535
  • CV_16S 16位符号整数 -32768~32767
  • CV_32S 32位符号整数 -2147483648~2147483647
  • CV_32F 32位浮点整数 -FLT_MAX~FLT_MAX,INF,NAN
  • CV_64F 64位浮点整数 -DBL_MAX~DBL_MAX,INF,NAN
图像通道

仅有数据类型是不够,还需要定义图像数据的通道(Channel)数,例如灰度图是单通道数据,彩色图像数据是3通道或者4通道数据

  • CV_8UC3表示的是8位3通道数据,用于表示8位彩色图

简单说明下,下面进入常规的 OpenCV 函数说明

cv::normalize

图像的像素灰度值统计结果主要目的之一就是检查某个灰度值在所有像素中所占的比例,依次,可以用每个灰度值像素的数目占一幅图像中所有像素数据的比例表示某个灰度值数据的多少,即将统计结果再除以图像中的像素个数。
这种方式可以保证每个灰度值的统计结果都是0~100%的数据,实现统计结果的归一化,但是,这种方式存在一个弊端,就是在 CV_8U 类型的图像中,灰度值有256个等级,平均每个像素的灰度值所占比例为0.39%,这个比例非常低。
因此,为了更直观的绘制图像直方图,经常需要将比例扩大一定的倍数后再绘制图像。
另一种常用的归一化方式是寸照统计结果中的最大数值,把所有结果除以这个最大的数值,以实现将所有数据归一化为 0~1

cv::normalize 函数原型
  CV_EXPORTS_W void normalize(
  InputArray src, //输入数组矩阵
  InputOutputArray dst, //输入与src相同大小的数组矩阵
  double alpha = 1, //在范围归一化的情况下,归一化到下限边界的标准值
  double beta = 0, /范围归一化时的上线范围,他用于标准规范化
  int norm_type = NORM_L2, //归一化过程中数据范数种类报纸,常用的可选择参数在下方给出
  int dtype = -1, //输出数据类型选择标志,如果其为负数,那么输出数据与src拥有相同的类型,否则与src具有相同的通道数,但是数据类型不用
  InputArray mask = noArray() //掩码矩阵
  );

该函数输入一个存放数的矩阵,通过参数 alpha 设置将数据缩放到最大范围,然后通过 norm_type 参数选择计算范数的种类,之后将输入矩阵中的每个数据分别除以求取的范数数值,最后得到缩放的结果。
输出结果是一个 CV_32F 类型的矩阵,可以将输入矩阵作为输出矩阵,或者重新定义一个新的矩阵用于存放输出结果。
该函数的第 5 个参数用于选择计算数据范数的种类,常用的可选择参数以及计算范数的公式在下方给出。计算不同的范数,最后的结果也不相同。
例如选择NORM_L1标志,输出结果为每个灰度值所占的比例;选择NORM_INF参数,,输出结果为除以数据中最大值,将所有的数据归一化为0-1

  NORM_INF                1   无穷范数,向量最大值
  NORM_L1                  2   L1范数,绝对值之和
  NORM_L2                  4   L2范数及模长归一化,平方和之根
  NORM_L2SQR         5   L2范数平方
  NORM_MINMAX    32  偏移归一化

cv::getStructuringElement

OpenCV 提供了 getStructuringElement 函数用于生成常用的矩形结构元素、十字结构元素和椭圆结构元素。

cv::getStructuringElement 函数原型
 CV_EXPORTS_W Mat getStructuringElement(
 int shape, //生成结构元素的种类,可以选择的参数及其含义在下方
 Size ksize, //结构元素的尺寸
 Point anchor = Point(-1,-1) //中心点的位置,默认为结构元素的几何中心点
 );

该函数用于生成图像形态学操作中常用的矩形结构元素、十字结构元素和椭圆结构元素。

  • 该函数的第一个参数为生成结构元素的种类。
  • 该函数的第二个参数是结构元素的尺寸,能够影响图像腐蚀的效果,一般情况下,当结构元素的种类相同时,结构元素的尺寸越大,腐蚀效果越明显。
  • 该函数的最后一个参数是结构元素的中心点位置,只有十字结构元素的中心点位置会影响图像腐蚀后的轮廓形状,其他种类结构元素的中心点位置只影响形态学操作结构的平移量
 MORPH_RECT    = 0, //矩形结构元素,所有的元素都为 1
 MORPH_CROSS   = 1, //十字结构元素,中间的列和行元素为 1
 MORPH_ELLIPSE = 2  //椭圆结构元素,矩形的内接椭圆元素为 1

cv::erode

图像腐蚀

cv::erode 函数原型
 CV_EXPORTS_W void erode(
 InputArray src, //输入的待腐蚀的图像,图像的通道数可以是任意的,但图像的数据类型必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一
 OutputArray dst, //腐蚀后的输出图像,与输入图像 src 具有相同的尺寸和数据类型
 InputArray kernel, //用于腐蚀操作的结构元素,可以自己定义,也可以用 getStructuringElement 函数生成
 Point anchor = Point(-1,-1), //中心点在结构元素中的位置,默认参数为结构元素的几何中心点
 int iterations = 1, //腐蚀的次数,默认值为 1
 int borderType = BORDER_CONSTANT, //像素外推法选择标志。默认参数为 BORDER_CONSTANT,表示不包含边界值的倒序填充
 const Scalar& borderValue = morphologyDefaultBorderValue() //使用边界不变外推法时的边界值
 );

该函数根据结构元素对输入图像进行腐蚀,在腐蚀多通道图像时,每个通道独立进行腐蚀运算。

  • 该函数的第一个参数为待腐蚀的图像, 第二个参数为腐蚀后的输出图像,与输入图像具有相同的尺寸和数据类型
  • 该函数的第三个、第四个参数都是与结构元素相关的参数,第三个参数为结构元素,第四个参数为结构元素的中心位置,第四个参数的默认值为 Point(-1, -1),表示结构元素的几何中心处,为结构元素的中心点。
  • 该函数的第五个参数是使用结构元素腐蚀的次数,腐蚀的次数越多效果越明显,参数默认值为 1,表示只腐蚀一次。
  • 该函数的第六个参数是图像像素外推法的选择标志,第七个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的腐蚀操作没有影响,因此在多数情况下使用默认值即可。

需要注意的是,该函数的腐蚀过程只针对图像中的非零像素,因此,如果图像是以 0 像素为背景,那么腐蚀操作后会看到图像中的内容变得更“瘦”、更小;如果图像是以 255 像素为背景,那么腐蚀操作后会看到图像中的内容变得更粗、更大

cv::dilate

图像膨胀

cv::dilate 函数原型
 CV_EXPORTS_W void dilate(
 InputArray src, 输入的待膨胀的图像,图像的通道数可以是任意的,但图像的数据类型必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F之一
 OutputArray dst, 膨胀后的输出图像,与输入图像 src 具有相同的尺寸和数据类型
 InputArray kernel, 用于腐蚀操作的结构元素,可以自己定义,也可以用 getStructuringElement 函数生成
 Point anchor = Point(-1,-1), 中心点在结构元素中的位置,默认参数为结构元素的几何中心点
 int iterations = 1, 膨胀的次数,默认值为 1
 int borderType = BORDER_CONSTANT, 像素外推法选择标志。默认参数为 BORDER_CONSTANT,表示不包含边界值的倒序填充
 const Scalar& borderValue = morphologyDefaultBorderValue() 使用边界不变外推法时的边界值
 );

腐蚀与膨胀恰恰相反,不过多解释

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值