Как обрезать изображение на основе сложных критериев? - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть набор похожих изображений, как показано ниже. Я хочу сохранить часть изображения, которая находится в верхнем красном «неправильном» прямоугольнике (зеленые стрелки обозначают пространство, которое я хочу сохранить; все, что я хочу обрезать снаружи. Есть ли код python opencv, который бы это для меня? Я пытался понять это с помощью opencv, играя с порогами, но он просто не делает это для меня.

Исходное изображение:

enter image description here Область, которую я хочу сохранить (область, которую я хочу сохранить, выделена зелеными стрелками): enter image description here

Желаемый результат: enter image description here

Большое спасибо

1 Ответ

2 голосов
/ 03 февраля 2020

Вот как бы я это сделал. Код, который выполняет cv2.imwrite(), предназначен только для отладки, поэтому вы можете увидеть различные этапы, и я поместил временные промежуточные изображения в места их создания, но вы можете просто взять все куски кода и сложить их вместе, чтобы сделать один непрерывный фрагмент кода:

#!/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)

enter image description here

# Make everything not white into black
copy[~np.all(copy == (255, 255, 255), axis=-1)] = (0,0,0)
cv2.imwrite('temp2.png',copy)

enter image description here

# 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)

enter image description here

...