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

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

在图像分割、颜色处理过程中,经常需要统计出图像内的最大值、最小值,以及他们所在的位置,有没有简单办法呢?一种是自己写算法,用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()是一个很有用的函数,读者们可以根据以上代码,多照几张图片试试。

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

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值