在C#中有效调整图像的对比度

2024-03-01

在 C# 中是否有一种有效的方法来调整图像的对比度?

我见过本文 http://www.gutgames.com/post/Adjusting-Contrast-of-an-Image-in-C.aspx它提倡进行逐像素操作。不快。

我已经在一些地方使用了颜色矩阵,发现它们很快。有没有办法使用它们来调整对比度? (笔记:This guy https://web.archive.org/web/20140825114946/http://bobpowell.net/image_contrast.aspx搞错了。)

我也在使用 EmguCV。我注意到 OpenCV(Emgu 包装的)好像有对比功能 http://ubaa.net/shared/processing/opencv/opencv_contrast.html- 有什么方法可以通过 Emgu 访问它吗?目前,我在 Emgu 中所能做的就是标准化直方图,这确实会改变对比度,但我无法进行任何程度的控制。

有人有什么想法吗?


如果该示例中的代码适合您,您可以使用以下方法大幅加快速度(按数量级)Bitmap.LockBits,它返回一个BitmapData允许通过指针访问位图像素数据的对象。网络和 StackOverflow 上有大量示例展示如何使用 LockBits。

Bitmap.SetPixel() and Bitmap.GetPixel()是人类已知的最慢的方法,并且它们都利用Color类,这是人类已知的最慢的类。他们应该被命名Bitmap.GetPixelAndByGodYoullBeSorryYouDid() and Bitmap.SetPixelWhileGettingCoffee作为对粗心开发商的警告。

Update:如果您要修改该示例中的代码,请注意此块:

System.Drawing.Bitmap TempBitmap = Image;
System.Drawing.Bitmap NewBitmap = new System.Drawing.Bitmap(TempBitmap.Width,
    TempBitmap.Height);
System.Drawing.Graphics NewGraphics = 
    System.Drawing.Graphics.FromImage(NewBitmap);
NewGraphics.DrawImage(TempBitmap, new System.Drawing.Rectangle(0, 0, 
    TempBitmap.Width, TempBitmap.Height), 
    new System.Drawing.Rectangle(0, 0, TempBitmap.Width, TempBitmap.Height),
    System.Drawing.GraphicsUnit.Pixel);
NewGraphics.Dispose();

可以用这个替换:

Bitmap NewBitmap = (Bitmap)Image.Clone();

更新2:以下是 AdjustContrast 方法的 LockBits 版本(还有一些其他速度改进):

public static Bitmap AdjustContrast(Bitmap Image, float Value)
{
    Value = (100.0f + Value) / 100.0f;
    Value *= Value;
    Bitmap NewBitmap = (Bitmap)Image.Clone();
    BitmapData data = NewBitmap.LockBits(
        new Rectangle(0, 0, NewBitmap.Width, NewBitmap.Height), 
        ImageLockMode.ReadWrite,
        NewBitmap.PixelFormat);
    int Height = NewBitmap.Height;
    int Width = NewBitmap.Width;

    unsafe
    {
        for (int y = 0; y < Height; ++y)
        {
            byte* row = (byte*)data.Scan0 + (y * data.Stride);
            int columnOffset = 0;
            for (int x = 0; x < Width; ++x)
            {
                byte B = row[columnOffset];
                byte G = row[columnOffset + 1];
                byte R = row[columnOffset + 2];

                float Red = R / 255.0f;
                float Green = G / 255.0f;
                float Blue = B / 255.0f;
                Red = (((Red - 0.5f) * Value) + 0.5f) * 255.0f;
                Green = (((Green - 0.5f) * Value) + 0.5f) * 255.0f;
                Blue = (((Blue - 0.5f) * Value) + 0.5f) * 255.0f;

                int iR = (int)Red;
                iR = iR > 255 ? 255 : iR;
                iR = iR < 0 ? 0 : iR;
                int iG = (int)Green;
                iG = iG > 255 ? 255 : iG;
                iG = iG < 0 ? 0 : iG;
                int iB = (int)Blue;
                iB = iB > 255 ? 255 : iB;
                iB = iB < 0 ? 0 : iB;

                row[columnOffset] = (byte)iB;
                row[columnOffset + 1] = (byte)iG;
                row[columnOffset + 2] = (byte)iR;

                columnOffset += 4;
            }
        }
    }

    NewBitmap.UnlockBits(data);

    return NewBitmap;
}

注意:此代码需要using System.Drawing.Imaging;在你的类的 using 语句中,并且它要求项目的allow unsafe code选项被选中(在项目的“构建属性”选项卡上)。

GetPixel 和 SetPixel 对于逐像素操作如此缓慢的原因之一是方法调用本身的开销开始成为一个巨大的因素。通常,我这里的代码示例将被视为重构的候选者,因为您可以编写自己的 SetPixel 和 GetPixel 方法来使用现有的 BitmapData 对象,但函数内部数学的处理时间相对于方法开销来说非常小每次通话。这就是为什么我删除了Clamp也调用原始方法。

另一种加快速度的方法是简单地使其成为“破坏性”函数,并修改传递的位图参数,而不是制作副本并返回修改后的副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C#中有效调整图像的对比度 的相关文章

随机推荐

  • 如何从项目文档创建 GitHub 页面?

    我在 GitHub 上有一个项目 其中包含一些自动生成的 HTML 文档的目录 我想在 GitHub 的项目页面工具中使用该文档 所以 我已经阅读了有关如何操作的说明创建项目的 gh pages 根分支 http pages github
  • 以react-hook-form形式输入onChange

    我正在使用 React 构建网络应用程序反应钩子形式 https react hook form com 图书馆 我想创建表单 其中某些字段的更改会触发某些事件 所以我需要通过自定义onChange 但是 从 v7 0 开始我无法使用onC
  • 将数据库中的日期更新为 +1 个月

    我的用户中有一个日期列 我想使用 SQL 查询更新该列 通过 SQL 查询 我想在数据库中添加 1 个月至今的列 我现在有 UPDATE users SET date 1 month 当我运行此查询时 它不起作用 所以我的问题是 我怎样才能
  • “无法解析对程序集的依赖关系”错误的原因

    什么时候会显示以下消息 错误 1 未知构建错误 无法解析对程序集 Infragistics2 Win v10 3 版本 10 3 20103 2015 Culture neutral PublicKeyToken 7dd5c3163f2cd
  • Telegram Bot API:getChatMember 为有效用户抛出 USER_ID_INVALID

    我正在尝试找出是否有特定的User出现在一个超级组中 以便跟踪那些离开的人 为此 我调用 Bot API 方法getChatMember对于每个User并检查他们的状态是否是Left or Kicked 然而 我注意到 最近 我得到了USE
  • 如何从 ruby​​ 1.9.1 降级到 ruby​​ 1.8.7

    我刚刚升级到 Rails 3 但在升级之前运行的是 ruby 1 9 1 Rails 3 不支持 Ruby 1 9 1 如何降级到 ruby 1 8 7 这将从当前版本降级到 1 8 7 gem update system 1 8 7
  • TensorFlow:如何在训练期间多次评估验证数据队列?

    tl dr 如何在每 K 次训练迭代之后评估验证集 使用单独的队列进行训练和验证数据 而不需要单独使用tf Sessions在多个进程中 考虑到我的特定问题 似乎没有一种干净的方法来实现这一目标 而我当前的解决方法 我认为可行 给了我未定义
  • matlab和openCV中的hough变换错误?

    我一直在使用 Matlab 和 OpenCV labview 的应用程序中使用霍夫变换 发现对于某些图像 霍夫变换给出了明显错误的线拟合 一致 Here are the test and overlayed images The angle
  • Thymeleaf 中的标题和标题

    我是百里香初学者 我从一个通用的布局页面开始 片段 layout html div class container Some text div 和内容页面 页面 html
  • 使用 Visual Studio 的 Python 工具在 Visual Studio 中使用 Matplotlib 进行绘图

    我刚开始在 Python 代码中使用 PTVS 我之前使用过 Spyder 因为它是与 Anaconda 发行版一起提供的 这是我遇到的问题 我正在尝试创建两个图 并同时在单独的窗口中显示它们 一个简单的例子是 import matplot
  • 无法获取用于 tmux 和 OSX 的删除键

    在通过自制软件安装了 tmux 的 OSX 上 我似乎无法让 删除 键起作用 我正在使用 iterm2 并将删除映射到 H 如果没有 tmux 删除 键可以正常工作 修复 Apple M1 Pro OSX 12 4 tmux 3 3a 上的
  • 从 DDS 中删除读取主题

    我在订阅数据时遇到问题 使用java平台 当订阅者订阅某个主题时 必须从 DDS 中删除该订阅的数据 但就我而言 每当我订阅数据时 相同的数据就会被订阅多次 数据不会从 DDS 中删除 我尝试过 QoS 但不知道如何使用它 请建议我如何从
  • 将数组分为 2 个子数组并检查乘法是否相等

    我正在为 Java 考试进行练习 我今天面临的问题之一是 给定一个包含 n 个数字的数组 我需要检查是否有 2 个子数组 不必相等 它们的乘法相等 如果有 将返回 true 否则返回 false 例如 如果数组是 2 15 3 4 2 5
  • NG-使用过滤器重复与当前日期进行比较?

    好的 我有一个包含日期列表的对象 我像这样遍历它
  • 在 Keras/Tensorflow 自定义损失函数中使用额外的“可训练”变量

    我知道如何在 Keras 中使用附加输入 而不是标准输入 编写自定义损失函数y true y pred配对 见下文 我的问题是输入损失函数可训练的变量 其中一些 是损失梯度的一部分 因此应该更新 我的解决方法是 输入网络的虚拟输入NXV大小
  • 从我的控制器而不是从我的 asp.net mvc Web 应用程序中的视图调用 JSON API

    我需要从我的 asp net mvc Web 应用程序调用 BPM 引擎的 JSON API 对 BPM 的 API 调用构造如下 http localhost 8080 jw web json workflow process list
  • 如何防止XDocument添加XML版本和编码信息

    尽管在以下代码中使用了 SaveOptions DisableFormatting 选项 XDocument xmlDoc XDocument Load FileManager SourceFile string element campa
  • 将 Keras 模型的输出重新缩放回原始比例

    我是神经网络的新手 只是免责声明 我有一个基于 8 个特征预测混凝土强度的回归问题 我首先做的是使用最小 最大标准化重新调整数据 Normalize data between 0 and 1 from sklearn preprocessi
  • 逻辑地址和物理地址之间的区别?

    我正在阅读 操作系统概念 现在正在读第 8 章 不过 我可以做一些澄清 或者保证我的理解是正确的 逻辑地址 根据书中所述 逻辑地址是由CPU生成的 这到底是什么意思 在执行生成的地址系统中 我假设当为程序编译代码时 该程序具有no知道代码将
  • 在C#中有效调整图像的对比度

    在 C 中是否有一种有效的方法来调整图像的对比度 我见过本文 http www gutgames com post Adjusting Contrast of an Image in C aspx它提倡进行逐像素操作 不快 我已经在一些地方