c#实现图片二值化例子(黑白效果)
作者:junjie 发布时间:2023-02-19 11:52:46
标签: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");
}
}
}
}
0
投稿
猜你喜欢
- 当一个产品或者项目由大量独立模块组成时,想要从 Git 挨个下载下来导入 IDE 查看并不容易,此时可以结合使用 Git 和 Maven 的
- 这篇文章主要介绍了springmvc视图解析流程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 很多方法请看官网地址:hutool官网地址脚本之家下载:https://www.jb51.net/softs/549331.html简介Hu
- 简介在多线程中解决线程安全的问题时常用到Synchronized,现在的synchronized相对于早期的synchronized做出了优
- 提供表示 Windows 注册表中的根项的 RegistryKey 对象,并提供访问项/值对的 static&
- DAO模式是接口的一个典型应用。1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同
- 一、了解Spring自动装配的方式采用传统的XML方式配置Bean组件的关键代码如下所示<bean id="userMapp
- 【前言】面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎。.n
- 图像切换器(ImageSwitcher),用于实现类似于Windows操作系统的“Windows照片查看器”中的上一张、下一张切换图片的功能
- 在做android 开发时,在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新
- 在LINUX上部署带有JAR包的JAVA项目首先eclipse上要装上一个小插件,叫做Fat Jar点击Fat Jar红框里选上主类点击Ne
- 使用的是iTextSharp添加PDF水印,由于是接口动态生成PDF,所以采用的是全部是内存流的形式,而且水印是平铺是。iTextSharp
- Java 向上转型和向下转型的详解转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父
- 一、lateinit延迟初始化关键字Kotlin中很多语法特性,如变量不可变,变量不可为空,等等 这些特性都是为了尽可能地保证程序安全而设计
- 在网上也没有找到好的解决方案,于是自己研究了下给解决了,分享给大家,希望对大家能有所帮助。一、异常信息这种情况是因为FTP设置的默认目录引发
- 一、需要导入的jar1.commons-collections4-4.1.jar2.poi-3.17-beta1.jar3.poi-ooxm
- 一、前言高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑。接下来会介绍一下常用一
- 前言C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利。System.String是最常用的字符串操
- Java中有两种处理异常的方式,分别是用throws抛出异常、用try、catch捕获异常。try-catch在Javatry-catch语
- 项目要求基于Broadcast,BroadcastReceiver等与广播相关的知识实现简单的音乐播放功能,包括音乐的播放、暂停、切换、进度