zoukankan      html  css  js  c++  java
  • c#实现图片二值化例子(黑白效果)

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

    原图:

    二值化后的图像:

    实现代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    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");
          }
        }
      }
    }
  • 相关阅读:
    JavaWeb_Tomcat_Maven!
    java异常!
    JavaWeb获取web.xml初始参数!getInitParameter
    JavaWeb文件下载!
    Java抽象接口!
    JavaWeb初识Servlet!
    关于HashMap以对象作为Key的实现及踩坑
    浅析.Net下的多线程编程(2)
    获取浏览器分辨率
    浅析.Net下的多线程编程(1)
  • 原文地址:https://www.cnblogs.com/waw/p/5484148.html
Copyright © 2011-2022 走看看