Как автоматически обрезать белую часть изображения, которая находится внутри серого? - PullRequest
2 голосов
/ 22 мая 2019

Я хочу обрезать белую часть внутри серого и сохранить ее как новое изображение для тысяч изображений.Это можно сделать с помощью PIL или opencv?Если так, то как?Изображение может выглядеть следующим образом:

enter image description here

Я знаю, что в библиотеке PIL есть n обрезка, но как мне сделать так, чтобы скрипт автоматически находил белую часть внутрисерый?Белая часть иногда содержит другие изображения, а иногда и текст.Таким образом, белая часть не всегда является пустой белой или только черной рамкой, как в примере.

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Если вы хотите использовать ImageMagick, это можно сделать в одной строке кода, используя его функцию -trim дважды, по одному разу для каждой из двух серых областей - темной и светлой.Функция обрезки ищет почти постоянные области на заднем плане и удаляет их.-Fuzz XX% - это процентное изменение серых цветов в каждой области, которое считается одним и тем же цветом.

Imagemagick уже установлен с большинством дистрибутивов Linux и доступен также для Windows и Mac OSX.

Ввод:

enter image description here

convert 0.png -fuzz 30% -trim +repage -trim +repage 0_trim.png


enter image description here

Фактически вы можете обрабатывать целую папку изображений, используя ImageMagick mogrify, а не конвертировать.

Create a new directory to hold the output
Change directory to the one containing your images
mogrify -path path_to/new_directory -fuzz 30% -trim +repage -trim +repage *


Вы также можете использовать Python Wand, основанный на ImageMagick.Смотрите обрезку на http://docs.wand -py.org / ru / latest / wand / image.html .Вот код Wand:

#!/bin/python3.7

from wand.image import Image

with Image(filename='0.png') as img:
    img.trim(fuzz=0.3*img.quantum_range)
    img.save(filename='0_wand_trim.png')


Вы также можете сделать вызов подпроцесса из Python в ImageMagick, если вы хотите сделать это таким образом.

#!/opt/local/bin/python3.7

import subprocess

cmd = 'convert 0.png -fuzz 30% -trim +repage -trim +repage 0_trim.png'
subprocess.check_output(cmd, shell=True, universal_newlines=True)


Возможно, вам потребуется указать путь для преобразования, если он отсутствует в переменной среды PATH.

0 голосов
/ 22 мая 2019

Вот основная идея:

  • Преобразование изображения в оттенки серого и размытие изображения
  • Выполнить обнаружение острых кромок
  • Найти контуры изображения и найти область каждого контура
  • Фильтр для максимальной площади контура и обрезки для области ROI

Распознавание краев Canny

image

Теперь мы проведем итерацию по каждому контуру и отфильтруем по наибольшему контуру, который выделен зеленым цветом.

image

Обрезать область интереса по координатам ограничительной рамки

image

import numpy as np
import cv2

original_image = cv2.imread("1.png")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 120, 255, 1)

# Find contours in the image
cnts = cv2.findContours(canny.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# Obtain area for each contour
contour_sizes = [(cv2.contourArea(contour), contour) for contour in cnts]

# Find maximum contour and crop for ROI section
if len(contour_sizes) > 0:
    largest_contour = max(contour_sizes, key=lambda x: x[0])[1]
    x,y,w,h = cv2.boundingRect(largest_contour)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original_image[y:y+h, x:x+w]
    cv2.imshow("ROI", ROI) 

cv2.imshow("canny", canny) 
cv2.imshow("detected", image) 
cv2.waitKey(0)
...