文档章节

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

o
 osc_1ee7cxmx
发布于 2018/08/06 15:15
字数 384
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 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

 运行效果:

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Pytest03-pytest命令行参数

目录 3.pytest命令行参数 3.1 pytest控制台信息详解 3.2 Pytest运行结果类型 3.3 Pytest命令行参数 3.3.1 --collect-only 3.3.2 -k Expression 3.3.3 -m MarkExpr 3.3.4 -x, --exitfirst 3.3......

osc_4ox4jhek
50分钟前
19
0
protocol buffer 基础

我们知道接口传输数据的格式有XML,它是 web services 使用的传输数据的格式,在web services 中叫 WSDL。 https://www.w3school.com.cn/wsdl/index.asp 不过 web Services 已经是被淘汰的技...

osc_ee3ody6v
51分钟前
0
0
SequoiaDB监控与开发实践分析

使用背景 公司近期上线了一个新应用,底层数据库采用了国产的分布式数据库 – SequoiaDB。 因为需要将 SequoiaDB 集群纳入到公司的整个监控体系中,所以需要对 SequoiaDB 的状态、性能指标等...

osc_mf7xwvy6
51分钟前
15
0
Python探索之旅 | 第一部分第三课:初识Python的解释器

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。 转载请注明出处。 原文:https://www.jianshu.com/p/a34eaffcc420 《Python探索之旅》全系列 内容简介 前言 Python 的解释器 Pyth...

osc_wobxrheh
52分钟前
17
0
Python探索之旅 | 第一部分第四课:变量的奇幻世界

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。 转载请注明出处。 原文:https://www.jianshu.com/p/d88e11bc7fec 《Python探索之旅》全系列 内容简介 前言 什么是变量及变量的作...

osc_wyap8yov
53分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部