Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现梯度高斯模糊?_C++_Image_Image Processing - Fatal编程技术网

C++ 如何实现梯度高斯模糊?

C++ 如何实现梯度高斯模糊?,c++,image,image-processing,C++,Image,Image Processing,我想实现梯度高斯模糊效果。所谓渐变,我指的是与Photoshop相同的效果。以下图为例: (来源:) 图像的模糊度随着y坐标的增加而减少(以左上角点为原点) 我知道如何使用核函数和FFT实现正常的高斯模糊,但我不知道如何随着y坐标的变化改变模糊度。我曾尝试将图像分割成不同的线(沿y轴方向),并对这些块应用不同的内核,但这些线的连接部分的效果非常令人讨厌 我也尝试过逐像素计算结果,并在运行时填充内核,效果很好,但是算法太慢了 所以我想知道如何实现快速梯度高斯模糊算法 非常感谢 模糊是2D操作,很

我想实现梯度高斯模糊效果。所谓渐变,我指的是与Photoshop相同的效果。以下图为例:


(来源:)

图像的模糊度随着y坐标的增加而减少(以左上角点为原点)

我知道如何使用核函数和FFT实现正常的高斯模糊,但我不知道如何随着y坐标的变化改变模糊度。我曾尝试将图像分割成不同的线(沿y轴方向),并对这些块应用不同的内核,但这些线的连接部分的效果非常令人讨厌

我也尝试过逐像素计算结果,并在运行时填充内核,效果很好,但是算法太慢了

所以我想知道如何实现快速梯度高斯模糊算法


非常感谢

模糊是2D操作,很难按行处理,每行的模糊程度不同。在考虑高斯模糊之前,我建议探索一种在视觉上很难与高斯模糊区分的框模糊解决方案

一个方法是使用一个。自己创建它是一个很好的练习,而且非常简单:整体图像的大小与原始图像相同。内容是当前像素左侧和上方所有像素强度的总和(我们分别讨论每个rgb通道)。构建积分图像的一种简单迭代方法是使用以下公式:

I(x,y)= Gray(x, y) + I(x-1, y) + I(x, y-1) - I(x-1, y-1) 
提示:如果您首先计算一个时间数组,其中每个元素只在同一行中对其左侧的强度求和,则可以更快地完成此操作

积分图像的美妙之处在于,它们允许在恒定时间内计算任意大小的窗口中的和。事实上,这只需要4个操作:对于x1、y1、x2、y2处的窗口和积分图像I(x,y)

因此,您可以实现快速模糊框过滤器(您不会在视觉上看到框和高斯过滤器效果之间的差异)

你现在需要做的就是把你的快速模糊操作应用到你所有的像素上,作为y的函数改变sz。只需4*w*h操作;构建积分图像也是O(h*w),所以实际上可以在线性时间内完成。分别为每个通道执行此操作,并将它们合并到新的rgb中


最后,积分图像计算是用于快速检测人脸或物体、跟踪等的Haar-box滤波器(而不是小波或Gabors)的基础。它们的速度是当今实时发现人脸的条件,因此值得研究。

两幅图像,一幅模糊,一幅未模糊;现在,将这两幅图像混合在一起(就像photoshop中的一个图层遮罩,具有从白到黑的渐变)@Paranix,你说得对!我把它弄复杂了…这只会产生两个模糊度,而梯度意味着h不同的模糊度,其中h是图像的高度。混合高频和低频不会在像素域中产生中频。你是对的,弗拉德,使用Parananix提出的方法只能产生2度模糊的图像。我已经检查了您提到的完整图像,让我问一个更难的问题,是否可以在恒定时间为图像中的每个像素创建不同的内核?是的,但它们看起来会像下面的链接中的长方体:
sum(x1, y1, x2, y2) = I(x2, y2)+I(x1, y1)-I(x1, y2)-I(x2, y1)
Iblur(x, y, sz) = I(x+sz, y+sz)+I(x, y)-I(x+sz, y)-I(x, y+sz)/[sz*sz]