【Emgu.CV教程】2.13、基本方法之MinMaxLoc()最大值最小值查找

发布时间:2024年01月08日

? ? ? ? 我们可以简单的把图像看成是一个矩阵,图像算法就转换成对这个矩阵的各种操作,比如加减乘除、矩阵转置、归一化等等,这样对以后的函数理解会更直观。

? ? ? ? 在图像分割、颜色处理过程中,经常需要统计出图像内的最大值、最小值,以及他们所在的位置,有没有简单办法呢?一种是自己写算法,用for语句遍及图像,对每个像素点进行判断,实现起来非常简单,但是效率不高。

? ? ? ? 效率高,又简单的办法,是用MinMaxLoc()这个函数。它可以在一副图像中找到最大值、最小值,以及他们所在位置的坐标。函数是这样定义的:

public static void MinMaxLoc(
    IInputArray arr, // 输入图像
    ref double minVal, // 返回最小值的指针。
    ref double maxVal, // 返回最大值的指针。
    ref Point minLoc, // 返回最小值位置的指针 。
    ref Point maxLoc, // 返回最小值位置的指针。
    IInputArray mask = null // 掩码图,和arr尺寸相同,非零的元素才统计
)

? ? ? ?有三点需要注意:

  1. 这个函数的输入图像,必须是单通道的。更直接一点的说法就是,可以输入灰度图,或者彩色空间的指定通道。
  2. 可以使用掩码,黑底白色前景,这样就会只统计?arr 图中与掩码mask对应的白色的部分。
  3. 如果有多个相同的最值,那么返回的坐标是按照从上到下,从左到右的顺序排列的第一个位置。

? ? ? ?这个函数包教包会,我们刚好在第十四篇讲了通道分离,那就尝试一下在一副图片中分别找到蓝色通道、绿色通道、红色通道的极值点及坐标。原始图像是一个500 *500 大小,从上到下分别被纯蓝色、纯绿色、纯红色填充的图片,请诸君看以下代码:

Mat tempMat = srcMat.Clone();
double minValueBlue = 0;
double maxValueBlue = 0;
System.Drawing.Point minLocationBlue = new System.Drawing.Point();
System.Drawing.Point maxLocationBlue = new System.Drawing.Point();
double minValueGreen = 0;
double maxValueGreen = 0;
System.Drawing.Point minLocationGreen = new System.Drawing.Point();
System.Drawing.Point maxLocationGreen = new System.Drawing.Point();
double minValueRed = 0;
double maxValueRed = 0;
System.Drawing.Point minLocationRed = new System.Drawing.Point();
System.Drawing.Point maxLocationRed = new System.Drawing.Point();
Mat[] channels = new Mat[3];
channels = tempMat.Split();
CvInvoke.MinMaxLoc(channels[0], ref minValueBlue, ref maxValueBlue, ref minLocationBlue, ref maxLocationBlue);
CvInvoke.MinMaxLoc(channels[1], ref minValueGreen, ref maxValueGreen, ref minLocationGreen, ref maxLocationGreen);
CvInvoke.MinMaxLoc(channels[2], ref minValueRed, ref maxValueRed, ref minLocationRed, ref maxLocationRed);
MessageBox.Show("蓝色通道最小值为:" + minValueBlue + ",其坐标是:" + minLocationBlue + ",最大值为:" + maxValueBlue + ",其坐标是:" + maxLocationBlue + "\r\n绿色通道最小值为:" + minValueGreen + ",其坐标是:" + minLocationGreen + ",最大值为:" + maxValueGreen + ",其坐标是:" + maxLocationGreen + "\r\n红色通道最小值为:" + minValueRed + ",其坐标是:" + minLocationRed + ",最大值为:" + maxValueRed + ",其坐标是:" + maxLocationRed);

? ? ? ?结果就是下图左边的对话框,?我用线条将数值和原始图像做了对应,是我的原创啊,网上其他作者都没仔细讲解过:

  1. 左上角第一个点坐标是P(0,0),它是蓝色极大值255的返回点,同时也是绿色和红色极小值0的返回点。
  2. 最左边第0列,第171行的绿色点,就是绿色极大值255的返回点,也是蓝色极小值0的返回点。
  3. 最左边第0列,第346行的红色点,就是红色极大值255的返回点。

? ? ? ? ?MinMaxLoc()是一个很有用的函数,读者们可以根据以上代码,多照几张图片试试。

原创不易,请勿抄袭。共同进步,相互学习。

文章来源:https://blog.csdn.net/sswss12345/article/details/135400375
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。