2017-01-19 2 views
0

Я хочу автоматически обрезать изображение с помощью OpenCV во множество изображений, количество выходных изображений является переменной. Я начал с замены белого фона прозрачным фоном.Автоматическое изменение изображения с помощью Python

Исходное изображение: enter image description here

я заменить белый фон прозрачным фоном, используя этот скрипт:

from PIL import Image 

img = Image.open('./images/SPORTS/546.png') 
img = img.convert("RGBA") 
datas = img.getdata() 

newData = [] 
for item in datas: 
    if item[0] == 253 and item[1] == 252 and item[2] == 252: 
     newData.append((255, 255, 255, 0)) 
    else: 
     newData.append(item) 

img.putdata(newData) 
img.show() 
img.save("split_image_example.png", "PNG") 

Таким образом, в этом примере я хочу получить 4 разделенных изображения.

enter image description hereenter image description hereenter image description hereenter image description here

ответ

2

Вы можете использовать BoundingRect() на findContour() См http://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html

В вашем случае:

img=cv2.imread(path_to_your_image,0) 
if img is None: 
    sys.exit("No input image") #good practice 

#thresholding your image to keep all but the background (I took a version of your 
#image with a white background, you may have to adapt the threshold 
thresh=cv2.threshold(img, 250, 255, cv2.THRESH_BINARY_INV); 
res=thresh[1] 

#dilating the result to connect all small components in your image 
kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)) 
for i in range(10): 
    res=cv2.dilate(res,kernel) 

#Finding the contours 
img2,contours,hierarchy= 
cv2.findContours(res,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 


cpt=0 
for contour in contours: 
    #finding the bounding rectangle of your contours 
    rect=cv2.boundingRect(contour) 
    #cropping the image to the value of the bounding rectangle 
    img2=img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]] 
    cv2.imwrite("path_you_want_to_save"+str(cpt)+".png", img2) 
    cpt=cpt+1; 

Это быстрый код, вы можете изменение: метод сохранения, параметры вычисления контуров, метод расширения .... Большинство импорта antil, это соответствует изображению, которое вы указали здесь, но может быть не подходит для случаев, когда ваши объекты ближе или более «разрежены» (если расширение не может объединить их вместе)

+0

Спасибо, я получаю следующее сообщение об ошибке при запуске скрипта 'img2, контуры, иерархия = cv2.findContours (res, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: требуется больше, чем 2 значения для распаковки –

+0

try img2, contours = cv2.findContours (res , cv2.RETR_EXTERN AL, cv2.CHAIN_APPROX_ SIMPLE) – Soltius

+0

Как выбрать параметры treshold? 'cv2.threshold (img, 250, 255, cv2.THRESH_BINARY_INV);' –