2

이미지를 읽고 이미지의 평행 사변형을 탐지하려고합니다. 나는 Hough Transform (p = x cos (theta) + y sin (theta))을 사용하여 모서리 점 (로컬 봉우리)을 포함하는 배열을 만들었습니다. 나는 약 2300의 모서리 점 (X, Y)을 얻었고, 평행 사변형을 얻거나 추출하는 방법을 모르겠습니다. 2300 개의 에지 포인트 중 일부 에지 포인트는 원형 모양이며, 삼각형 모양은 평행 사변형을 포함합니다.파이썬에서 검출 된 에지 포인트로부터 평행 사변형을 검출하는 방법

가장자리 점 (X, Y)을 그대로 고려하면 평행 사변형의 꼭지점이 아니며 가장자리 점이 많아서 (2300 점) 작동하지 않습니다.

[EDIT1]

I은 ​​test_img에서 에지 포인트를 저장하고 그 화소 값을 포함한다. test_img [point.getX() point.getY() = 255

test_img.size = 2,343

test_image 위 "plt.imshow (test_img, cmap를 ="회색 ")"플로팅 후 나는 이미지를 아래와 같이 표시합니다.

도움이 될 것입니다.

enter image description here

+0

우리는 정말 심지어 이것에 대해 생각을 시작하기 위해 입력/출력의 일부 코드와 형식/형태를 필요 했어. [ask] 및 [mcve]를 읽어주십시오. –

+0

의견을 보내 주셔서 감사합니다. – Pradhuman

답변

0

UPDATE : OP는 모든 예를 준 전에이 코드가 작성되었습니다. 그것은 포인트 클라우드와 함께 작동해야합니다. 그러나 "거의 평행 사변형"을 찾을 수는 없습니다.

순진한 접근법은 모든 점 쌍에 대해 (dx, dy)을 계산하여이를 사전에 저장하는 것입니다. dict의 값은 점 쌍 목록입니다. 1 쌍 이상인 경우 쌍의 모든 조합이 평행 사변형을 형성합니다.

효율적인 것은 아니지만 (O(n**2)) 여전히 2300 포인트로 수행 할 수 있습니다. 또한 4 포인트 튜플을 테스트하는 것보다 훨씬 효율적입니다.

from random import randint, random 
from collections import defaultdict 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

# N = 2300 
# width = 3000 
# height = 2000 
N = 180 
width = 3000 
height = 2000 
points = [(randint(0, width), randint(0, height)) for _ in range(N)] 
points = list(set(points)) # unique points 
n = len(points) 

plt.scatter(*zip(*points), linewidth=0.001) 

vectors = defaultdict(list) 

for i in range(n): 
    x1, y1 = points[i] 
    for j in range(i + 1, n): 
     x2, y2 = points[j] 
     vectors[(x2 - x1, y2 - y1)].append((i, j)) 

ax = plt.gca() 
for vector, pairs in vectors.items(): 
    if len(pairs) > 1: 
     # TODO: Consider every combination if len(pairs) > 2 
     a, b, c, d = points[pairs[0][0]], points[pairs[0][1]], points[pairs[1][1]], points[pairs[1][0]] 
     ax.add_patch(patches.Polygon(xy=[a, b, c, d], fill=False, color=[random(), random(), random()])) 

plt.show() 

여기에 3000 * 2000 표에서 180 점을 출력입니다 :

가 여기에 신속하고 더러운 구현의

enter image description here

2300 점으로, 당신이 많이 찾을 수 있습니다 평행 사변형.

+0

답변 해 주셔서 감사합니다. 위 이미지에서 평행 사변형을 얻거나 추출하려고합니다. – Pradhuman

0

이미 깔끔한 가장자리를 감안할 때, 당신은 직선을 추출하는 linear regression을 적용하려고 수있는 것은 가장자리 :

  1. 은 가장자리 플러스의 N 이웃에 속하는 임의의 지점을 선택하고 목록 L에 넣어. 작은 간격을 다루기 위해 이웃을 찾는 절차를 조정하십시오.
  2. L에 데이터에 맞는 선을 계산하십시오. 라인 매개 변수 (각도, 오프셋 및 MSE)를 추적하십시오.
  3. MSE가 상승하기 시작할 때까지 이웃들의 배치를 계속 추가하고 선형 모델을 다시 계산하십시오.
  4. 아마 선분을 발견했습니다!그것은 MSE가 0에 가깝습니까? 그렇다면 선의 예상 매개 변수를 어딘가에 저장하십시오.
  5. 그림에서 L의 픽셀을 제외하십시오.
  6. # 1로 이동하십시오.

세그먼트를 수집 한 후에는 평행 사변형과 비슷한 것을 찾는 것이 매우 쉽습니다.

0

깨끗하고 연속적인 가장자리를 얻을 수있어서 다행입니다.

적절한 직선 공차를 사용하여 Douglas-Peucker 절차로 선분으로 세그먼트를 만들 수 있습니다. 충분히 긴 세그먼트를 유지하십시오 *.

간격이 좁고 잘 정렬 된 세그먼트를 채울 수 있으며 깨진 모서리를 재구성 할 수도 있습니다 (* 재구성 한 후에 만 ​​길이에 따라 필터링).

모든 것이 잘된다면, 아래에서와 같은 설명을 얻을 수 있어야하며, 이것으로부터 에지/구석 그래프 분석을 통해 사변형을 유추 할 수 있습니다. (모양의 중복에 기생 모서리를 마음.)

enter image description here

+0

답변 해 주셔서 감사합니다. 이처럼 평행 사변형을 찾으려고합니다. – Pradhuman

관련 문제