c++ - 玻璃效果 - 艺术效果

标签 c++ c algorithm graphics

我希望对图像产生效果,生成的图像看起来就像我们通过有纹理的玻璃(不是普通/光滑的)看它一样......请帮我写一个算法来产生这样的效果.

这是 an example我正在寻找的效果类型

第一个图像是原始图像,第二个图像是我正在寻找的输出。

最佳答案

首先创建一个尺寸为 (width + 1) x (height + 1) 的噪声图,它将用于替换原始图像。我建议使用某种 perlin noise这样位移就不会随机了。这里有个好link关于如何产生柏林噪声。

一旦我们有了噪音,我们就可以做这样的事情:

Image noisemap; //size is (width + 1) x (height + 1) gray scale values in [0 255] range
Image source; //source image
Image destination; //destination image
float displacementRadius = 10.0f; //Displacemnet amount in pixels
for (int y = 0; y < source.height(); ++y) {
    for (int x = 0; x < source.width(); ++x) {
        const float n0 = float(noise.getValue(x, y)) / 255.0f;
        const float n1 = float(noise.getValue(x + 1, y)) / 255.0f;
        const float n2 = float(noise.getValue(x, y + 1)) / 255.0f;
        const int dx = int(floorf((n1 - n0) * displacementRadius + 0.5f));
        const int dy = int(floorf((n2 - n0) * displacementRadius + 0.5f));
        const int sx = std::min(std::max(x + dx, 0), source.width() - 1); //Clamp
        const int sy = std::min(std::max(y + dy, 0), source.height() - 1); //Clamp
        const Pixel& value = source.getValue(sx, sy);
        destination.setValue(x, y, value);
    }
}

关于c++ - 玻璃效果 - 艺术效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2040348/

相关文章:

ARTXP时间序列预测算法和ARTXP理论的Python代码

c++ - 如何让我的圈子用键移动

c - 我不知道这段代码出了什么问题?

c++ - 平等测试功能

c - 运行 Linux 守护进程与后台无限循环

c - C代码错误: expected identifier or ‘(’ before ‘free_node_t’

algorithm - 命中集算法近似

Java生日悖论算法

c++ - 使用 Swift 桥接 header “C 不支持默认参数”

c++ - 什么是正确的 std::set_union 代码?