用C ++ / C模糊图像

时间:2017-02-21 09:42:01

标签: c++ blur

所以我正在盯着一个关于用C ++进行图像处理的项目。

问题在于,我在网上找到关于此事的所有内容(在C ++中模糊图像)都来自CUDA或OpenCV。

有没有办法只使用C ++模糊图像? (首发)

如果是,有人可以分享代码或解释一下吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

首先你需要内存中的图像。

然后你需要第二个缓冲区作为工作区。

然后你需要一个过滤器。常见的过滤器是

          1   4  1
          4 -20  4
          1   4  1

对于每个像素,我们应用滤镜。因此,我们将图像设置为其周围像素的加权平均值,然后减去以避免整体图像变浅或变暗。

应用小型过滤器非常简单。

          for(y=0;y<height;y++)
            for(x=0;x<width;x++)
            {
               total = image[(y+1)*width+x+1];
               for(fy=0; fy < 3; fy++)
                 for(fx = 0; fx < 3; fx++)
                   total += image[(y+fy)*width+x+fx] * filter[fy*3+x];
              output[(y+1)*width+x+1] = clamp(total, 0, 255);

            }

你需要特殊情况的边缘,这只是繁琐但不会增加任何理论上的复杂性。

当我们使用更快的算法时,天真的算法正确地设置边缘变得很重要。然后,您可以在频域中进行计算,使用大滤波器可以更快地完成计算。

答案 1 :(得分:0)

如果您想自己实现模糊,则必须以某种方式将图像存储在内存中。如果您有黑白图像,则

unsigned char[width*height]

可能足以存储图像;如果它是一个彩色图像,也许你会有相同的数组,但大小是三到四倍(每个颜色通道一个,一个是描述不透明度的所谓alpha值)。

对于黑白情况,您必须总结每个像素的邻居并计算其平均值;这种方法通过将操作应用于每个颜色通道来转换为彩色图像。

上述操作是所谓kernel filter的特例,也可用于实现不同的操作。