更快的位图对比度算法

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(使用前将#替换为@)

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

随机推荐

  • 将 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 基本上我的表单是一个带有滑块的工具窗口 每次更新