替换图像的颜色

2024-01-07

我试图用白色替换图片的黑色,反之亦然。这实际上是为了让我的 OCR 代码可以在白色背景上更好地读取它。当前正在从剪贴板获取图像

 Image img = Clipboard.GetImage();
 pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
 pictureBox1.Image = img;

我见过一些其他问题,他们正在使用实际的位图,但是如何直接从剪贴板处理它?


另一种解决方案使用色彩矩阵 https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.colormatrix class.

您可以使用图形.DrawImage https://learn.microsoft.com/en-us/dotnet/api/system.drawing.graphics.drawimage接受一个重载图像属性 https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.imageattributes争论。
ImageAttributes.SetColorMatrix() https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.imageattributes.setcolormatrix设置颜色调整矩阵,可选择针对特定类别(位图、钢笔、画笔等),并且可以指示跳过灰色、仅修改灰色或所有颜色。

The ImageAttributes.SetThreshold() https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.imageattributes.setthreshold方法允许调节颜色截止点(阈值)以微调亮度。
它接受来自的值0 to 1.
当设置为0,图像全白,设置为全黑1(请参阅有关它的文档)。

还要考虑到“反转”取决于原始位图颜色模式,因此请尝试不同的方法。有时,反转亮度可以给您带来更好的结果,有时则不然。

您的 OCR 必须经过“训练”,以验证哪些值更适合它。

看看这些文章:
重新着色(MSDN) https://msdn.microsoft.com/en-us/library/windows/desktop/ms533809(v=vs.85).aspx
ASCII 艺术生成器 (CodeProject) https://www.codeproject.com/Articles/10949/ASCII-Art-Generator

亮度矩阵:
R=Red G=Green B=Blue A=Alpha Channel W=White (Brightness)

修改亮度组件以获得“反转”

    R  G  B  A  W
R  [1  0  0  0  0]
G  [0  1  0  0  0]
B  [0  0  1  0  0]
A  [0  0  0  1  0]
W  [b  b  b  0  1]    <= Brightness

using System.Drawing;
using System.Drawing.Imaging;

// ...

Image colorImage = Clipboard.GetImage();
// Default values, no inversion, no threshold adjustment
var bmpBlackWhite = BitmapToBlackAndWhite(colorImage);
// Inverted, use threshold adjustment set to .75f
var bmpBlackWhite = BitmapToBlackAndWhite(colorImage, true, true, .75f);

// ...

private Bitmap BitmapToBlackAndWhite(Image image, bool invert = false, bool useThreshold = false, float threshold = .5f)
{
    var mxBlackWhiteInverted = new float[][]
    {
        new float[] { -1, -1, -1,  0,  0},
        new float[] { -1, -1, -1,  0,  0},
        new float[] { -1, -1, -1,  0,  0},
        new float[] {  0,  0,  0,  1,  0},
        new float[] {  1,  1,  1,  0,  1}
    };

    var mxBlackWhite = new float[][]
    {
        new float[] { 1,  1,  1,  0,  0},
        new float[] { 1,  1,  1,  0,  0},
        new float[] { 1,  1,  1,  0,  0},
        new float[] { 0,  0,  0,  1,  0},
        new float[] {-1, -1, -1,  0,  1}
    };

    var bitmap = new Bitmap(image.Width, image.Height);
    using (var g = Graphics.FromImage(bitmap))
    using (var attributes = new ImageAttributes()) {

        attributes.SetColorMatrix(new ColorMatrix(invert ? mxBlackWhiteInverted : mxBlackWhite));
        // Adjust the threshold as needed
        if (useThreshold) attributes.SetThreshold(threshold);
        var rect = new Rectangle(Point.Empty, image.Size);
        g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
        return bitmap;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换图像的颜色 的相关文章

随机推荐

  • 我可以在与其他页面(例如 wordpress)相同的 url 中创建 Flask Web 应用程序吗?

    我有一个自托管服务器 仅适用于我的局域网 带有 Wordpress miservidor com 和 Owncloud miservidor com owncloud 页面 这些页面工作完美 我最近决定在同一目录下使用 Flask 创建一个
  • 绑定到 ListView 的 SelectedItem 属性时设置初始选定项

    我有一个 Xamarin Forms xaml 页面 其中使用 ListView 允许用户从列表中选择单个项目 我已将 ListView 的 SelectedItem 属性绑定到 ViewModel 上的属性 效果很好 一旦用户更改所选项目
  • 桶排序的复杂度怎么会是O(n+k)呢?

    在说 这个问题以前有人问过 或者 找一本算法书 之前 请继续阅读并告诉我我的推理的哪一部分出了问题 假设你有 n 个整数 并将它们分成 k 个容器 这将花费 O n 时间 然而 需要对 k 个 bin 中的每一个进行排序 如果对每个 bin
  • XCUITest:以协调的方式跨两个应用程序运行测试

    我正在考虑使用 XCUITest 为我的 iOS 应用程序进行 UI 测试 看起来 XCUITest 具有广泛的功能 包括使用多个应用程序的能力 然而 多应用程序支持似乎有些有限 似乎使用 XCUIApplication 我可以使用 Bun
  • 如何在同一个Java流中正确提交和获取多个Futures?

    我尝试提交并获得 10Futures 在同一个流中 每个都需要 1 秒来处理 我想并行运行它们 我的第一次尝试是takes 10 sec 它按顺序运行 需要 10 秒 我的第二次尝试是takes 1 sec 并行运行 耗时 1 秒 然而它使
  • 如何使用 NEST 客户端将 Elasticsearch 配置为使用 AutoMap 类型作为动态映射对象的默认模板?

    我动态地将对象添加到索引中 因此它们都使用 default 映射进行索引 这是有问题的 因为它会导致诸如Guid被映射为text字段而不是作为keyword The AutoMap https www elastic co guide en
  • JavaScript 中的 360 度旋转视图 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我如何获得每个工作的詹金斯许可?

    有些工作推向质量检查 有些工作推向生产 只应允许开发人员推送到 QA 并且只应允许 QA 推送到生产 除了创建两个独立的构建服务器 通过某种方式共享工件 之外 我如何限制权限 你需要基于项目的矩阵授权策略在全局配置和作业配置中 使用启用基于
  • Flask SQLAlchemy 对关系中的对象进行分页

    所以我有两个模型 文章和标签 以及正确设置的 m2m 关系 我有一条 文章 标签 类型的路线 我想仅显示与该标签相关的那些文章 我已经解决了这个问题 但我正在寻找更优雅的解决方案 包括分页但我无法使用paginate在文章列表上 因为它不是
  • 条件构造在 Python 正则表达式中不起作用

    我是 python 的新手 我想在中使用我的正则表达式re sub 我试穿了regex101 https regex101 com r InljCc 1它有效 不知何故 当我尝试在我的 python 版本 3 6 上使用它时 它无法正常工作
  • “无法设置插件占位符”消息?

    Xcode 9 1 模拟器10 0 操作系统 10 12 6 我想将我的贴纸包的新版本上传到 iTunes Connect 但 产品 gt 存档 是灰色的 所以我运行模拟器并得到 无法为 名称 设置插件占位符 在全世界任何地方只有一个答案
  • 这两种关系对于联合运算是否兼容?

    我不确定以下两种关系是否适合联合 R lt schema name B 1 2 2 3 3 And Q lt schema name A B 5 1 6 1 4 2 3 4 我想加入工会 Q U R 可以吗 结果如何 并集运算符要求两个关系
  • svn:ignore 的双重性质

    阅读周围 svn ignore 命令似乎以两种方式之一工作 如果文件或目录尚未处于版本控制之下 则元数据将添加到存储库中 而忽略签出该项目的所有其他团队成员的文件或目录 如果文件或目录已处于版本控制之下 则忽略将仅在本地应用 并且不会将元数
  • 将数据框组合成列表

    我正在尝试将多个数据帧存储在列表中 但是 在某些时候 数据帧最终会转换为列表 因此我最终会得到一个列表列表 我真正想做的就是将所有数据帧以某种结构保存在一起 这是失败的代码 all dframes lt list initialise a
  • WinSCP 命令行被动模式

    我通过命令行调用 WinSCP 但我不知道如何为脚本正确设置被动模式 现在是脚本 option batch on option confirm off open ftp user and pass details 21 cd out opt
  • Spring/Hibernate 连接泄漏与 ScrollableResults

    我目前正在调查以下问题 该问题也影响我们的生产环境https github com querydsl querydsl issues 3089 https github com querydsl querydsl issues 3089 这
  • 递归多对多关系的相关名称不起作用

    多对多 非递归 class A models Model pass class B models Model parents models ManyToManyField A related name children gt gt gt A
  • 如何通过.apk传递dalvik命令行参数?

    我知道可以通过以下方式在Android中启动java程序 adb push hello world zip REMOTE PATH adb shell mkdir REMOTE PATH dalvik cache adb shell dal
  • 搜索方法迭代完成后重新加载/显示 UISearchDisplayController 的 searchResultsTableView

    我修改了Apple的示例iOS项目的代码表格搜索 http developer apple com library ios samplecode TableSearch Introduction Intro html以便通过解析 Web 服
  • 替换图像的颜色

    我试图用白色替换图片的黑色 反之亦然 这实际上是为了让我的 OCR 代码可以在白色背景上更好地读取它 当前正在从剪贴板获取图像 Image img Clipboard GetImage pictureBox1 SizeMode Pictur