开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 688|回复: 5
收起左侧

[C#源码] C# 图像二值化灰度处理工具类

[复制链接]
结帖率:100% (1/1)
发表于 2023-6-25 01:52:17 | 显示全部楼层 |阅读模式   山东省济宁市
本帖最后由 茶白 于 2023-6-25 01:57 编辑
业务需要,有个客户需要将索马里电商的头像转换成文字,进行OCR处理,但是这头像花里胡哨什么颜色都有,所以需要预处理一下 灰度处理一下
before:
1111.jpg
after:
2222.jpg
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;
}






本帖被以下淘专辑推荐:

  • · 鱼木|主题: 1560, 订阅: 152
结帖率:100% (1/1)
 楼主| 发表于 2023-7-14 15:13:19 | 显示全部楼层   山东省济宁市
qq73s5456 发表于 2023-7-14 09:32
处理一张1024*738的图, 要多长时间

几毫秒就处理了
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 22 天

发表于 2023-7-14 09:32:56 | 显示全部楼层   广东省深圳市
处理一张1024*738的图, 要多长时间
回复 支持 反对

使用道具 举报

签到天数: 12 天

发表于 2023-6-28 16:00:29 | 显示全部楼层   湖北省武汉市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
 楼主| 发表于 2023-6-25 13:57:42 | 显示全部楼层   山东省济宁市
kk2apple 发表于 2023-6-25 07:33
颜色处理一下,有什么意义?

一些ocr库直接识别带各种花里胡哨颜色的图片准确率不高
回复 支持 反对

使用道具 举报

结帖率:100% (43/43)

签到天数: 20 天

发表于 2023-6-25 07:33:10 | 显示全部楼层   江苏省苏州市
颜色处理一下,有什么意义?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表