점프 홍수 알고리즘은 분리 가능합니까?


10

JFA (여기에 설명 된 알고리즘 : http://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf )를 사용하여 보로 노이 다이어그램의 근사값 또는 거리 변환을 얻을 수 있습니다. 시드 수가 아니라 결과 이미지의 크기를 기준으로 로그 시간으로 처리합니다.

그래도 이미지가 각 축에서 같은 크기가 아닌 경우 어떻게해야합니까?

크기가 비슷한 경우 짧은 축의 크기가 1 인 JFA 단계를 추가 할 수 있으며 큰 축의 경우 512 x 256 크기의 이미지와 같이 작동이 끝날 수 있습니다. 크기가 다른 축 크기의 경우 훨씬 비효율적 일 수 있습니다. 512 x 512 x 4의 볼륨 텍스처가 있다고 가정하십시오.

각 축에서 개별적으로 JFA를 실행해도 괜찮은 결과를 얻을 수 있습니까?

아니면 그 시점에 다른 알고리즘이 더 적합합니까? 그렇다면 어떤 알고리즘이 될 수 있습니까?

내 상황에서 이상적으로는 단일 포인트 시드와 임의의 모양의 시드를 모두 지원하려고합니다. 아마도 가중 된 종자, 종자까지의 거리는 승수 및 / 또는 가산기에 의해 조정되어 종자에 다소 영향을 미칩니다.

답변:


7

개별 질문에 대한 빠른 답변

그래도 이미지가 각 축에서 같은 크기가 아닌 경우 어떻게해야합니까?

이 논문은 2의 거듭 제곱 인 측면 길이의 정사각형 이미지를 사용합니다. 이는 설명을 쉽게하기위한 것이지만 알고리즘이 작동하는 데 필요하지는 않습니다. 섹션 3.1 참조 :

일반성을 잃지 않으면 서 n은 2의 거듭 제곱이라고 가정 할 수 있습니다.

즉, 알고리즘이 작동하기 위해이 가정이 필요하지 않습니다.

각 축에서 개별적으로 JFA를 실행해도 괜찮은 결과를 얻을 수 있습니까?

각 축에 실행 별도로 더 잘못된 픽셀 결과를 제공, 가능성 대부분의 경우에 실행하는 데 시간이 오래 걸릴. 이미지 측면 길이 중 하나가 8 (점프 방향의 수)보다 작은 극단적 인 경우 알고리즘이 8 방향을 순차적으로 처리할수록 속도가 빠를 수 있지만 더 넓은 이미지의 경우 축을 분리하면 처리하는 이점이 사라집니다 병행하여.

내 상황에서 이상적으로는 단일 지점 종자와 임의의 모양의 종자를 모두 지원하려고합니다.

이 논문은 6 절의 "일반화 된 보로 노이 다이어그램 (Generalized Voronoi Diagram)"이라는 제목 아래 임의의 모양의 씨앗을 언급한다

... 우리의 알고리즘은 일반 종자를 포인트 시드 모음으로 취급하므로 포인트 시드에 대해 얻은 우수한 성능을 상속받을 것으로 기대합니다.

따라서 임의의 모양을 픽셀 모음으로 모델링하는 것이 목적에 적합하면 알고리즘을 조정할 필요가 없습니다. 시드 번호는 동일하지만 위치가 다른 임의의 모양의 시드에있는 모든 픽셀에 레이블을 지정하는 텍스처를 입력하십시오.

아마도 가중 된 종자, 종자까지의 거리는 승수 및 / 또는 가산기에 의해 조정되어 종자에게 다소 영향을 미칩니다.

"복수 및 첨가제와 같은 종자에 대한 가중치 부여"의 경우, 논문은 잠재적 인 미래의 작업으로 섹션 8을 통과 할 가능성 만 언급합니다. 그러나 원하는 가중치를 픽셀에서 픽셀로 전달되는 시드 데이터에 포함시킬 수 있다면 구현하기가 간단해야합니다.

현재 알고리즘은 <s, position(s)>시드와 그 위치를 지정하기 위해 전달 되며 한 번에 하나의 시드 만 픽셀 당 저장됩니다. 이를 저장하도록 확장 <s, position(s), weight(s)>하면 거리 함수에 가중치를 부여하고 픽셀로 전달되는 새 시드가 현재 저장 한 시드보다 더 가까운 지 여부를 계산하는 데 필요한 모든 정보가 제공됩니다.

곱하기와 가산의 두 가지 가중치를 포함 할 수도 있고 필요하지 않은 경우 곱하기 1을 1로, 가산 물을 0으로 설정할 수도 있습니다. 그런 다음 알고리즘에는 곱셈 가중치 시드, 추가 가중치 시드 또는 한 번에 또는 각각의 조합으로 사용될 가능성이 포함됩니다. 이것은 단지 필요할 것입니다

<s, position(s), multiplicative(s), additive(s)>

현재 알고리즘은 다음을 사용하는이 새로운 알고리즘과 같습니다.

<s, position(s), 1, 0>


이유에 대한 자세한 설명

논문에서와 같이 로그() 밑이 2 인 로그를 참조하십시오.

알고리즘은 다양한 측면 길이에 맞게 조정할 필요가 없습니다.

변의 길이가 같지 않고 2의 거듭 제곱이 아닌 경우 알고리즘을 조정할 필요가 없습니다. 이미 점프 방향 중 일부가 이미지 외부로 이어지는 이미지 가장자리의 픽셀을 처리합니다. 알고리즘은 이미 이미지 외부로 이어지는 방향에 대한 시드 정보를 생략하므로 2의 거듭 제곱이 아닌 너비 또는 높이는 문제가되지 않습니다. 너비 W와 높이 H의 이미지의 경우 필요한 최대 점프 크기는

2로그(최대(,H))1

너비와 높이가 같은 N의 경우

2로그()1

측면 길이 N이 2의 거듭 제곱 인 경우

2로그()1=/2

종이에 사용 된

보다 직관적 인 용어로, 최대 측면 길이를 2의 다음 거듭 제곱으로 반올림 한 다음 절반을 반올림하여 최대 점프 크기를 얻습니다.

가장 긴 변의 길이가 N 인 경우 모든 픽셀에 대한 오프셋은 0에서 N-1 사이에 있으므로 이미지의 다른 모든 픽셀에서 이미지의 모든 픽셀을 커버하기에 충분합니다. 2의 거듭 제곱의 조합 N이 2의 거듭 제곱이고 N이 2의 거듭 제곱이 아닌 경우 0에서 N / 2까지의 모든 정수는 N-1까지 모든 정수를 포함하며, N은 2의 거듭 제곱은 로그의 상한값을 취하여 필요한 것보다 클 수 있습니다 ( 다음 2의 거듭 제곱으로 반올림합니다.

2의 거듭 제곱이 아닌면이있는 이미지는 크게 효율이 떨어지지 않습니다.

점프 횟수는 L과 같이 가장 긴면의 길이에 따라 달라집니다. L이 2의 거듭 제곱 인 경우 점프 횟수는 입니다. L이 2의 거듭 제곱이 아닌 경우 점프 횟수는 입니다. 상당히 큰 이미지의 경우 큰 차이가 없습니다.로그()로그()

예를 들어, 1024 x 1024 이미지에는 10 회의 점프 반복이 필요합니다. 512 x 512 이미지는 9 번의 점프 반복이 필요합니다. 두 크기 사이의 모든 항목에는 10 회 반복이 필요합니다. 최악의 경우 513 x 513 이미지와 같이 2의 거듭 제곱에 불과한 이미지의 경우에도 1 회 추가 반복이 필요하며이 스케일에서 대략 11 % 더 높습니다 (9 대신 10).

정사각형이 아닌 이미지는 영역 당 효율성이 떨어집니다

필요한 반복 횟수는 가장 긴면 길이에 의해 결정되므로 1024 x 1024 이미지에 걸리는 시간은 1024 x 16 이미지와 같습니다. 정사각형 이미지를 사용하면 동일한 반복 횟수로 더 큰 영역을 덮을 수 있습니다.

축을 분리하면 품질이 떨어질 수 있습니다

이 백서의 5 장에서는 가능한 오류에 대해 설명합니다. 모든 픽셀은 다른 모든 픽셀의 경로를 통해 도달 할 수 있지만 일부 경로는 해당 시드가 경로의 이전 픽셀에 가장 근접하지 않기 때문에 가장 가까운 정확한 시드를 가져 오지 않습니다. 시드를 통해 시드를 전파 할 수없는 픽셀은 해당 시드를 "종료"했다고합니다. 픽셀에 가장 가까운 시드가 해당 픽셀의 모든 경로에서 종료되면 픽셀은 다른 시드를 기록하고 최종 이미지에 잘못된 색상이 표시됩니다.

최종 결과가 정확하려면 시드를 종료하지 않는 경로가 하나만 있으면됩니다. 올바른 시드에서 지정된 픽셀까지의 모든 경로가 차단 된 경우에만 잘못된 색상이 발생합니다 .

경로에 수평 및 수직 점프가 교대로 포함 된 경우 축을 분리하면이 경로를 사용할 수 없게됩니다 (모든 수직 점프 전에 모든 수평 점프를 수행하여 교대로 불가능 함). 대각선 점프는 전혀 불가능합니다. 따라서 대각선 점프를 번갈아 포함하거나 포함하는 경로는 제외됩니다. 모든 픽셀은 여전히 ​​모든 다른 픽셀에 대한 경로를 가지지 만, 이제는 더 적은 경로가 있기 때문에 주어진 픽셀이 올바른 시드를 수신하지 못하게 될 가능성이 높아 지므로 최종 결과가 더 오류가 발생하기 쉽습니다.

축을 분리하면 알고리즘이 더 오래 걸릴 수 있습니다

플러딩이 더 이상 병렬로 수행되지 않고 대신 각 축에 대해 반복되므로 축을 분리하여 효율성이 저하 될 수 있습니다. 2D의 경우 약 2 배 더 길고 3D의 경우 약 3 배 길어질 수 있습니다.

이것은 대각선 점프가 부족하여 다소 완화 될 수 있지만 여전히 전반적인 효율성 감소를 기대합니다.


1
나는 이미 이것의 일부를 실험하기 시작했다. 전체 9 대신 + 부호 (5 번의 읽기)로 샘플링하면 테스트에서 차이가 나타나지 않지만 더 복잡한 상황에서는 차이가 있음을 알았습니다. 전체 x jfa를 수행 한 다음 전체 y jfa를 수행하면 많은 오류가 발생합니다. 나는 당신이 그것을 가지고 있다면 더 자세한 정보 / 정보를 듣고 싶지만 당신의 대답을 받아들이겠습니다 : P
Alan Wolfe

1
잊으 내 실험 중 하나 여기의 링크 : shadertoy.com/view/Mdy3D3
앨런 울프

읽기가 5 번인 경우와 마찬가지로 분명히 작동한다는 점에 흥미가 있습니다. 특히 병렬화 할 수 없기 때문입니다. 이 백서에는 오류가 발생하는 사례가 나열되어 있으므로 의도적으로이를 설정하고 5 개의 점프 방향이 여전히 좋은지 확인할 수 있습니다.
trichoplax

당신은 당신의 자신의 답변을 게시 할 준비가 된 것 같습니다 ...
trichoplax

내 정보 보충제 당신 : P
앨런 울프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.