【发布时间】:2011-01-04 13:49:58
【问题描述】:
我希望给图像一个效果,生成的图像看起来好像是在粗糙的胶合背景上绘制的,胶合背景在边缘附近自定义自身以突出它们...请帮助我写一个算法来产生这样的效果。 第一张图是原图
第二张图片是我正在寻找的输出。
请注意边缘被检测到,并且掩码在边缘附近发生变化以清楚地指示边缘
【问题讨论】:
标签: c++ c algorithm graphics image-processing
我希望给图像一个效果,生成的图像看起来好像是在粗糙的胶合背景上绘制的,胶合背景在边缘附近自定义自身以突出它们...请帮助我写一个算法来产生这样的效果。 第一张图是原图
第二张图片是我正在寻找的输出。
请注意边缘被检测到,并且掩码在边缘附近发生变化以清楚地指示边缘
【问题讨论】:
标签: c++ c algorithm graphics image-processing
您需要阅读Bump Mapping。有很多凹凸贴图algorithms。
基本算法是:
每个像素
最后,这是一个用于 2D 图像的plain C implementation。
【讨论】:
从 1) 输入图像为 R、G、B 和 2) 一张纹理图,灰度图。
图像可能以字节为单位,从 0 到 255。将其除以 255.0,因此我们将它们设为 0.0 到 1.0。这使数学更容易。为了性能,您实际上不会这样做,而是使用聪明的定点数学,我留给您一个实现问题。
首先,要获得不同颜色区域之间的边缘效果,请在纹理图像中添加或减去部分 R、G 和 B 通道:
texture_mod = texture - 0.2*R - 0.3*B
您可以使用非线性论坛变得更有趣,例如阈值化 R、G 和 B 通道,或计算一些涉及它们的数学表达式。尝试这总是很有趣;我不确定什么最适合重新创建您的示例。
接下来,计算纹理模型的浮雕版本以创建照明效果。这是纹理向上和向右滑动一个像素(或者你喜欢多少)的差异,以及相同的纹理滑动。这给出了 3D 照明效果。
emboss = shift(texture_mod, 1,1) - shift(texture_mod, -1, -1)
(这个公式是用texture_mod还是原来的纹理数据?实验看看。)
这是电源步骤。将输入图像转换为 HSV 空间。 (LAB 或其他色彩空间可能效果更好,也可能效果不佳 - 实验并查看。)请注意,在您想要的最终图像中,“台面”之间的裂缝更暗,因此我们将使用原始的 texture_mod 和浮雕差异来改变 V通道,带有控制效果强度的系数:
Vmod = V * ( 1.0 + C_depth * texture_mod + C_light * emboss)
C_depth 和 C_light 都应该在 0 和 1 之间,可能是更小的分数,例如 0.2 到 0.5 左右。您将需要一个软糖因子来防止 Vmod 溢出或限制在最大值 - 除以 (1+C_depth+C_light)。在亮端进行一些钳位可能有助于高光看起来更亮。像往常一样尝试并查看...
作为一个要点,您还可以通过某种方式修改饱和度通道,也许在 texture_mod 较低的地方减少它。
最后,将 (H, S, Vmod) 转换回 RGB 颜色空间。
如果内存紧张或性能很关键,您可以跳过 HSV 转换,而是将 Vmod 公式应用于各个 R、G、B 通道,但这会导致色调和饱和度发生变化。这是速度和美观之间的权衡。
【讨论】:
这称为凹凸映射。它用于为表面提供非平面外观。
【讨论】: