更快的位图对比度算法

2024-04-22

我有一个带有轨迹栏滑块控件的工具,用于调整图像的亮度、对比度、伽玛值等。

我试图在用户拖动滑块时实时更新我的​​图像。亮度和伽玛算法的速度是可以接受的(大约170ms)。但对比算法大约是380ms。

基本上我的表单是一个带有滑块的工具窗口。每次更新图像时,它都会向父级发送一个事件,以重绘新图像。工具窗口将原始未修改的图像锁定在内存中,因此我始终可以访问它的字节。所以基本上我每次更改滑块(例如对比度滑块)的 ValueChanged 事件时都会执行此操作。

  • 工作(目标)位图的 LockBits 为 Format24bppRgb(原始位图为 Format32bppPArgb)
  • Marshal.将位复制到 byte[] 数组
  • 检查我正在执行哪个操作(选择了哪个滑块)
  • 使用以下代码进行对比:

Code:

double newValue = 0;
double c = (100.0 + contrast) / 100.0;

c *= c;

for (int i = 0; i < sourcePixels.Length; i++)
{
    newValue = sourcePixels[i];

    newValue /= 255.0;
    newValue -= 0.5;
    newValue *= c;
    newValue += 0.5;
    newValue *= 255;

    if (newValue < 0)
        newValue = 0;
    if (newValue > 255)
        newValue = 255;

    destPixels[i] = (byte)newValue;
}

我读过一次关于使用整数而不是浮点值来提高对比度速度的文章,但我找不到那篇文章了。

我尝试使用不安全的代码(指针),但实际上注意到速度下降。我认为这是因为代码使用嵌套 for 循环来迭代 x 和 y 而不是单个循环。


根据您运行此程序的机器,您的技术可能会非常慢。如果您使用没有 FPU 的 ARM 系统,则每个操作都将花费相当长的时间。由于您对每个字节应用相同的操作,因此更快的技术是为对比度级别创建一个 256 项查找表,然后通过该表转换每个图像字节。你的循环将如下所示:

byte contrast_lookup[256];
double newValue = 0;
double c = (100.0 + contrast) / 100.0;

c *= c;

for (int i = 0; i < 256; i++)
{
    newValue = (double)i;
    newValue /= 255.0;
    newValue -= 0.5;
    newValue *= c;
    newValue += 0.5;
    newValue *= 255;

    if (newValue < 0)
        newValue = 0;
    if (newValue > 255)
        newValue = 255;
    contrast_lookup[i] = (byte)newValue;
}

for (int i = 0; i < sourcePixels.Length; i++)
{
    destPixels[i] = contrast_lookup[sourcePixels[i]];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更快的位图对比度算法 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • 缓存感知树的实现

    I have a tree where every node may have 0 to N children 用例是以下查询 给定指向两个节点的指针 这些节点是否位于树的同一分支内 Examples q 2 7 gt true q 5 4
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 将 tzinfo 插入日期时间

    我有以下内容tzinfo具体子类定义 from datetime import datetime timedelta tzinfo class ManilaTime tzinfo def utcoffset self dt return t
  • Python从单个numpy数组中的多个文件获取数据的快速方法

    我需要读取存储在许多格式相同但长度不同的文件中的数据 即相同的列 但行数不同 此外 我需要将每一列数据存储在一个数组中 最好是一个 numpy 数组 但列表也可以接受 现在 我循环读取每个文件numpy loadtxt 然后连接结果数组 假
  • 如何在 LaTeX 表中仅显示四舍五入到整数的系数?

    使用 R 在 LaTeX 中生成表格stargazer效果很好 但我不知道如何将我的数字格式化为整数 这个帖子 https stackoverflow com questions 39937400 decimal numbers in r
  • PHP GDAL/OGR 库的使用,哪种方法更干净?

    我将在新项目中使用 gdal ogr 我想要一个精简但功能齐全的应用程序 因此不会使用其他实现 例如地图服务器 因为它们具有我怀疑应用程序中是否需要的无关组件 即使在将来也是如此 根据记录 它是一个 GIS 但我在这里询问是因为 php 中
  • Jackson json反序列化,忽略json中的根元素

    如何忽略 json 中的父标签 这是我的 json String str parent a id 10 name Foo 这是要从 json 映射的类 public class RootWrapper private List
  • .NET“隔离存储”存储在哪里?

    物理文件在哪里 这取决于操作系统以及是否启用漫游用户配置文件 例如 在 XP 上 使用非漫游配置文件时 位置为
  • Asp.net:委托(“操作”)可以序列化为控制状态吗?

    我正在实现一个用户控件 该控件具有一个将 Action 委托作为参数的方法 尝试将委托存储在控制状态中会产生序列化错误 是否有可能将委托序列化为控制状态 BP 这并不容易 而且可能会引发潜在问题 理论上可以使用反射来确定委托正在调用对象的哪
  • 为什么我的 Scrapy 中的输入/输出处理器不工作?

    我正在努力追随本教程 http doc scrapy org en 1 1 intro tutorial html 我想要我的desc字段是标准化为单个空格且大写的单个字符串 dmoz spider py import scrapy fro
  • 通过 REST API 的 VSTS 工作项列表

    如何使用 REST API 从 VSTS 获取工作项列表 根据文档 https www visualstudio com docs integrate api wit work items the ids参数是可选的 但是当我省略它时 我得
  • Android半圆形进度条-绘制半圆

    我用这个创建了一个半圆形进度条devadvance circularSeekBar https github com devadvance circularseekbar当我从调色板中选择自定义视图时 它看起来像这样 在此我有两个带有权重的
  • 转换为“日期时间”类型时出现问题:“小时必须为 0..23”

    这些是我的 csv 文件中的一些示例行 10 10 1949 20 30 san marcos tx us cylinder 2700 45 minutes This event took place in early fall aroun
  • 在 C++ Win32 应用程序中,如何确定私有字节、工作集和虚拟大小[重复]

    这个问题在这里已经有答案了 我正在编写一些用于教育目的的代码 我希望能够从用 C 编写的 Windows 控制台程序中打印这些内存使用值 花了一些时间从这些链接中获取我想要的内容 但它就是这样 大部分困难是让它在 Mingw32 中工作 c
  • Solr 和方面搜索

    当您设置模式时 分面搜索是否内置 或者您是否必须做一些事情来设置它 它基本上可以在您设置为可排序的所有字段上开箱即用吗 那么您只需使用 fq 查询语法 它就会返回构面 xml 以及搜索结果 有没有一篇关于这方面的好文章对您第一次有帮助 是的
  • 了解共享指针的问题(生命周期,作为参数传递)

    我尝试从 boost asio 聊天示例开始并派生出一个自己的网络程序 不幸的是 我在理解到底发生了什么方面遇到了一些问题 我试图将我的程序减少到绝对最低限度 服务器类等待传入连接并创建会话对象来处理连接 这是服务器的代码 include
  • RxSwift:管理应用程序中的对象更新

    我非常关心如何管理对象属性的更改 假设我有一个 汽车 类 其中包含一些属性 例如 名称 日期 价格 等 在我的视图 A 中 我正在显示从 API 检索的所有汽车 在视图 B 和 C 中 我可以显示和编辑有关视图 A 中所选汽车的特定信息 假
  • Gridpane 中的 JavaFx 图像会大幅降低性能

    我想创建一个 GridPane 嵌套在 ScrollPane 中 在其中动态添加单元格到 GridPane 每个单元格都包含一个带有背景图像的 VBox 一些标签和一个复选框 问题是 GridPane 可以包含数百个 VBox 在我的例子中
  • 为什么 Google 测试工具使用“id”属性来生成微数据项的 URL?

    我正在使用一些微数据来描述一篇博客文章 我对 Schema org 的价值回报感到惊讶BlogPosting通过 Google 开发者测试工具 我本以为它是 itempropurl 不是网站 URL 和项目的合并id 我做错了什么 还是只是
  • jQuery,选择具有属性的最近兄弟(下一个或上一个)

    我有一个类似于下面标记的选择下拉列表
  • 如何使用java上传谷歌云存储中的文件

    我已经尝试使用java在Google云存储中上传文件很长时间了 通过浏览我找到了这段代码 但无法准确理解 任何人都可以定制这个以在 GCS 中上传文件吗 Given InputStream inputStream object data e
  • 更快的位图对比度算法

    我有一个带有轨迹栏滑块控件的工具 用于调整图像的亮度 对比度 伽玛值等 我试图在用户拖动滑块时实时更新我的 图像 亮度和伽玛算法的速度是可以接受的 大约170ms 但对比算法大约是380ms 基本上我的表单是一个带有滑块的工具窗口 每次更新