WPF:图像处理(二)灰度化
2014-03-30 13:53
323 查看
作者:Splash
转自:/article/2840117.html
[csharp]
view plaincopy
/* ----------------------------------------------------------
文件名称:Gray.cs
作者:秦建辉
MSN:splashcn@msn.com
QQ:36748897
博客:http://blog.csdn.net/jhqin
开发环境:
Visual Studio V2010
.NET Framework 4 Client Profile
版本历史:
V1.0 2012年04月16日
图像灰度化
------------------------------------------------------------ */
using System;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Splash.Imaging
{
/// <summary>
/// 图像处理:灰度化
/// </summary>
public static class Gray
{
/// <summary>
/// 将位图转换为彩色数组
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>彩色数组</returns>
/// <remarks>
/// 1.扩展方法
/// 2.忽视Alpha通道
/// </remarks>
public static Color[,] ToColorArray(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为彩色数组
Color[,] ColorArray = new Color[PixelHeight, PixelWidth];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
ColorArray[i, j].B = Pixels[Index];
ColorArray[i, j].G = Pixels[Index + 1];
ColorArray[i, j].R = Pixels[Index + 2];
ColorArray[i, j].A = Pixels[Index + 3];
}
}
return ColorArray;
}
/// <summary>
/// 将位图转换为灰度数组(256级灰度)
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>灰度数组</returns>
/// <remarks>扩展方法</remarks>
public static Byte[,] ToGrayArray(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为灰度数组
Byte[,] GrayArray = new Byte[PixelHeight, PixelWidth];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
GrayArray[i, j] = Convert.ToByte((Pixels[Index + 2] * 19595 + Pixels[Index + 1] * 38469 + Pixels[Index] * 7471 + 32768) >> 16);
}
}
return GrayArray;
}
/// <summary>
/// 位图灰度化
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>灰度位图</returns>
/// <remarks>扩展方法</remarks>
public static BitmapSource ToGrayBitmap(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为灰度数据
Int32 GrayStride = ((PixelWidth + 3) >> 2) << 2;
Byte[] GrayPixels = new Byte[PixelHeight * GrayStride];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
GrayPixels[i * GrayStride + j] = Convert.ToByte((Pixels[Index + 2] * 19595 + Pixels[Index + 1] * 38469 + Pixels[Index] * 7471 + 32768) >> 16);
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed8, BitmapPalettes.Gray256, GrayPixels, GrayStride);
}
/// <summary>
/// 将灰度数组转换为灰度图像(256级灰度)
/// </summary>
/// <param name="grayArray">灰度数组</param>
/// <returns>灰度图像</returns>
public static BitmapSource GrayArrayToGrayBitmap(Byte[,] grayArray)
{ // 将灰度数组转换为灰度数据
Int32 PixelHeight = grayArray.GetLength(0); // 图像高度
Int32 PixelWidth = grayArray.GetLength(1); // 图像宽度
Int32 Stride = ((PixelWidth + 3) >> 2) << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Pixels[i * Stride + j] = grayArray[i, j];
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed8, BitmapPalettes.Gray256, Pixels, Stride);
}
/// <summary>
/// 将二值化数组转换为二值化图像
/// </summary>
/// <param name="binaryArray">二值化数组</param>
/// <returns>二值化图像</returns>
public static BitmapSource BinaryArrayToBinaryBitmap(Byte[,] binaryArray)
{ // 将二值化数组转换为二值化数据
Int32 PixelHeight = binaryArray.GetLength(0);
Int32 PixelWidth = binaryArray.GetLength(1);
Int32 Stride = ((PixelWidth + 31) >> 5) << 2;
Byte[] Pixels = new Byte[PixelHeight * Stride];
for (Int32 i = 0; i < PixelHeight; i++)
{
Int32 Base = i * Stride;
for (Int32 j = 0; j < PixelWidth; j++)
{
if (binaryArray[i, j] != 0)
{
Pixels[Base + (j >> 3)] |= Convert.ToByte(0x80 >> (j & 0x7));
}
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed1, BitmapPalettes.BlackAndWhite, Pixels, Stride);
}
}
}
转自:/article/2840117.html
[csharp]
view plaincopy
/* ----------------------------------------------------------
文件名称:Gray.cs
作者:秦建辉
MSN:splashcn@msn.com
QQ:36748897
博客:http://blog.csdn.net/jhqin
开发环境:
Visual Studio V2010
.NET Framework 4 Client Profile
版本历史:
V1.0 2012年04月16日
图像灰度化
------------------------------------------------------------ */
using System;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Splash.Imaging
{
/// <summary>
/// 图像处理:灰度化
/// </summary>
public static class Gray
{
/// <summary>
/// 将位图转换为彩色数组
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>彩色数组</returns>
/// <remarks>
/// 1.扩展方法
/// 2.忽视Alpha通道
/// </remarks>
public static Color[,] ToColorArray(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为彩色数组
Color[,] ColorArray = new Color[PixelHeight, PixelWidth];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
ColorArray[i, j].B = Pixels[Index];
ColorArray[i, j].G = Pixels[Index + 1];
ColorArray[i, j].R = Pixels[Index + 2];
ColorArray[i, j].A = Pixels[Index + 3];
}
}
return ColorArray;
}
/// <summary>
/// 将位图转换为灰度数组(256级灰度)
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>灰度数组</returns>
/// <remarks>扩展方法</remarks>
public static Byte[,] ToGrayArray(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为灰度数组
Byte[,] GrayArray = new Byte[PixelHeight, PixelWidth];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
GrayArray[i, j] = Convert.ToByte((Pixels[Index + 2] * 19595 + Pixels[Index + 1] * 38469 + Pixels[Index] * 7471 + 32768) >> 16);
}
}
return GrayArray;
}
/// <summary>
/// 位图灰度化
/// </summary>
/// <param name="bitmap">原始位图</param>
/// <returns>灰度位图</returns>
/// <remarks>扩展方法</remarks>
public static BitmapSource ToGrayBitmap(this BitmapSource bitmap)
{ // 将像素格式统一到Bgr32,并提取图像数据
Int32 PixelHeight = bitmap.PixelHeight; // 图像高度
Int32 PixelWidth = bitmap.PixelWidth; // 图像宽度
Int32 Stride = PixelWidth << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
if (bitmap.Format == PixelFormats.Bgr32 || bitmap.Format == PixelFormats.Bgra32)
{ // 拷贝像素数据
bitmap.CopyPixels(Pixels, Stride, 0);
}
else
{ // 先进行像素格式转换,再拷贝像素数据
new FormatConvertedBitmap(bitmap, PixelFormats.Bgr32, null, 0).CopyPixels(Pixels, Stride, 0);
}
// 将像素数据转换为灰度数据
Int32 GrayStride = ((PixelWidth + 3) >> 2) << 2;
Byte[] GrayPixels = new Byte[PixelHeight * GrayStride];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Int32 Index = i * Stride + (j << 2);
GrayPixels[i * GrayStride + j] = Convert.ToByte((Pixels[Index + 2] * 19595 + Pixels[Index + 1] * 38469 + Pixels[Index] * 7471 + 32768) >> 16);
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed8, BitmapPalettes.Gray256, GrayPixels, GrayStride);
}
/// <summary>
/// 将灰度数组转换为灰度图像(256级灰度)
/// </summary>
/// <param name="grayArray">灰度数组</param>
/// <returns>灰度图像</returns>
public static BitmapSource GrayArrayToGrayBitmap(Byte[,] grayArray)
{ // 将灰度数组转换为灰度数据
Int32 PixelHeight = grayArray.GetLength(0); // 图像高度
Int32 PixelWidth = grayArray.GetLength(1); // 图像宽度
Int32 Stride = ((PixelWidth + 3) >> 2) << 2; // 扫描行跨距
Byte[] Pixels = new Byte[PixelHeight * Stride];
for (Int32 i = 0; i < PixelHeight; i++)
{
for (Int32 j = 0; j < PixelWidth; j++)
{
Pixels[i * Stride + j] = grayArray[i, j];
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed8, BitmapPalettes.Gray256, Pixels, Stride);
}
/// <summary>
/// 将二值化数组转换为二值化图像
/// </summary>
/// <param name="binaryArray">二值化数组</param>
/// <returns>二值化图像</returns>
public static BitmapSource BinaryArrayToBinaryBitmap(Byte[,] binaryArray)
{ // 将二值化数组转换为二值化数据
Int32 PixelHeight = binaryArray.GetLength(0);
Int32 PixelWidth = binaryArray.GetLength(1);
Int32 Stride = ((PixelWidth + 31) >> 5) << 2;
Byte[] Pixels = new Byte[PixelHeight * Stride];
for (Int32 i = 0; i < PixelHeight; i++)
{
Int32 Base = i * Stride;
for (Int32 j = 0; j < PixelWidth; j++)
{
if (binaryArray[i, j] != 0)
{
Pixels[Base + (j >> 3)] |= Convert.ToByte(0x80 >> (j & 0x7));
}
}
}
// 从灰度数据中创建灰度图像
return BitmapSource.Create(PixelWidth, PixelHeight, 96, 96, PixelFormats.Indexed1, BitmapPalettes.BlackAndWhite, Pixels, Stride);
}
}
}
相关文章推荐
- WPF:图像处理(二)灰度化
- VC图像处理之灰度化与中值滤波
- WPF中调用matlab制作的dll进行图像处理
- PhotoShop算法实现--图像灰度化处理(六)
- android图像处理之灰度化
- java图像处理---灰度化(二值化)处理
- 图像处理:图像灰度化
- Python-OpenCV 处理图像(七):图像灰度化处理
- WPF的图像处理
- WPF:图像处理(一)图像文件获取与预览
- Android下常用的图像处理程序(灰度化、线性灰度变化、二值化)
- 由图像的灰度化看基本图像处理(1)
- 彩色图像的灰度化处理
- WPF:图像处理(三)二值化
- 由图像的灰度化看基本图像处理(2)
- 【图像处理之常用算法一】——彩色图像的灰度化
- WPF中的图像处理简介
- [matlab图像处理] 灰度化 (自己计算灰度化)
- WPF:图像处理(四)大津法
- 由图像的灰度化看基本图像处理(3)