마스크의 가장 가까운 픽셀까지의 거리를 기준으로 그레이 스케일 그라디언트를 만드는 알고리즘이 있습니다. 나는 점점 반경의 원을 구성하고 원의 픽셀에 대해 마스크에 모든 픽셀을 샘플링하여 픽셀을 찾을 :픽셀까지의 거리를 기준으로 한 그레디언트
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
'sin (alpha)'&'cos (alpha)'테이블을 만든다.이 함수는 느리다. 또한 모든 것을 잘못 처리합니다! * 모든 * 픽셀을 스캔하지 마시고 마스크를 기준으로 그라디언트 마스크를 만드십시오 (마크 할 거리 값이있는 픽셀을 표시하십시오). 당신은 이후의 팽창과 함께 그것을 할 수 있습니다. –
@Eddy_Em 그래디언트 마스크에 대한 제안을 끝내고 대답으로 남겨 두어야합니다. –