简体   繁体   中英

How to crop images based on mask threshold?

I have to crop a lot of images manually. Not the funniest thing to do. So I thought I'd try to do it using Python.

I can detect the subject, create a mask, but I have no idea how to get the points from the very bottom part and crop based on them.

Any help is appreciated

import cv2

img = cv2.imread('image5.jpg')
h, w = img.shape[:2]

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


thr = cv2.threshold(gray, 192, 255, cv2.THRESH_BINARY_INV)[1]
cv2.imwrite('result5.png', thr)

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

Very good thinking I'd say! now the implementation:

xx,yy = thrs.nonzero()
max_crop_h = xx.max()
crop = img[:max_crop_h,:]

numpy has your back!

you can try to find all external contours using cv2.RETR_EXTERNAL and pick the bottom most point, like this:

import cv2
import numpy as np
import imutils

im = cv2.imread('images/tennis.jpg')

# Percent of original size
scale_percent = 20 
width = int(im.shape[1] * scale_percent / 100)
height = int(im.shape[0] * scale_percent / 100)
dim = (width, height)
  
# Resize image
im = cv2.resize(im, dim, interpolation = cv2.INTER_AREA)

# Convert to grayscale
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

# Canny
canny_output = cv2.Canny(im, 120, 240)

# Find external contours
contours, hierarchy = cv2.findContours(canny_output, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#cv2.drawContours(im, [contours[0]], 0, (0,255,0), 3) # Uncomment this line to see what contour opencv is finding

# Pick the bottom most point and add an offset (whatever value you want, this is just for aesthetics)
c = contours[0]
bottommost = tuple(c[c[:, :, 1].argmax()][0])[1] + 5

# Crop image
im = im[:bottommost, :]

# Show image
cv2.imshow('image', im)
cv2.waitKey()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM