Как определить край и обрезать изображение в Python

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

Входного Изображения

enter image description here

Ожидаемый Результат

enter image description here

Я попробовал Canny Edge Detection и обрезку изображения, используя список существующих решений (статьи и ответы) с помощью PIL, CV2, но никто, кажется, работают. Я ищу рабочее решение.

некоторые решения, которые я пробовал:

  1. https://www.quora.com/How-can-I-detect-an-object-from-static-image-and-crop-it-from-the-image-using-openCV

  2. обрезать изображение со всех сторон после обнаружения края

  3. как обрезать самый большой прямоугольник из изображения

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

1 ответов


то, что вам нужно, это порог. В OpenCV вы можете сделать это, используя cv2.threshold().

Я выстрелил в него. Мой подход был следующим:--5-->

  1. преобразовать в оттенки серого
  2. порог изображения, чтобы получить только подпись и ничего больше
  3. найти, где эти пиксели, которые появляются в пороговом изображении
  4. обрезка вокруг этой области в исходных оттенках серого
  5. создать новый порог изображение из урожая, которое не так строго для отображения

вот моя попытка, я думаю, что это сработало довольно хорошо.

import cv2
import numpy as np

# load image
img = cv2.imread('image.jpg') 
rsz_img = cv2.resize(img, None, fx=0.25, fy=0.25) # resize since image is huge
gray = cv2.cvtColor(rsz_img, cv2.COLOR_BGR2GRAY) # convert to grayscale

# threshold to get just the signature
retval, thresh_gray = cv2.threshold(gray, thresh=100, maxval=255, type=cv2.THRESH_BINARY)

# find where the signature is and make a cropped region
points = np.argwhere(thresh_gray==0) # find where the black pixels are
points = np.fliplr(points) # store them in x,y coordinates instead of row,col indices
x, y, w, h = cv2.boundingRect(points) # create a rectangle around those points
x, y, w, h = x-10, y-10, w+20, h+20 # make the box a little bigger
crop = gray[y:y+h, x:x+w] # create a cropped region of the gray image

# get the thresholded crop
retval, thresh_crop = cv2.threshold(crop, thresh=200, maxval=255, type=cv2.THRESH_BINARY)

# display
cv2.imshow("Cropped and thresholded image", thresh_crop) 
cv2.waitKey(0)

и вот результат: Cropped signature with thresholding