? ? ? ? 我们可以简单的把图像看成是一个矩阵,图像算法就转换成对这个矩阵的各种操作,比如加减乘除、矩阵转置、归一化等等,这样对以后的函数理解会更直观。
? ? ? ? 在图像分割、颜色处理过程中,经常需要统计出图像内的最大值、最小值,以及他们所在的位置,有没有简单办法呢?一种是自己写算法,用for语句遍及图像,对每个像素点进行判断,实现起来非常简单,但是效率不高。
? ? ? ? 效率高,又简单的办法,是用MinMaxLoc()这个函数。它可以在一副图像中找到最大值、最小值,以及他们所在位置的坐标。函数是这样定义的:
public static void MinMaxLoc(
IInputArray arr, // 输入图像
ref double minVal, // 返回最小值的指针。
ref double maxVal, // 返回最大值的指针。
ref Point minLoc, // 返回最小值位置的指针 。
ref Point maxLoc, // 返回最小值位置的指针。
IInputArray mask = null // 掩码图,和arr尺寸相同,非零的元素才统计
)
? ? ? ?有三点需要注意:
? ? ? ?这个函数包教包会,我们刚好在第十四篇讲了通道分离,那就尝试一下在一副图片中分别找到蓝色通道、绿色通道、红色通道的极值点及坐标。原始图像是一个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);
? ? ? ?结果就是下图左边的对话框,?我用线条将数值和原始图像做了对应,是我的原创啊,网上其他作者都没仔细讲解过:
? ? ? ? ?MinMaxLoc()是一个很有用的函数,读者们可以根据以上代码,多照几张图片试试。
原创不易,请勿抄袭。共同进步,相互学习。