openCV(c++)实现Halcon中的min_max_gray函数的功能

在halcon中有一个求最大最小灰度值的算子min_max_gray,算子的形式为
min_max_gray(Regions, Image : : Percent : Min, Max, Range)
其中Regions参数为ROI区域,也就是需要计算最大最小灰度值的区域。
Image是需要计算最大最小灰度值的图像,如果传入的是RGB三通道图像,则算子自动将彩色图像转换为黑白图像进行计算。
Min是最小的灰度值。
Max是最大灰度值。
Range是灰度值的跨度,也就是Max-Min的值。
Percent这个是百分比参数,个人觉得作用非常大。在halcon的帮助文档中是这样介绍的“Percentage below (above) the absolute maximum (minimum).”。翻译过来是“高于(低于)最大(最小)值的百分比”。对于这个解释可能不是很好理解,经过多次测试,发现这个参数的实际意义是这样。如果percent参数设置为5,那么图像中灰度值最大和最小的5%的像素不参与最大最小灰度值的计算。例如:宽为256高为1的图像,包含从0到255范围内的每一个灰度的像素,即图象是这样
[0,1,2,3,4,5,7,8…251,252,253,254,255]
如果percent设置为5,那么忽略掉5%的最大最小像素,即忽略256*5%=10.24个像素,即10个像素,因此最大的10个像素[246,247,248,249,250,251,252,253,254,255]和最小的10个像素[0,1,2,3,4,5,6,7,8,9]被忽略,再次强调忽略的是10个像素,而不是10个像素级。此时min_max_gray这个算子返回的的最大值是245,最小值是10。当percent=50时,min=max,当percent=0,因为这个参数的存在,所以在计算最大最小灰度值的时候,可以通过对该参数进行设置从而计算出大趋势下的极大值和极小值,避免存在极亮或极暗的点而造成干扰。
在openCV中也存在计算极大极小值的函数,如minMaxLoc和minMaxIdx,两者都是计算极值,但是存在一个共同的问题,就是如果图像存在极值点,例如椒盐噪声,那么利用这两个函数计算出的极值就可能会受到干扰。在网上找了一下,没有发现openCV中查找极值的函数有类似min_max_gray算子中percent功能的参数。
由于项目采用openCV开发,使用到了percent参数所提供的功能,因此自己利用直方图写了一个简单的算法。函数没有判断图像通道数,图像位数等功能,只是实现了基本功能。下面贴出具体的代码:

void minMaxGray(const Mat image, int percent, int &maxValue, int &minValue)
{percent = percent > 50 ? 50 : percent;//忽略的百分比最大为50%int histSize = 256;//bin数目float range[] = { 0, 255 };//灰度范围const float* histRange = { range };Mat hist;calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);// 计算直方图:float totalPix = image.rows*image.cols;//计算图像的总像素数目float ignorePixMax, ignorePixMin;ignorePixMax = ignorePixMin = round(totalPix*percent / 100);//计算忽略的最大值最小值像素数目bool maxFlag = false, minFlag = false;//最大最小值遍历结束标志位maxValue= 255, minValue= 0;//计算出的最大最小灰度值for (int i = 0; i < histSize; i++){//遍历所有bin,即灰度等级if (maxFlag == false && ignorePixMax - hist.at<float>(255 - i) >= 0){//如果忽略的像素数超过当前bin中的像素数目,则最大灰度值向下递减一个灰度值ignorePixMax = ignorePixMax - hist.at<float>(255 - i);maxValue= 255 - i - 1;}else{maxFlag = true;//找到最大值,标志位置ture}if (minFlag == false && ignorePixMin - hist.at<float>(i) >= 0){ignorePixMin = ignorePixMin - hist.at<float>(i);minValue= i + 1;}else{minFlag = true;//找到最小值,标志位置ture}if (maxFlag&&minFlag){break;//找到最大最小值,跳出循环}}
}

对编写的这段代码进行了测试,选择了一张图像分别利用这段代码和halcon中的min_max_gray算子进行极值点的计算,percent分别给了0,4,5,10,30,50,两者检测结果均相同。

补充:min_max_gray算子可以设定ROI区域,也就在划定的区域范围计算极值。在上面给出的代码中稍加修改即可实现类似的功能,程序中利用calccHist函数计算直方图,
calcHist(&srcImage, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false)
其中传入的第4个参数即掩膜图像,也就是ROI区域,通过传递一个掩膜图像即可限定计算极值的区域范围。
水平有限,难免有错误和不足之处,恳请批评指正。

利用openCV(C++)实现Halcon中的min_max_gray函数的功能相关推荐

  1. 利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)

    利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能) 在halcon图像库中有一个常用的中值滤波算子median_rect: median_rec ...

  2. 利用 Windows Vista 和 WCF 中强大的 P2P 通信功能[MSDN]

    点对点技术 利用 Windows Vista 和 WCF 中强大的 P2P 通信功能 发布日期: 2006-10-17 | 更新日期: 2006-10-17 Justin Smith 本文基于 Win ...

  3. C语言中fun的功能是将字符串,下列给定的程序中,fun()函数的功能是:将p所指字符串中......

    下列给定的程序中,fun()函数的功能是:将p所指字符串中每个单词的最后一个字母改成大写(这里的"单词"是指有空格隔开的字符串).例如,若输入: I am a student to ...

  4. C语言试题二十二之定义了3×3的二维数组,并在主函数中赋值。函数的功能使求出数组周边元素的平均值并作为函数值返回给主函数中的s。

    1. 题目 定义了3×3的二维数组,并在主函数中赋值.函数的功能使求出数组周边元素的平均值并作为函数值返回给主函数中的s. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试 ...

  5. VB中的mid函数的功能及参数

    VB中的mid函数的功能及参数 1.来自MSDN Mid 函数 返回 Variant (String),其中包含字符串中指定数量的字符. 语法 Mid(string, start[, length]) ...

  6. opencv 识别长方形_利用opencv识别并提取图片中的矩形

    这次是利用opencv来识别图片中的矩形. 其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合. 过程如下: **1. 对输入灰度图片进行高斯滤波 2. 做灰度直方图,提取阈值,做二值化处理 ...

  7. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析

    OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...

  8. OpenCV 找出图像中最小值最大值函数minMaxLoc的使用

    功能:从一个矩阵中找出全局的最大值和最小值. 函数cv::minMaxLoc找出最大和最小元素的值和他们的位置.极值是遍历整个矩阵找到,或者当掩码不是一个空矩阵时,是通过遍历指定矩阵区域找到. 函数不 ...

  9. Halcon中降采样函数

    Halcon中降采样有以下函数: gen_gauss_pyramid 与 zoom_image_factor 当然zoom_image_factor还可以升采样,本文只讨论降采样.以400×400单通 ...

最新文章

  1. java基础入门传智播客 源码_Java-_2020年版Java零基础视频教程(Java 0基础,Java初学入门)魔鬼讲师老杜出品...
  2. CopyOnWriteArrayList源码分析
  3. Web应用开发技术(2)-html
  4. 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
  5. java切入式编程显示屏_C语言嵌入式系统编程修炼之四:屏幕操作
  6. 计算机网络课制作双绞线实验,《计算机网络》课程实验——网线制作.pdf
  7. CS0656 缺少编译器要求的成员“Microsoft.CSharp..........
  8. unity技能框架_如何使用指导框架学习新技能
  9. STM32H7时钟树RCC分析---原理讲解(一)
  10. 基本排序(C语言版)
  11. Kubernetes之Pod生命周期详解
  12. matlab字符串转换
  13. 3月2日 雾霾图像清晰化处理,第1人称相机世界的坐标系,焦距、焦点、调焦、超焦距、视场角、滑动变焦Dolly zooming,相机内参
  14. 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型
  15. 【海码学院】web前端基础入门JavaScript之JavaScript起源和基础语法学习笔记
  16. Voxblox: Incremental 3D Euclidean Signed Distance Fields for On-Board MAV Planning
  17. DataCastle[职位预测竞赛]冠军——我们都爱苍老师
  18. 汇编语言上机的4个步骤
  19. css样式 向下补白,DIVCSSpadding内补白(内边距)leftrighttopbottom_html/css_WEB-ITnose
  20. Bias-Variance Tradeoff(权衡偏差与方差)

热门文章

  1. [导入]楼市十大卖楼花招曝光〔转载〕
  2. Android: 渠道号获取
  3. 基于word2vec或doc2vec的情感分析
  4. 趋势科技Pc-cillin 2011网友使用体验
  5. Python给手机发通知
  6. ABAQUS 建模及分析流程(一)
  7. 计算机主机版bga球径,BGA
  8. IE11不兼容array.from()解决方法
  9. 18 人教小学五年级上册《除数是整数的小数除法》(五上)
  10. C语言大一课设:旭日苑菜品管理系统