Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
Image processing 基于像素距离的渐变_Image Processing - Fatal编程技术网

Image processing 基于像素距离的渐变

Image processing 基于像素距离的渐变,image-processing,Image Processing,我有一个算法,可以根据到遮罩中最近像素的距离创建灰度梯度。我通过构造一个半径越来越大的圆,并根据圆的像素对遮罩中的所有像素进行采样来找到像素: for (x = 0; x < width; x++){ for (y = 0; y < height; y++) { bool pixelFound = false; for (radius = 0; radius < resolution, pixelFound == false; radius++)

我有一个算法,可以根据到遮罩中最近像素的距离创建灰度梯度。我通过构造一个半径越来越大的圆,并根据圆的像素对遮罩中的所有像素进行采样来找到像素:

for (x = 0; x < width; x++){ 
   for (y = 0; y < height; y++) {
      bool pixelFound = false;
      for (radius = 0; radius < resolution, pixelFound == false; radius++) {
         for (alpha = 0; alpha < 2 * PI; alpha += 1/radius) {
            xx = x + cos(alpha)*radius;
            yy = y + sin(alpha)*radius;

            if ( MaskHasPixel(xx, yy) ) {
               pixelFound = true;
               gradient = 1 - Magnitude(xx-x, yy-y) / resolution;
               WriteGradientForPixel(x,y, gradient);
            }
         }
      }
   }
}
(x=0;x 对于(y=0;y<高度;y++){ 布尔像素发现=假; 对于(半径=0;半径<分辨率,pixelFound==false;半径++){ 对于(alpha=0;alpha<2*PI;alpha+=1/半径){ xx=x+cos(α)*半径; yy=y+sin(α)*半径; if(马斯卡西塞素(xx,yy)){ pixelFound=true; 梯度=1——震级(xx-x,yy-y)/分辨率; 写入像素的梯度(x、y、梯度); } } } } } 目前,该算法速度非常慢-对于512x512的图像和128x128的掩码大小,它必须进行512*512*384*41=4 127 195 136比较,这需要大量的CPU计算时间。其中一个选择是在GPU上进行计算,但是否有可能优化此算法以使其工作更快?我希望最终得到一个比较快的平滑渐变


谢谢

对于随后的扩张。它们可以用一种改进的算法来完成。假设在零背景上有一些遮罩。将其放在您的图像上(通过放大零背景,此阶段的图像可能是
无符号短
无符号整数
的数组,具体取决于其大小-我们需要输入其像素距离值)

下一个操作是距离计算。为了更快地完成此操作,首先我们找到遮罩的边界并将其保存到坐标数组中。之后,我们通过该数组,填充8个连接的非零像素,同时填充一个新的边界数组

在第一次迭代结束时,
free()
first border数组,使用新数组运行第二次迭代,将2放入相邻数组并填充下一个border数组

重复迭代,直到最后一个边框数组将有0个成员


另一个变体是直接算法,与您的算法类似。计算并存储掩码的边框。好啊现在开始扫描扩展到图像大小的遮罩的所有像素

如果pixel value==0,我们将遍历边界的所有像素,计算距离并存储最小距离。它将是渐变的值

该算法可以通过只计算到从我们的点的一侧开始的边界像素的距离来改进。为此,我们不仅要存储边界像素的坐标,还要存储从遮罩重心到边界像素的角度。然后,当扫描边界时,我们可以丢弃与当前图像点角度相等的像素,并屏蔽重心±某个值(π/2?)

计算速度更快的另一种方法是将正弦和余弦制成表格,其步长非常小,以至于相邻构件之间的值可以忽略不计。这一步可以是角度像素大小的图像角度从其中心。甚至更大



当然,对于这个问题还有很多其他不同的优化方法,也许其中一些会更快。这是一个调查的问题。

我找到了一种方法,使算法快3倍: 1.计算边界遮罩的几何中心。 2.计算从当前像素到上述中心的方向:dir=(中心-像素)。归一化 3.检查每一个向中心移动的像素,无论它是否是边界像素。 4.如果是,那么搜索就结束了。 5.如果没有找到朝向中心的边界像素,则使用原始的较慢方法


另一种加速的方法是缩小原始图像的大小。这将有很大帮助。

与您的问题无关,但您可能希望在
半径
中用
替换
,,这些函数运行缓慢。你也做错事了!不要扫描所有像素,而是根据你的遮罩制作一个渐变遮罩(用像素到标记的距离值标记像素)。你可以通过后续的放大来实现。@Eddy_-Em你应该充实你关于渐变遮罩的建议,并将其作为答案。@Eddy_-Em你能详细说明一下遮罩吗?一些伪代码将非常有用@Ilysuzdalnitski这与使用欧几里德距离的距离变换有什么不同?有几种方法在与像素数量相关的线性时间内运行,例如,有关其中几种方法,请参见“2D欧几里德距离变换算法:比较调查”。