栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

c#实现图片二值化例子(黑白效果)

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c#实现图片二值化例子(黑白效果)

C#将图片2值化示例代码,原图及二值化后的图片如下:

原图:

二值化后的图像:

实现代码:

using System;
using System.Drawing;
namespace BMP2Grey
{
  class Program
  {
    static void ToGrey(Bitmap img1)
    {
      for (int i = 0; i < img1.Width; i++)
      {
 for (int j = 0; j < img1.Height; j++)
 {
   Color pixelColor = img1.GetPixel(i, j);
   //计算灰度值
   int grey = (int)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.114 * pixelColor.B);
   Color newColor = Color.FromArgb(grey, grey, grey);
   img1.SetPixel(i, j, newColor);
 }
      }
    }
    static void Thresholding(Bitmap img1)
    {
      int[] histogram = new int[256];
      int minGrayValue=255, maxGrayValue=0;
      //求取直方图
      for (int i = 0; i < img1.Width; i++)
      {
 for (int j = 0; j < img1.Height; j++)
 {
   Color pixelColor = img1.GetPixel(i, j);
   histogram[pixelColor.R]++;
   if (pixelColor.R > maxGrayValue) maxGrayValue = pixelColor.R;
   if (pixelColor.R < minGrayValue) minGrayValue = pixelColor.R;
 }
      }
      //迭代计算阀值
      int threshold = -1;
      int newThreshold = (minGrayValue + maxGrayValue) / 2;
      for(int iterationTimes = 0; threshold != newThreshold && iterationTimes < 100; iterationTimes++)
      {
 threshold = newThreshold;
 int lP1 =0;
 int lP2 =0;
 int lS1 = 0;
 int lS2 = 0;
 //求两个区域的灰度的平均值
 for (int i = minGrayValue;i < threshold;i++)
 {
   lP1 += histogram[i] * i;
   lS1 += histogram[i];
 }
 int mean1GrayValue = (lP1 / lS1);
 for (int i = threshold+1;i < maxGrayValue;i++)
 {
   lP2 += histogram[i] * i;
   lS2 += histogram[i];
 }
 int mean2GrayValue = (lP2 / lS2);
 newThreshold = (mean1GrayValue + mean2GrayValue) / 2;
      }
      //计算二值化
      for (int i = 0; i < img1.Width; i++)
      {
 for (int j = 0; j < img1.Height; j++)
 {
   Color pixelColor = img1.GetPixel(i, j);
   if (pixelColor.R > threshold) img1.SetPixel(i, j, Color.FromArgb(255, 255, 255));
   else img1.SetPixel(i, j, Color.FromArgb(0, 0, 0));
 }
      }
    }
    static void Main(string[] args)
    {
      try
      {
 //打开位图文件
 Bitmap img1 = new Bitmap("test.jpg", true);
 //灰度化
 ToGrey(img1);
 //二值化
 Thresholding(img1);
 //写回位图文件
 img1.Save("output.jpg");
 Console.WriteLine("Converted.");
      }
      catch (ArgumentException)
      {
 Console.WriteLine("Invalid usage!");
 Console.WriteLine("Usage: bmp2grey source object");
      }
    }
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/126226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号