- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试为图像编写色相/饱和度/亮度滤镜(使用 C++)。 RGB->HSL 转换工作正常,但当考虑到每个像素具有不同的初始饱和度和亮度这一事实时,我的问题就来了。
对于每个像素,我计算了源 HSL 并将 HSL 值作为滤波器输入(在 [0, 1] 范围内)。我想将 0.5 设置为所有默认值(输出与输入相同),饱和度 0.0 表示灰度或全黑表示亮度,1.0 表示完全饱和或全白。与饱和度和亮度不同,色调部分很简单:只需添加并包裹在 [0, 1] 范围内即可。
那么任务来了:我们如何根据过滤器输入转换每个像素的饱和度和亮度值?
想到的一个解决方案:
Out.H = Wrap(In.H + Filter.H - 0.5f, 0.0f, 1.0f);
Out.S = std::clamp(In.S * Filter.S * 2.0f, 0.0f, 1.0f);
Out.L = std::clamp(In.L * Filter.L * 2.0f, 0.0f, 1.0f);
其中Out
是输出,In
是源图像,Filter
是滤镜设置。但是,如果源图像与其有很大的对比度,则图像最初较亮的部分会快速剪辑(固定为纯色 1.0f),失去细节,而较暗的部分可能仍然几乎不可见。因此,相反,我想也许可以应用一些曲线来防止这种削波,同时仍然让 0.5f 返回原始值。我想到了使用幂函数并计算所需的功率。我想到了:
f(x) = x ^ log_1/2(a)
其中 a
是输入像素处的值(函数在 x = 0.5f 处的值)。例如:
此函数 f(x) = x ^ log_1/2(0.2)
通过 (0,0)、(0.5, 0.2) 和 (1, 1)。因此,如果输入像素的饱和度为 0.2f 并且来自用户的滤波器饱和度输入为 x,则通过此函数运行它会起作用。您需要将函数中的 0.2 替换为输入像素的饱和度。据说,同样的事情也可以用于亮度。因此,代码变为:
Out.H = Wrap(In.H + Filer.H - 0.5f, 0.0f, 1.0f);
Out.S = pow(In.S, log(Filter.S) / log(0.5f));
Out.L = pow(In.L, log(Filter.L) / log(0.5f));
这适用于具有中等饱和度和亮度的图像。但是,如果它最初非常高或非常低,这种方法可能意味着函数的下降非常接近 0 或 1。例如,如果饱和度最初为 0.97,函数如下所示:
(有一个点在(0.5,0.97),我忘了标记它)。
这意味着您必须先将饱和度降低到 0.001 之类的值,然后才能开始看到任何实际差异。我遇到过这个测试图像的问题:
原始(饱和度 = 0.5):
饱和度 = 0.001
饱和度 = 0.0
此时我被卡住了。 有没有办法在不丢失细节或剪裁的情况下调整饱和度和亮度?也许可以使用另一种弯曲方法?有没有我找不到的标准方法?提前致谢。
用 Desmos 制作的图表在线图形计算器。
最佳答案
好吧,我仍然不知道有什么“标准”方法可以做到这一点,但我发现即使对于高度饱和的图像,三角曲线也能相对较好地工作。
使用两个函数a*sin(x*PI) where {0 <= x <= 0.5}
和 1+(a-1)*sin(x*PI) where {.5 < x <= 1.0}
, 可以创建如下曲线:
初始饱和度 ( a
) = 0.2:
初始饱和度 = 0.97:
代码:
Out.H = Wrap(In.H + Filter.H - 0.5f, 0.0f, 1.0f);
Out.S = (Filter.S <= 0.5f) ? (In.S * sin(Filter.S * PI)) : (1.0f - (1.0f - In.S) * sin(Filter.S * PI));
Out.L = (Filter.L <= 0.5f) ? (In.L * sin(Filter.L * PI)) : (1.0f - (1.0f - In.L) * sin(Filter.L * PI));
显然这并不完美,但现在看来已经足够了,并且比幂函数可以进行更清晰的图像调整。这也意味着不同的像素正在以与以前不同的速率失去和获得饱和度,这可能与大多数 HSL 调整过滤器不同。如果有人碰巧知道“标准”或通常的处理方式,请分享!
关于C++:在不裁剪的情况下调整图像的 HSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47973697/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!