本帖最后由 茶白 于 2023-6-25 01:57 编辑
业务需要,有个客户需要将索马里电商的头像转换成文字,进行OCR处理,但是这头像花里胡哨什么颜色都有,所以需要预处理一下 灰度处理一下
before:
after:
code:[C#] 纯文本查看 复制代码 using System;
using System.Drawing;
using System.Drawing.Imaging;
public static Bitmap ConvertToGrayscale(Bitmap image)
{
// 创建一个新的位图对象,将图像转换为 8 位灰度图像
Bitmap grayscaleImage = new Bitmap(image.Width, image.Height, PixelFormat.Format8bppIndexed);
// 设置调色板
ColorPalette grayscalePalette = grayscaleImage.Palette;
for (int i = 0; i < grayscalePalette.Entries.Length; i++)
{
grayscalePalette.Entries = Color.FromArgb(i, i, i);
}
grayscaleImage.Palette = grayscalePalette;
// 将图像锁定到内存中
Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
BitmapData imageData = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData grayscaleData = grayscaleImage.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
// 获取每个像素的字节数
int pixelSize = 3; // 24 bpp
// 获取位图数据的指针
IntPtr imageScan0 = imageData.Scan0;
IntPtr grayscaleScan0 = grayscaleData.Scan0;
// 定义图像行字节数
int imageStride = imageData.Stride;
int grayscaleStride = grayscaleData.Stride;
// 定义图像高度和宽度
int imageHeight = image.Height;
int imageWidth = image.Width;
// 定义字节数组存储行数据
byte[] imageRow = new byte[imageStride];
byte[] grayscaleRow = new byte[grayscaleStride];
// 循环遍历每个像素进行灰度转换
for (int y = 0; y < imageHeight; y++)
{
// 拷贝当前行数据到字节数组
System.Runtime.InteropServices.Marshal.Copy(imageScan0 + y * imageStride, imageRow, 0, imageStride);
for (int x = 0; x < imageWidth; x++)
{
// 获取当前像素的颜色分量
byte blue = imageRow[x * pixelSize];
byte green = imageRow[x * pixelSize + 1];
byte red = imageRow[x * pixelSize + 2];
// 计算灰度值
byte gray = (byte)(0.2125 * red + 0.7154 * green + 0.0721 * blue);
// 将灰度值赋值给转换后的像素
grayscaleRow[x] = gray;
}
// 将转换后的行数据拷贝回位图
System.Runtime.InteropServices.Marshal.Copy(grayscaleRow, 0, grayscaleScan0 + y * grayscaleStride, grayscaleStride);
}
// 解锁图像
image.UnlockBits(imageData);
grayscaleImage.UnlockBits(grayscaleData);
return grayscaleImage;
}
|