原文:Win8 Metro(C#)数字图像处理--2.57一维最大熵法图像二值化



[函数名称]

一维最大熵法图像二值化WriteableBitmap EntropymaxThSegment(WriteableBitmap src)

[算法说明]

一维最大熵法图像分割就是利用图像的灰度分布密度函数定义图像的信息熵,通过优化一定的熵

准则得到熵最大时对应的阈值,从而进行图像分割的方法。

算法过程:

1,对于一幅灰度图像,灰度范围为[0,L-1],求取图像的最小灰度级min,最大灰度级max;

[函数代码]

  1. /// <summary>
  2. /// Entropy max method of image segmention.
  3. /// </summary>
  4. /// <param name="src">The source iamge.</param>
  5. /// <returns></returns>
  6. public static WriteableBitmap EntropymaxThSegment(WriteableBitmap src) ////一维熵最大法阈值分割
  7. {
  8. if (src != null)
  9. {
  10. int w = src.PixelWidth;
  11. int h = src.PixelHeight;
  12. WriteableBitmap dstImage = new WriteableBitmap(w, h);
  13. byte[] temp = src.PixelBuffer.ToArray();
  14. byte[] tempMask = (byte[])temp.Clone();
  15. //定义灰度图像信息存储变量
  16. int[] srcData = new int[w * h];
  17. //定义阈值变量
  18. int Th = 0;
  19. //定义直方图存储变量
  20. int[] histogram = new int[256];
  21. //定义熵值变量
  22. double Ht = 0.0;
  23. double Hl = 0.0;
  24. double sigma = 0.0;
  25. //定义灰度最值变量
  26. int max = 0;
  27. int min = 255;
  28. //定义临时变量
  29. double t = 0.0, pt = 0.0, tempMax = 0.0;
  30. int tempV = 0;
  31. for (int j = 0; j < h; j++)
  32. {
  33. for (int i = 0; i < w; i++)
  34. {
  35. tempV = (int)((double)tempMask[i * 4 + j * w * 4] * 0.114 + (double)tempMask[i * 4 + 1 + j * w * 4] * 0.587 + (double)tempMask[i * 4 + 2 + j * w * 4] * 0.299);
  36. srcData[i + j * w] = tempV;
  37. histogram[tempV]++;
  38. if (tempV > max)
  39. {
  40. max = tempV;
  41. }
  42. if (tempV < min)
  43. {
  44. min = tempV;
  45. }
  46. }
  47. }
  48. for (int i = min; i < max; i++)
  49. {
  50. t = (double)((double)histogram[i] / (double)(w * h));
  51. if (t > 0.00000001)
  52. {
  53. Hl += -t * Math.Log10(t);
  54. }
  55. else
  56. continue;
  57. }
  58. for (int i = min; i < max; i++)
  59. {
  60. t = (double)((double)histogram[i] / (double)(w * h));
  61. pt += t;
  62. if (t > 0.00000001)
  63. {
  64. Ht += -t * Math.Log10(t);
  65. sigma = Math.Log10(pt * (1 - pt)) * Ht / pt + (Hl - Ht) / (1 - pt);
  66. if (sigma > tempMax)
  67. {
  68. tempMax = (int)sigma;
  69. Th = i;
  70. }
  71. }
  72. else
  73. continue;
  74. }
  75. for (int j = 0; j < h; j++)
  76. {
  77. for (int i = 0; i < w; i++)
  78. {
  79. temp[i * 4 + j * w * 4] = temp[i * 4 + 1 + j * w * 4] = temp[i * 4 + 2 + j * w * 4] = (byte)(srcData[i + j * w] < Th ? 0 : 255);
  80. }
  81. }
  82. Stream sTemp = dstImage.PixelBuffer.AsStream();
  83. sTemp.Seek(0, SeekOrigin.Begin);
  84. sTemp.Write(temp, 0, w * 4 * h);
  85. return dstImage;
  86. }
  87. else
  88. {
  89. return null;
  90. }
  91. }

Win8 Metro(C#)数字图像处理--2.57一维最大熵法图像二值化的更多相关文章

  1. Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化  [函数名称]   P分位法图像二值化 [算法说明]   所谓P分位法图像分割,就是在知道图像中目标所占的比率Rat ...

  2. Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效

    原文:Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效 /// <summary> /// Image merge process. /// </summar ...

  3. Win8 Metro(C#)数字图像处理--2.55OSTU法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.55OSTU法图像二值化  [函数名称] Ostu法图像二值化      WriteableBitmap OstuThSegment(Writ ...

  4. Win8 Metro(C#)数字图像处理--2.58双峰法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.58双峰法图像二值化  [函数名称]   双峰法图像二值化 WriteableBitmap  PeakshistogramThSegment( ...

  5. Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法  [函数名称]   高斯平滑滤波器      GaussFilter(WriteableBitmap src,int r ...

  6. Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换

    原文:Win8 Metro(C#)数字图像处理--2.53图像傅立叶变换  [函数名称] 1,一维FFT变换函数         Complex[] FFT(Complex[] sourceDat ...

  7. Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法

    原文:Win8 Metro(C#)数字图像处理--2.75灰度图像的形态学算法 前面章节中介绍了二值图像的形态学算法,这里讲一下灰度图的形态学算法,主要是公式,代码略. 1,膨胀算法 2,腐蚀算法 3 ...

  8. Win8 Metro(C#)数字图像处理--4图像颜色空间描述

    原文:Win8 Metro(C#)数字图像处理--4图像颜色空间描述  图像颜色空间是图像颜色集合的数学表示,本小节将针对几种常见颜色空间做个简单介绍. /// <summary> / ...

  9. Win8 Metro(C#)数字图像处理--3.2图像方差计算

    原文:Win8 Metro(C#)数字图像处理--3.2图像方差计算 /// <summary> /// /// </summary>Variance computing. / ...

随机推荐

  1. [Most.js] Create Streams From Single Values With Most.js

    Most provides many means for creating streams, the simplest of which is the offunction. In this less ...

  2. 【Linux】Linux下配置apache - 安装文件夹具体解释

    一,apache安装路径解释 默认安装路径   /var/apache2 # /etc/apache2/ # |-- apache2.conf # | `--  ports.conf # |-- mo ...

  3. Android 带清除功能的输入框控件EditTextWithDel

    记录下一个非常有用的小控件EditTextWithDel.就是在Android系统的输入框右边增加一个小图标.点击小图标能够清除输入框里面的内容,由于Android原生EditText不具备此功能,所 ...

  4. C++ 指向类成员函数指针的用法(转自维基百科)

    类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...

  5. 学习鸟哥的Linux私房菜笔记(9)——bash1

    一.Shell简介 Shell :命令行解释器,是用户与系统沟通时的媒介 在Unix系统中有各种Shell, Linux采用bash为其默认shell 系统可以使用的shell记录在 /etc/she ...

  6. 开源项目学习之------AG-Admin环境搭建

    原文地址: https://blog.csdn.net/u011781521/article/details/79056974 一.框架简介 AG-Admin是基于Spring Cloud微服务化开发 ...

  7. 【27.40%】【codeforces 599D】Spongebob and Squares

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. 【33.33%】【codeforces 608C】Chain Reaction

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. hadoop 3.x org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/":tele:supergroup:drwxr-xr-x

    权限不足,上传文件时应当使用启动hadoop的账户,即在获取FileSystem时就应当指定用户 修改后的代码 public class Demo1 { public static void main ...

  10. 《iOS8 Swift编程指南》类书图像

    终于拿到了样书.虽然已经猜到这将是一本很厚的书(63万字),但要真正看到实体书或者当我吃了一惊: 从以下这张照片看则更直观了.居然比艾伦.J.马库斯的<投资学>(634页)还要厚: 这本书 ...