我有一个算法,根据距离到最接近的像素的距离创建一个灰度渐变。我通过构建一个圆圈的半径增大和采样的所有像素的面具对圆的像素找到像素:基于到像素的距离的渐变
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);
}
}
}
}
}
目前的算法是非常缓慢的 - 为512×512和口罩大小的图像128x128它将不得不做512 * 512 * 384 * 41 = 4 127 195 136比较,这需要花费大量的时间在CPU上进行计算。其中一种选择是在GPU上进行计算,但是可以优化该算法以使其运行速度更快吗?我最终想要相对快速地获得一个很好的平滑梯度。
谢谢!
与你的问题没有关系,但你可能想用'radius
2013-02-13 16:32:17
使'罪'(alpha)&'cos(alpha)'表 - 这些功能缓慢。你也做错了一切!不要扫描*所有*像素,而是根据您的遮罩制作渐变遮罩(标记具有要标记距离值的像素)。你可以用随后的扩张来完成。 – 2013-02-13 16:35:00
@Eddy_Em你应该充实你的渐变面具的建议,并将其作为答案。 – 2013-02-13 17:35:00