文档章节

c#简单实现图片二值化

han_zh
 han_zh
发布于 2014/12/01 21:29
字数 408
阅读 194
收藏 0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace FacePreprocessing.FaceLib
{
     //大津法
    public class Ostu
    {
        private const int GrayNum = 256;        //灰度值
        private int[] GrayArr=new int[GrayNum];   //灰度值数组
        private int[] PixArr;
        private double w0;  //背景灰度概率
        private double w1;  //前景灰度概率
        private int IMG_HEIGHT;
        private int IMG_WIDTH;
        private int PixNum;
        private Bitmap pic;
        public Ostu(Bitmap pic)
        {
            this.pic = pic;
            IMG_HEIGHT = pic.Height;
            IMG_WIDTH = pic.Width;
            PixNum = IMG_HEIGHT * IMG_WIDTH;
            PixArr = new int[PixNum];
            SetGrayArr();


        }
        /// <summary>
        /// 获取灰度值数组,并求每种灰度所占的比例
        /// </summary>
        /// <returns>无</returns>
        private void SetGrayArr()
        {

            for (int i = 0; i < IMG_HEIGHT; i++)
            {
                for (int j = 0; j < IMG_WIDTH; j++)
                {
                    Color color=pic.GetPixel(j, i);
                    int gray=(int)(0.39*color.R+0.50*color.G+0.11*color.B);
                    PixArr[i * IMG_WIDTH + j] =gray;            //设置像素数组
                    GrayArr[PixArr[i * IMG_WIDTH + j]]++;   //求灰度数组,元素为每种灰度的数量
                }
            }
                  

        }
        /// <summary>
        /// 获取阈值
        /// </summary>
        /// <returns>阈值</returns>
        private int GetVal()
        {
            double u0;  //背景灰度均值
            double u1;  //前景灰度均值
            double maxVal = 0;  //类间方差最大值
            int endval = 0;
            for (int i = 0; i < GrayNum; i++)
            {
                w1 = w0 =u0=u1=0;
                for (int j = 0; j < GrayNum; j++)
                {
                    if (j <= i)
                    {
                        w0 += GrayArr[j] /(PixNum*1.0);  //每种灰度的概率
                        u0 += GrayArr[j] / (PixNum * 1.0) * j;
                    }
                    else 
                    {
                        w1 += GrayArr[j] / (PixNum*1.0);
                        u1 += GrayArr[j] / (PixNum * 1.0) * j;
                    }
                }
                u0 = u0 / w0;
                u1 = u1 / w1;
                double val=w1*w0*Math.Pow(u0-u1,2);
                if (maxVal < val)
                {
                    maxVal = val;
                    endval = i;  //阈值
                }
            }
            return endval;
        }
        /// <summary>
        /// 图像二值化
        /// </summary>
        /// <returns>无</returns>
        private void TurnGray()
        {
            int val = GetVal();
            for (int i = 0; i < IMG_HEIGHT; i++)
            {
                for (int j = 0; j < IMG_WIDTH; j++)
                {
                    Color color = pic.GetPixel(j, i);
                    int gray = (int)(0.39 * color.R + 0.50 * color.G + 0.11 * color.B);
                    if (gray > val)
                    {
                        pic.SetPixel(j, i, Color.FromArgb(255, 255, 255));
                    }
                    else 
                    {
                        pic.SetPixel(j, i, Color.FromArgb(0, 0, 0));
                    }
                }
            }
        }
        /// <summary>
        /// 返回二值化后的图像
        /// </summary>
        /// <returns>图像</returns>
        public Bitmap RetrunPicture()
        {
            TurnGray();
            return pic;
        }

    }
}


© 著作权归作者所有

han_zh
粉丝 0
博文 2
码字总数 985
作品 0
广州
私信 提问
C# WinForm开发系列 - GDI+

UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序。UI编程体现在两个方...

长征2号
2017/11/14
0
0
灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一、RGB RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,R(red)、G(green)、B(blue),就可以使它们按照不同的比例混合,在屏幕上呈...

li_wen01
2017/06/05
0
0
C# 图像编程 (1) 准备工作; 你好,空姐; 为空姐照片添加特效

很久之前,就想写一系列C#图像编程的文章,但始终没有下笔,其主要原因有二:(1)我的C#图像处理库 Geb.Image 库在大幅度变动中;(2)没有找到一个很好的演示工具。现在,对于第一个问题,...

最美的回忆
2017/01/26
0
0
使用python PIL库实现简单验证码的去噪

首先要感谢一下字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的。 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对...

u012067766
2018/04/20
0
0
C# 提取PPT文本和图片的实现方案

在图文混排的文档中,我们可以根据需要将文档中的文字信息或者图片提取出来,通过C#代码可以提取Word和PDF文件中的文本和图片,那么同样的,我们也可以提取PPT幻灯片当中的文本和图片。本篇文...

E_iceblue
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
1
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
1
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
2
0
今天的学习

今天学到了<select></select>标签: <label for="unittype">Select unit type: </label><select id="unittype" name="unittype" autofocus > <option value="1"> Miner </option> ......

墨冥
昨天
2
0
程序员随想-关于分享

最早的时候,文字是贵族这些上层人士才会学习的,底层人士没有资格和渠道去学习,同样用文字、图像等其他载体承载的知识大部分也只有贵族阶层才能享受的。后来有了造纸术、印刷术,成本降低,...

Lubby
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部