当前位置: 移动技术网 > IT编程>开发语言>c# > c#实现图片二值化例子(黑白效果)

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
c#将图片2值化示例代码,原图及二值化后的图片如下: 原图: 二值化后的图像: 实现代码: using system; using system.

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");
      }
    }
  }
}

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网