标签:
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" ); } } } } |
标签:
原文地址:http://www.cnblogs.com/waw/p/5484148.html