博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#实现图片二值化例子(黑白效果)
阅读量:6308 次
发布时间:2019-06-22

本文共 2377 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/waw/p/5484148.html

你可能感兴趣的文章
HTML学习笔记1—HTML基础
查看>>
mysql dba系统学习(20)mysql存储引擎MyISAM
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
Ansible--playbook介绍
查看>>
浅谈代理
查看>>
php创建桌面快捷方式实现方法
查看>>
基于jquery实现的超酷动画源码
查看>>
fl包下的TransitionManager的使用
查看>>
Factorialize a Number
查看>>
[USB-Blaster] Error (209040): Can't access JTAG chain
查看>>
TreeSet的用法
查看>>
防HTTP慢速攻击的nginx安全配置
查看>>
深入理解PHP内核(十四)类的成员变量及方法
查看>>
Spring Boot2.0+中,自定义配置类扩展springMVC的功能
查看>>
参与博客编辑器改版,我的礼物 感谢51cto
查看>>
JavaWeb笔记——JSTL标签
查看>>
Eclipse插件大全 挑选最牛的TOP30
查看>>
一些实用性的总结与纠正
查看>>
Kubernetes概念
查看>>