当前位置: 首页 > 编程笔记 >

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

惠野
2023-03-14
本文向大家介绍c#实现图片二值化例子(黑白效果),包括了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");
      }
    }
  }
}
 类似资料:
  • 本文向大家介绍C#实现绘制浮雕图片效果实例,包括了C#实现绘制浮雕图片效果实例的使用技巧和注意事项,需要的朋友参考一下 本文采用C#实例讲解了处理图片为浮雕效果的实现方法,这在PS中是一个常见的功能,也是C#中的一个简单的图像处理例子。程序先读取原图,然后依次访问每个像素的RGB值,获取相邻两个像素的R、G、B值,计算与左上角像素的RGB分量之差,将计算后的RGB值回写到位图,最后进行图片的浮雕处

  • 本文向大家介绍C#数字图像处理之图像二值化(彩色变黑白)的方法,包括了C#数字图像处理之图像二值化(彩色变黑白)的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#数字图像处理之图像二值化(彩色变黑白)的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我从一个基于html的主题创建了以下网站http://www.nabresco.com。我绝对不是编码位的专家,我想出了我的方法,以便编辑它,以满足我的需要。 该网站正在运行,现在看起来很好。 只剩下一个问题,我似乎弄不明白。 画廊中的图片好像是黑白的,只有当光标在实际选定的图片上时才会变成彩色的。这是发生在一些同事和其他人我正常看它(奇怪?)。 我想改变他们所有的颜色一直没有这种黑白效果。 这些

  • 本文向大家介绍使用css将图片转换成黑白的效果相关面试题,主要包含被问及使用css将图片转换成黑白的效果时的应答技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍Android实现状态栏白底黑字效果示例代码,包括了Android实现状态栏白底黑字效果示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于Android如何实现状态栏白底黑字的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、描述 在项目中有的时候Ui设计状态栏背景颜色是白色的,虽然还挺好看,不过可坑了我们做程序的,需要对很

  • 本文向大家介绍C#图片上传效果实例分析,包括了C#图片上传效果实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#图片上传效果实现方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。