2016-12-09 53 views
4

我正在使用OpenCV 3.1.0-dev和python 2.7。使用Numpy陣列的OpenCV Python裁剪圖像

我試圖裁剪出我縫合的圖像的黑色外觀。鬥爭在於圖像中還有其他像素是黑色的,所以cv2.findcontours會返回一個非常有趣的numpy數組。

enter image description here

第一個圖像是我和第二圖像是目標。

我想知道是否有人知道如何將多邊形裁剪成包含整個圖像的最小方形。藍線和點是由cv2.findContours找到的輪廓。是否可以找到numpy數組中最左上角的點,並且可以裁剪出一個numpy數組中的最右下角的p0int?如果是這樣,我該怎麼做。

這是我目前的代碼。我試圖找到點與cnt=contours[0]

import cv2 
import numpy as np 

img = cv2.imread("/Users/chrisradford/Documents/Research/ImagesToPass/masterToCrop.jpg",1) 
grayed = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
(_,thresh) = cv2.threshold(grayed,1,255,cv2.THRESH_BINARY) 
result, contours, _= cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
cnt = contours[0] 
# (x,y) = top left coordinate & w,h = idth and height 
x,y,w,h = cv2.boundingRect(cnt) #good 
cropped = img[y:y+h,x:x+w] #good 
cv2.drawContours(img,contours,-1,(255,0,0),3) 
cv2.imshow("result",img) 
cv2.imwrite('/Users/chrisradford/Documents/Research/ImagesToPass/StackOverflow.jpg',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

任何幫助表示讚賞

+0

也許你可以使用擴張來首先填補空洞,並侵蝕。然後做'findContours()'。 – HYRY

回答

6

一旦你擁有了contours裁剪,你可以做和x列表他們的y,然後找出最大和最小:

x, y = [], [] 

for contour_line in contours: 
    for contour in contour_line: 
     x.append(contour[0][0]) 
     y.append(contour[0][1]) 

x1, x2, y1, y2 = min(x), max(x), min(y), max(y) 

cropped = img[y1:y2, x1:x2] 

(x1, y1)將左上角和(x2, y2)右下角。

希望這有助於!

+0

你會碰巧做這個確切的過程,但在C + +? –