Opencv Python Crop Image Using Numpy Array


I am using OpenCV 3.1.0-dev and python 2.7.

I am trying to crop out the black exterior of an image I have stitched. The struggle is that there are other pixels in the image that are black so cv2.findcontours returns a very interesting numpy array.

enter image description here

The first image is what I have and the 2nd image is the target.

I was wondering if someone knew how to crop a polygon into the smallest square containing the entire image. The blue lines and points are the contours found by cv2.findContours. Is it possibly to find the top-left most point in the numpy array and the bottom-right most p0int in a numpy array that I can crop to? If so, how do I do it.

Here is my current code. I am trying to find the point to crop with 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

Any Help is Appreciated

Show source
| python   | arrays   | opencv   | numpy   | crop   2016-12-09 23:12 1 Answers

Answers ( 1 )

  1. 2016-12-15 09:12

    Once you have the contours, you can do a list of the x and the y of them and then find the maximum and minimum:

    x, y = [], []
    for i in range(len(contours)):
        for j in range(len(contours[i])):
    x1, x2, y1, y2 = min(x), max(x), min(y), max(y)
    cropped = img[y1:y2, x1:x2]

    The (x1, y1) would be the top left corner and the (x2, y2) the bottom right.

    Hope this helped!

◀ Go back