Как распознать несколько фотографий на белом фоне с помощью openCV-python? - PullRequest
3 голосов
/ 16 июня 2019

По сути, я отсканировал много старых фотографий, используя наш принтер.Около четырех фотографий помещаются на каждой странице сканирования (по четырем углам страницы), и белое пространство не всегда полностью белое.Я хочу использовать openCV, чтобы автоматически обрезать их в отдельные фотографии.Нужны предложения о способе решения этой проблемы, спасибо!

Я думал об определении формы четырех прямоугольников на странице, чтобы получить координаты, или использовал opencv grabCut ... Я не знаю

Я пытался использовать PIL, ноне удалось правильно обрезать фотографии, так как некоторые фотографии также имеют тот же цвет, что и фон, что может привести к преждевременному окончанию кадрирования.

Это грубый набросок того, как это выглядит

This is a rough sketch of what it looks like (за исключением того, что это будут реальные фотографии людей)

1 Ответ

1 голос
/ 16 июня 2019

Вот подход, основанный на предположении, что фотографии не будут пересекаться друг с другом

  • Преобразовать в оттенки серого и размытие по Гауссу
  • Пороговое изображение
  • Найти контурыи получим ограничивающие рамки контуров
  • Извлечение ROI

Пороговое изображение

enter image description here

Далее получим контурыиспользуя cv2.findContours() и возьмите ограничивающие рамки, используя cv2.boundingRect().Затем мы можем извлечь ROI с

x,y,w,h = cv2.boundingRect(c)
ROI = original[y:y+h, x:x+w]

Вот результаты

Фотография # 1

enter image description here

Фотография# 2

enter image description here

Фото # 3

enter image description here

Фото № 4

enter image description here

import cv2

image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blurred, 230,255,cv2.THRESH_BINARY_INV)[1]

# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Iterate thorugh contours and filter for ROI
image_number = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite("ROI_{}.png".format(image_number), ROI)
    image_number += 1

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey(0)
...