점이 아닌 선을 입력 피처로 사용하여 Thiessen (Voronoi) 다각형을 작성합니까?


24

특정 다각형 경계 안에 선 피쳐 세트가 있습니다. 각 선에 대해 가능한 모든 점이 레이어의 다른 선보다 주어진 선에 더 가까운 다각형을 생성하고 싶습니다. 과거에 들로네 삼각 분할 (Delaunay Triangulation)을 사용하여 포인트 입력 기능에 대해이 작업을 수행했지만 선 기능으로 유사한 프로세스가있는 경우이를 찾을 수 없었습니다.

ETA : Geogeek의 솔루션이 나에게 일어 났지만, 입력 라인에 꼭짓점이 적은 직선 섹션에서 결과로 생성되는 다각형은 너무 겹치지 않아야합니다. 여기 빨간 선은 입력입니다. 정점과 그로부터 생성 된 Thiessen 다각형을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

어쩌면 빠르고 (매우) 더러운 해결책은 각 선을 선의 정점이 아닌 균일하게 간격을 둔 여러 점으로 변환하고 그 점에서 Thiessen 다각형을 생성 한 다음 원래 선 ID를 기준으로 해체하는 것입니다.


4
점과 함께 선분을 포함하는 보로 노이 다이어그램은 "다각형"으로 구성되지 않습니다. 오히려, 그들의 세포에는 포물선의 일부를 포함 할 수있는 경계가 있습니다 . 이러한 이유로 Voronoi 테셀레이션을 만드는 가장 효율적이고 정확한 방법 중 하나는 래스터 표현을 사용하는 것입니다. ESRI는이 절차를 유클리드 할당이라고 합니다.
whuber

답변:


11

래스터 / 이미지 처리 솔루션을 설명 하기 위해 게시 된 이미지부터 시작했습니다. 파란색 점, 회색 선, 색상이 지정된 영역 및 텍스트가 중첩되어 원본 데이터보다 품질이 훨씬 낮습니다. 그리고 원래의 빨간 선이 두껍게됩니다. 그럼에도 불구하고 우리는 여전히 도전 과제를 제시합니다. 그럼에도 불구하고 우리는 여전히 높은 정확도로 Voronoi 셀을 얻을 수 있습니다.

빨간색 채널에서 녹색을 빼고 가장 밝은 부분을 3 픽셀 씩 확장하고 침식하여 빨간색 선형 피처의 보이는 부분을 추출했습니다. 이것은 유클리드 거리 계산의 기초로 사용되었습니다 :

i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]

구호 플롯

(여기에 표시된 모든 코드는 Mathematica 8입니다.)

인접한 두 Voronoi 셀을 분리하는 모든 지점을 포함해야하는 명백한 "리지"를 식별하고이를 선 레이어와 다시 결합하면 다음과 같이 진행할 수 있습니다.

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]

결합 된 이미지

빨간색 띠는 선을 절약 할 수있는 것을 나타내고 시안 띠는 거리 변환의 융기 부를 나타냅니다. (오리지널 라인 자체의 끊김으로 인해 여전히 많은 쓰레기가 남아 있습니다.)이 융기 부분은 추가 픽셀을 통해 추가 확장을 통해 청소하고 닫아야합니다. 원래 선과 그 사이의 융기 부분 (일부는 명시 적으로 재결합해야 함) :

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]

이것이 실제로 달성 한 것은 5 가지 방향의 선형 피처 를 식별하는 것 입니다. 합류점에서 나오는 세 개의 개별 선형 피처를 볼 수 있습니다. 각각은 양면이 있습니다. 가장 오른쪽의 두 기능 중 오른쪽은 동일하다고 생각했지만 다른 모든 것을 구별하여 5 가지 기능을 제공했습니다. 색상이 지정된 영역에는이 5 가지 기능 중 Voronoi 다이어그램이 표시됩니다.

결과

세 개의 선형 피쳐 (이 그림에서는 사용할 수 없었 음)를 구별하는 레이어를 기반으로하는 유클리드 할당 명령 은 각 선형 피쳐의 서로 다른면을 구별하지 않으므로 가장 왼쪽 선 옆에있는 녹색 및 주황색 영역을 결합합니다. ; 가장 오른쪽에있는 청록색 특징을 둘로 나눕니다. 그리고 분할 된 조각을 반대편의 해당 베이지 및 자홍색 특징과 결합합니다.

분명히이 래스터 접근 방식은 모양에 관계없이 임의의 피처 (점, 선형 조각 및 다각형까지)의 보로 노이 테셀레이션을 구성 할 수있는 능력을 가지며 선형 피처의 측면을 구별 할 수 있습니다.


1
비슷한 솔루션이 mathematica.stackexchange.com/questions/20696/…에 설명되어 있습니다.
whuber

5

나는 당신이 할 수 있다고 생각합니다 :

  • 선 정점을 점 (line_points)으로 변환합니다.
  • points (line_points)를 사용하여 보로 노이 다각형을 만듭니다.
  • 선 레이어에서 저장 한 id 속성 또는 선 레이어와의 공간 결합을 사용하여 결과로 얻은 다각형을 분해합니다.

당신의 요구를 더 잘 설명하기 위해 그림을 제공 할 수 없다면, 나는 당신의 질문을 정말로 이해하기를 바랍니다.


2
나는 당신이 그것을 이해하고 그 해결책이 나에게 일어났다 고 생각하지만 선이 꼭지점이 적은 문제가 발생합니다. 스크린 샷으로 질문을 업데이트하겠습니다.
Dan C

3
선을 따라 점을 더 조밀하게 만들면 올바르게 작동합니다. 래스터 기반 접근법 (whuber가 질문에 대한 의견에서 언급했듯이)보다 이것보다 훨씬 효율적이라고 생각합니다.
Andy W
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.