所以我正在盯着一个关于用C ++进行图像处理的项目。
问题在于,我在网上找到关于此事的所有内容(在C ++中模糊图像)都来自CUDA或OpenCV。
有没有办法只使用C ++模糊图像? (首发)
如果是,有人可以分享代码或解释一下吗?
谢谢!
答案 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的特例,也可用于实现不同的操作。