【问题标题】:Bluring an image in C++/C [closed]在 C++/C 中模糊图像 [关闭]
【发布时间】:2017-02-21 09:42:01
【问题描述】:

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

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

有没有办法只用 C++ 模糊图像? (对于初学者)

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

谢谢!

【问题讨论】:

  • 是的。均值过滤器。但首先你需要一个结构来保存你的图像。然后加载它。然后保存它。在两者之间应用过滤器。
  • 我推荐CImg,它是C++,重量轻,安装简单(只有一个头文件,没有库)并且易于使用...cimg.eu
  • c++ 中没有blur_image() 函数,但所有工具都在那里。图像只是数据,您需要将其读入,可能对其进行解码(如果是 jpeg 的话),对其进行摆弄,可能对其进行编码,然后再次保存。

标签: c++ blur


【解决方案1】:

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

然后您需要第二个缓冲区用作工作区。

那么你需要一个过滤器。一个常见的过滤器是

          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);

            }

您需要对边缘进行特殊处理,这很繁琐,但不会增加任何理论上的复杂性。

当我们使用比简单算法更快的算法时,正确设置边缘变得很重要。然后在频域中进行计算,使用大滤波器会快很多。

【讨论】:

  • 谢谢!看起来和 MATLAB 很像。
【解决方案2】:

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

unsigned char[width*height]

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

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

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

【讨论】:

  • 谢谢!我知道原理。我知道如何在 MATLAB 中实现它。但是对于这个特定的项目,我需要用 C++
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多