C#迭代法图像二值化处理

news/2024/7/21 7:11:44 标签: c#, 图像处理
 		private void 图片二值化ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            if (m_Bitmap!=null)
            {
                Rectangle rect = new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height);
                BitmapData bmpData = m_Bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, m_Bitmap.PixelFormat);
                IntPtr ptr = bmpData.Scan0;
                int bytes = m_Bitmap.Width * m_Bitmap.Height*3;
                byte[] grayValues = new byte[bytes];
                
                System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);

                byte temp = 0;
                byte T = 0;
                byte maxGray = 0;
                byte minGray = 255;
                int[] countPixel = new int[256];
                double mu1, mu2;
                double numerator, denominator;

                //计算直方图
                for (int i = 0; i < grayValues.Length; i++)
                {
                    temp = grayValues[i];
                    countPixel[temp]++;
                    if (temp > maxGray) 
                    {
                        //最大灰度等级
                        maxGray = temp;
                    }
                    if (temp < minGray) 
                    {
                        //最小灰度等级
                        minGray = temp;
                    }
                }

                //迭代法
                byte oldT;
               
                //初始阈值
                T = oldT = Convert.ToByte((maxGray + minGray) / 2);

                //迭代过程
                do
                {
                    oldT = T;
                    numerator = denominator = 0;

                    //迭代法公式1
                    for (int i = minGray; i <T; i++)
                    {
                        numerator += i * countPixel[i];
                        denominator += countPixel[i];
                    }
                    mu1 = numerator / denominator;

                    numerator = denominator = 0;
                    for (int i = T; i < maxGray; i++)
                    {
                        numerator += i * countPixel[i];
                        denominator += countPixel[i];
                    }

                    mu2 = numerator / denominator;

                    //迭代法公式2
                    T = Convert.ToByte((mu1 + mu2)/2);
                }
                while (T!=oldT);

                //图像二值化
                for (int i = 0; i < bytes ; i++)
                {
                    if (grayValues[i]<T)
                    {
                        grayValues[i] = 0;
                    }
                    else
                    {
                        grayValues[i] = 255;
                    }
                }
                System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
                m_Bitmap.UnlockBits(bmpData);
                pictureBox1.Image = m_Bitmap;
            }
           
           
        }


http://www.niftyadmin.cn/n/1783378.html

相关文章

server2008DNS服务器配置一

一、新建DNS服务器二、创建正向查找区域三、添加资源记录四、客户端验证配置信息 五、创建反向查找区域 六、添加PTR记录 七、客户端验证 八、在Vfast中建立A.VFAST.COM九、在Text中建立A.TEXT.COM十、使得Vfast和Vtext能相互解析&#xff08;方法一&#xff09;十一、委派、根…

用telnet登录邮件服务器发送邮件!

最近具体的了解了一下邮件服务器的内部工作原理&#xff01;顺便在dos下面用telnet实现发送跟接受查看邮件的命令。分享如下&#xff1a; telnet adddress port ehlo address //向smtp服务器say hello&#xff01;auth login //选择服务器用户名密码验证登录用户名密码 …

C#自动阈值选择:Otsu法

Otsu法是一种使类间方差最大的阈值确定方法&#xff0c;所以也称最大类间方差法。该方法具有简单、处理速度快等特点。是一种常用的阈值选取方法。 其基本思想是&#xff1a; 把图像中的像素按灰度值用阈值T分成两类C1和C2,C1有灰度值在0~T之间的像素组成&#xff0c;C2由灰度…

SAP IDES

SAP IDES SAP 产品分三类&#xff0c;第一类叫“标准”版本&#xff0c;就是SAP正版用户使用的系统。 第二类叫IDES&#xff0c;是一个类似“标准”版本的虚拟学习环境&#xff0c;带各个模块&#xff0c;也可以开发。 第三类叫Minisap, &#xff0c;顾名思义&#xff0c;这个版…

C#自动阈值选择:Otsu法编程实例(图像分割)

//Otsu阈值private void OtsuToolStripMenuItem_Click(object sender, EventArgs e){if (m_Bitmap ! null){Rectangle rect new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height);BitmapData bmpData m_Bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWr…

继承的基本用法

1.继承的好处&#xff1a;可以减少重复的代码 2.语法&#xff1a; class A : public B A为子类或者派生类B为父类或基类 3.派生类中的成员包含两大部分&#xff1a; 一类是从基类继承过来的&#xff0c;一类是自己增加的成员从基类继承过来的表现其共性&#xff0c;而新增的…

iPhone OS SDK的这些事[安装、下载、版本、实例、脱机文档等资料汇总]

第一次使用iPhone SDK是&#xff0c;如果不清楚版本和操作系统等的关系&#xff0c;会浪费很多的时间进行下载和安装。 以下汇总了一些常见可以尽快使用的方法和参考。 SDK安装 切记选择和自己的mac os系统吻合的版本&#xff0c;下载包都很大&#xff0c;国内需要很长的时间下…

nutch与起点R3集成之笔记(二)

为什么80%的码农都做不了架构师&#xff1f;>>> 在nutch与起点R3集成之笔记&#xff08;一&#xff09;中介绍了在起点R3中添加nutch要用到的索引字段&#xff0c;上述字段建好后&#xff0c;就可以通过nutch抓取一个或多个网站内容&#xff0c;并通过 bin/nutch s…