我想写一个类似于photoshop的高光和阴影修改功能的图像增强算法。你能帮我看看 photoshop 的这个功能在内部对图像做了什么吗?
最佳答案
简单方法
首先,您已经可以在他们的文档中找到一些线索:https://helpx.adobe.com/photoshop/using/adjust-shadow-highlight-detail.html
很难从这些文档中准确猜出他们使用的是哪种算法。下面我只会尝试解释一些我在遇到这个问题时会使用的方法。不要指望有一个清晰的算法,但请使用我的答案作为指导,至少可以引导您找到一条路径。
据我所知,该算法在局部范围内提高了对比度,这意味着对于每个像素,它将根据邻域调整值。 为此,您有几个输入参数:
- 邻域大小(或内核)
- Highlight Threshold:以上都属于highlight
- Shadow Threshold:低于此值的一切都被认为属于阴影
文档中提到了其他一些,但它们对理解算法概念没有用。
1。判断像素属于哪个类别:高光/阴影/无。
对于这部分,您可以考虑使用灰度图像或 HSV 变换的值 channel 。
我会查看像素及其邻域。 计算局部分布的统计量(均值和方差)。
我会将均值与之前定义的阈值进行比较,然后使用方差来区分像素是有噪声还是属于轮廓,在那些情况下我会期望有很大的方差。
2。应用处理
如果像素属于阴影或高光类,您想要提高其对比度,而不是“灰色”对比度,而是“颜色”对比度。
愚蠢的方法:
将根据内部方差对您的颜色 channel 进行加权。
这是一个示例:考虑您的像素是:(32, 35, 50)(R,G,B) 并且属于阴影类。我将确定 3 个系数 Rc、Gc、Bc,它们定义在 0.5 - 1.5(任意)之间,适用于相应的 channel 。
由于蓝色占主导地位,我会为蓝色设置一个高系数,如 1.3,并降低 R 和 G channel 的重要性,系数约为 0.8。
要计算这些系数,您可以考虑查看颜色方差,即颜色 channel 本身之间的差异以及每个 channel 与像素均值之间的差异。
其他(高级)方法
拉普拉斯金字塔
使用金字塔来区分不同尺度的细节,使用拉普拉斯来提高对比度。
- http://mcclanahoochie.com/blog/portfolio/opencl-image-pyramid-detail-enhancement/
- https://www.darktable.org/2017/11/local-laplacian-pyramids/
这些链接可能对您很有帮助,特别是因为资源可用并且概念得到了很好的解释。
我建议您继续寻求更深入地了解 darktable。它是 Lightroom 的强大免费/开源替代品。
我已经通过查看他们的博客发现了一些有趣的东西。
很抱歉这个不完整的答案,我可能会回来改进它。
非常欢迎所有意见和建议
关于algorithm - Photoshop 的高光或阴影改变背后的算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51591445/