问题
I have a set of similar images like the one below. I want to keep the portion of the image that is within the top red 'irregular' rectangle (green arrows represent the space that I want to keep; anything outside I want to crop out. Is there a python opencv code that would do it for me? I've been trying to figure it out using opencv by playing around with thresholds but it's just not doing it for me.
Original image:
The area that I want to keep (the space I want to keep is highlighted by green arrows):
Desired output:
Thank you so much
回答1:
Here's how I would do it. The code that does cv2.imwrite()
is just for debug so you can see the various stages and I have put the temporary, intermediate images in where they are produced, but you can just take all the chunks of code and append them together to make one continuous piece of code:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image
im = cv2.imread('wavy.png')
copy = im.copy()
# Flood fill with white starting from 10,10
cv2.floodFill(copy,mask=None,seedPoint=(10,10),newVal=(255,255,255))
cv2.imwrite('temp1.png',copy)
# Make everything not white into black
copy[~np.all(copy == (255, 255, 255), axis=-1)] = (0,0,0)
cv2.imwrite('temp2.png',copy)
# Make white all the bits we don't want at the bottom of the original image
im[:] |= ~copy
# Crop/trim part we want
Ynonzero, Xnonzero, _ = np.nonzero(copy)
res = im[np.min(Ynonzero):np.max(Ynonzero), np.min(Xnonzero):np.max(Xnonzero)]
# Save result
cv2.imwrite('result.png',res)
来源:https://stackoverflow.com/questions/60013099/how-to-crop-an-image-based-on-a-complex-criteria