1 #include <opencv2/imgproc/imgproc.hpp>
 2 #include <opencv2/core/core.hpp>
 3 #include <opencv2/highgui/highgui.hpp>
 4 #include <iostream>
 5
 6 using namespace cv;
 7 using namespace std;
 8
 9 //按给定的threshold,计算hist的背景熵和目标熵的总和
10 float caculateCurrentEntropy(Mat hist, int threshold)
11 {
12     float BackgroundSum = 0, targetSum = 0;
13     const float* pDataHist = (float*)hist.ptr<float>(0);
14     for (int i = 0; i < 256; i++)
15     {
16         //累计背景值
17         if (i < threshold)
18         {
19             BackgroundSum += pDataHist[i];
20         }
21         //累计目标值
22         else
23         {
24             targetSum += pDataHist[i];
25         }
26     }
27     cout << BackgroundSum << "\t" << targetSum << endl;
28     float BackgroundEntropy = 0, targetEntropy = 0;
29     for (int i = 0; i < 256; i++)
30     {
31         //计算背景熵
32         if (i < threshold)
33         {
34             if (pDataHist[i] == 0)
35                 continue;
36             float ratio1 = pDataHist[i] / BackgroundSum;
37             //计算当前能量熵
38             BackgroundEntropy += -ratio1*logf(ratio1);
39         }
40         else  //计算目标熵
41         {
42             if (pDataHist[i] == 0)
43                 continue;
44             float ratio2 = pDataHist[i] / targetSum;
45             targetEntropy += -ratio2*logf(ratio2);
46         }
47     }
48     return (targetEntropy + BackgroundEntropy);
49 }
50 //寻找最大熵阈值并分割,根据该阈值进行二值化
51 Mat maxEntropySegMentation(Mat inputImage)
52 {
53     const int channels[1] = { 0 };
54     const int histSize[1] = { 256 };
55     float pranges[2] = { 0,256 };
56     const float* ranges[1] = { pranges };
57     MatND hist;
58     calcHist(&inputImage, 1, channels, Mat(), hist, 1, histSize, ranges);
59     float maxentropy = 0;
60     int max_index = 0;
61     Mat result;
62     for (int i = 0; i < 256; i++)
63     {
64         float cur_entropy = caculateCurrentEntropy(hist, i);
65         if (cur_entropy > maxentropy)
66         {
67             maxentropy = cur_entropy;
68             max_index = i;
69         }
70     }
71     threshold(inputImage, result, max_index, 255, CV_THRESH_BINARY);
72     return result;
73 }
74 int main()
75 {
76     Mat srcImage = imread("D:\\hand.jpg");
77     if (!srcImage.data)
78         return -1;
79     Mat grayImage;
80     cvtColor(srcImage, grayImage, CV_BGR2GRAY);
81     Mat result = maxEntropySegMentation(grayImage);
82     imshow("grayImage", grayImage);
83     imshow("result", result);
84     waitKey(0);
85     return 0;
86 }

View Code

运行效果:

转载于:https://www.cnblogs.com/thebreakofdawn/p/9430349.html

3.6.1最大熵阈值分割寻找阈值实现图像二值化相关推荐

  1. otsu阈值分割算法原理_OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  2. 利用最大熵进行阈值分割从而实现灰度图像的二值化的原理概要及OpenCV代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 详细的数学原理目前我也没搞明白,所以只说下原理概 ...

  3. 图像二值化处理(全局阈值 自适应阈值 手动阈值操作以及直方图画法)

    文章目录 图像二值化处理 二值化原理 API介绍 手动设置阈值 均值法 迭代法 自动设置阈值 直方图法 全局阈值法 OTSU法 三角形法 自适应阈值法 API 绘制图像直方图 图像二值化处理 二值化原 ...

  4. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

  5. OTSU_图像二值化分割阈值的算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  6. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  7. C#,图像二值化(15)——全局阈值的一维最大熵(1D maxent)算法及源程序

    1.最大熵(maxent) 最大熵(maxent)方法植根于信息理论,并已成功应用于许多领域,包括物理学和自然语言处理.它创建了一个模型,该模型最好地解释了可用数据,但有一个约束,即在没有任何附加信息 ...

  8. opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化

    基础版笔记链接: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版二值化讲解 opencv ...

  9. C#,图像二值化(20)——全局阈值的耶恩算法(Yen Thresholding)及源代码

    1 全局阈值的耶恩算法(Yen Throsholding) 常见阈值算法 1.1黄算法 HuangThresholdImageFilter使用Shannon的熵函数实现Huang的模糊阈值[1].模糊 ...

  10. 图像二值化_三角阈值法

    前言 一.三角阈值法是什么? 二.算法原理 1.算法 总结 参考文献 前言 图像二值化有很多方法,比较经典的为OTSU,三角阈值法,本文主要想一探三角阈值法的算法原理. 一.三角阈值法是什么? 三角阈 ...

最新文章

  1. 最快捷的Linux命令查询工具来了:「我该怎么做XX」,一句话自动返回操作指南...
  2. python booleans_Python 2.1 BooleansComparisons
  3. python虚拟环境的使用
  4. python去重语句_Python对列表去重的多种方法(四种方法)
  5. 用border做三角形
  6. 用MaskNetwork代币MASK首轮公开销售已结束,今晚23:00将进行第二轮售卖
  7. topsis法_论文荐读|基于风险响应概念模型和改进TOPSIS模型的半干旱流域生态风险综合评价——以渭河流域为例...
  8. 广告公司管理软件介绍
  9. 图像压缩工具ImageOptim介绍
  10. 大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)
  11. 设置计算机用户权限,计算机管理员权限在哪里设置_电脑系统如何设置管理员权限-win7之家...
  12. 谱密度 matlab,功率谱密度估计方法的matlab实现.doc
  13. java后端实现集成支付宝APP支付(沙箱环境)
  14. php输出世界时转北京时,php中把美国时间转为北京时间的自定义函数分享
  15. Oracle 自动存储管理 (ASM)
  16. 拉格朗日对偶问题的一些介绍
  17. 嵌入式开发入门之经典 ARM开发板
  18. 悟空CRM-11.0正式开源发布!
  19. 横板格斗类游戏实战:游戏数值策划表
  20. 能源变革--数字孪生变电站,机器人巡检更胜一筹!

热门文章

  1. C# DateTime 日期加1天 减一天 加一月 减一月 等方法
  2. 《设计模式详解》行为型模式 - 中介者模式
  3. 【恋上数据结构】图基础知识介绍
  4. 【恋上数据结构】冒泡排序、选择排序、堆排序
  5. [转]5个有趣的Python小知识,返回结果让人出乎意料~
  6. Linux上的ffmpeg完全使用指南
  7. 期货品种产业链图表_工业
  8. 银行有没有必要建立数据中台?看看这些架构师和技术总监怎么说
  9. 论制造业的报表开发项目需求
  10. views是什么意思_views是什么意思_views怎么读_views翻译_用法_发音_词组_同反义词_看( view的名词复数 )-新东方在线英语词典...