2017-03-09 1 views
1

나는 이미지 처리를 처음 사용하고 scikit 이미지 학습을 시작했습니다. 사각형의 모서리를 감지하고 전체 이미지를 잘라내려고합니다. 그러나 나는 세그먼트 화 및 탐지 알고리즘의 엄청난 양에서 길을 잃고 있으며, 필요한 알고리즘과 알고리즘을 알지 못합니다.직사각형을 감지하고 이미지를 크기로 자르기

이 코드는 샘플 이미지를 생성합니다. 녹색 직사각형으로 자르고 싶습니다. 내가 무엇을해야 하나? pyplot

import numpy as np 
import skimage 
from skimage import draw 

img = np.zeros((500, 500, 3), dtype=np.double) 

poly = np.array([[25, 25], 
       [25, 75], 
       [75, 75], 
       [75, 25]]) 

rr, cc = draw.polygon(poly[:, 0], poly[:, 1], img.shape) 

img[rr, cc, 1] = 1 
plt.imshow(img) 
plt.show() 

로서하기 matplotlib 수입 pyplot에서

태스크가 직사각형 (폴리 어레이)의 에지를 검출하고 상기 이미지를 잘라낼 것이다.

해리스 ​​코너 감지, 마른 가장자리 감지 및 기타 많은 시도를했지만 완전히 혼란 스럽습니다. 이것은 간단한 작업처럼 보이지만 나는 그것을 얻지 못하고있다.

OpenCV를 사용하면 더 쉬울까요? 도와주세요!

+0

예. OpenCV를 사용해야합니다, [이 SO 포스트] (http://stackoverflow.com/questions/11424002/how-to-detect-simple-geometric-shapes-using-opencv)를 확인하십시오. – Bill

답변

0

등고선 찾기 접근법을 사용하는 경우 현재 OpenCV가 가장 적합합니다. 다른 방법으로 오브젝트를 식별 할 수 있다면, skimage를 사용하면 좌표를 식별하고 이미지를 자르기 쉬워집니다. 예를 들면 :

import numpy as np 
import skimage 
from skimage import draw, measure 
import matplotlib.pyplot as plt 

# --- Generate test data --- 
img = np.zeros((500, 500, 3), dtype=np.double) 

poly = np.array([[25, 25], 
       [25, 75], 
       [75, 75], 
       [75, 25]]) 

rr, cc = draw.polygon(poly[:, 0], poly[:, 1], img.shape) 

img[rr, cc, 1] = 1 
# --- End generate test data --- 

# Generate a mask with all objects close to green 
green = (0, 1, 0) 
mask = np.sum((img - green)**2, axis=2) < 0.1 

# Label the different objects in the image 
label_img = measure.label(mask) 

# Find all objects 
regions = measure.regionprops(label_img) 

# Find the first object (since we only have one, that's the rectangle!) 
r = regions[0] 

# We'll use the `bbox` property to select the bounding box 
# # For a full list of properties, take a look at the docstring of 
# measure.regionprops 

print('The bounding box is {}'.format(r.bbox)) 

r0, c0, r1, c1 = r.bbox 
img_crop = img[r0:r1, c0:c1] 

f, (ax0, ax1) = plt.subplots(1, 2) 
ax0.imshow(img) 
ax1.imshow(img_crop) 
plt.show() 

enter image description here

+0

감사! 다시 나를 도울 수 있니? 귀하의 솔루션은 예제에서 잘 작동하지만 실제 사진에는 오류가 발생합니다. 행렬이 호환되지 않기 때문에 마스크 생성을 시도 할 때 numpy 오류가 발생합니다. 'ValueError : 피연산자를 셰이프 (2048,2456) (3,)'와 함께 브로드 캐스트 할 수 없습니다. 나는 이미지 배열이 예제와 같은 차원을 가져야하므로 실제로는 얻지 못한다. – cripcate

관련 문제