C++版本OpenCv教程(十二)图像像素统计

您所在的位置:网站首页 图像的平均值 C++版本OpenCv教程(十二)图像像素统计

C++版本OpenCv教程(十二)图像像素统计

#C++版本OpenCv教程(十二)图像像素统计| 来源: 网络整理| 查看: 265

我们可以将数字图像理解成一定尺寸的矩阵,矩阵中每个元素的大小表示了图像中每个像素的亮暗程度,因此统计矩阵中的最大值,就是寻找图像中灰度值最大的像素,计算平均值就是计算图像像素平均灰度,可以用来表示图像整体的亮暗程度。因此针对矩阵数据的统计工作在图像像素中同样具有一定的意义和作用。在OpenCV 4中集成了求取图像像素最大值、最小值、平均值、均方差等众多统计量的函数,接下来将详细介绍这些功能的相关函数。

寻找图像像素最大值与最小值

OpenCV 4提供了寻找图像像素最大值、最小值的函数minMaxLoc(),该函数的原型在代码清单3-7中给出。

void cv::minMaxLoc(InputArray src, double * minVal, double * maxVal = 0, Point * minLoc = 0, Point * maxLoc = 0, InputArray mask = noArray()) src:需要寻找最大值和最小值的图像或者矩阵,要求必须是单通道矩阵minVal:图像或者矩阵中的最小值。maxVal:图像或者矩阵中的最大值。minLoc:图像或者矩阵中的最小值在矩阵中的坐标。maxLoc:图像或者矩阵中的最大值在矩阵中的坐标。mask:掩模,用于设置在图像或矩阵中的指定区域寻找最值。 这里我们见到了一个新的数据类型Point,该数据类型是用于表示图像的像素坐标,由于图像的像素坐标轴以左上角为坐标原点,水平方向为x轴,垂直方向为y轴,因此Point(x,y)对应于图像的行和列表示为Point(列数,行数)。在OpenCV中对于2D坐标和3D坐标都设置了多种数据类型,针对2D坐标数据类型定义了整型坐标cv::Point2i(或者cv::Point)、double型坐标cv::Point2d、浮点型坐标cv::Point2f,对于3D坐标同样定义了上述的坐标数据类型,只需要将其中的数字“2”变成“3”即可。对于坐标中x、y、z轴的具体数据,可以通过变量的x、y、z属性进行访问,例如Point.x可以读取坐标的x轴数据。

该函数实现的功能是寻找图像中特定区域内的最值,函数第一个参数是输入单通道矩阵,需要注意的是,该变量必须是一个单通道的矩阵数据,如果是多通道的矩阵数据,需要用cv::Mat::reshape()将多通道变成单通道,或者分别寻找每个通道的最值,然后再进行比较寻找到全局最值。对于cv::Mat::reshape()的用法,在代码清单3-8中给出。第二到第五个参数分别是指向最小值、最大值、最小值位置和最大值位置的指针,如果不需要寻找某一个参数,可以将该参数设置为NULL,函数最后一个参数是寻找最值得掩码矩阵,用于标记寻找上述四个值的范围,参数默认值为noArray(),表示寻找范围是矩阵中所有数据。

Mat cv::Mat::reshape(int cn,int rows = 0) cn:转换后矩阵的通道数。rows:转换后矩阵的行数,如果参数为零,则转换后行数与转换前相同。 注意 如果矩阵中存在多个最大值或者最小值时,minMaxLoc()函数输出最值的位置为按行扫描从左向右第一次检测到最值的位置,同时输入参数时一定要注意添加取地址符。 为了让读者更加了解minMaxLoc()函数的原理和使用方法,在代码清单3-9中给出寻找矩阵最值的示例程序,在图3-6中给出了程序运行的最终结果,在图3-7给出了创建的两个矩阵和通道变换后的矩阵在Image Watch中查看的内容。 #include #include #include #include #include "opencv/highgui.h" using namespace std; using namespace cv; int main(int argc,char** argv) { cout cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3