c#實(shí)現(xiàn)圖片二值化例子(黑白效果)
更新時(shí)間:2014年08月15日 08:50:19 投稿:junjie
這篇文章主要介紹了c#實(shí)現(xiàn)圖片二值化例子,圖像二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果,需要的朋友可以參考下
C#將圖片2值化示例代碼,原圖及二值化后的圖片如下:
原圖:

二值化后的圖像:

實(shí)現(xiàn)代碼:
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);
//計(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;
}
}
//迭代計(jì)算閥值
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;
//求兩個(gè)區(qū)域的灰度的平均值
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;
}
//計(jì)算二值化
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");
}
}
}
}
相關(guān)文章
c# textbox的滾動(dòng)條總是指向最底端的簡單解決方法
這篇文章主要介紹了c# textbox的滾動(dòng)條總是指向最底端的簡單解決方法,需要的朋友可以參考下2017-11-11
C#/VB.NET 給Excel添加、刪除數(shù)字簽名的方法
這篇文章主要介紹了C#/VB.NET 給Excel添加、刪除數(shù)字簽名的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
2020-11-11
C#比較二個(gè)數(shù)組并找出相同或不同元素的方法
這篇文章主要介紹了C#比較二個(gè)數(shù)組并找出相同或不同元素的方法,涉及C#針對數(shù)組的交集、補(bǔ)集等集合操作相關(guān)技巧,非常簡單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
2015-11-11
Winform項(xiàng)目中TextBox控件DataBindings屬性
這篇文章介紹了Winform項(xiàng)目中TextBox控件DataBindings屬性的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
2022-02-02 
