Замените белые цветные строки в изображении, используя Python - PullRequest
0 голосов
/ 30 января 2019

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

Я пытался использовать matplot lib

  1. преобразовать изображение в матрицу и посмотреть, если (r, g, b) = (0,0,0) или (1,1,1), и удалить всю строку в изображении, если каждый (r, g, b) имеет вид выше вматрица строки

    выглядит как [[[r, g, b], [r, g, b] ....]], ...., [[r, g, b], [r, g, b] ....]]]

Я выполнил мое требование, но я выполняю это для 500 изображений, и это занимает около 30 минут.Могу ли я сделать это лучшими способами?

actual image

, и требуемое изображение должно быть как

required output

Edit-1 : пробовал методом обрезки из пакета палочки

with wand_img(filename=path) as i:
# i.trim(color=Color('white'))
# i.trim(color=Color('white'))
i.trim()
i.trim()
i.save(filename='output.png')

, но не работает для следующих типов изображений

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Использование двух триммеров в Imagemagick 6.9.10.25 Q16 Mac OSX Sierra отлично работает для меня.Ваше изображение имеет черную полосу на правой стороне.Первая отделка удалит это.Вторая обрезка удалит оставшуюся белизну.Возможно, вам придется добавить некоторое количество пуха (допуск) для отделки.Но мне это не нужно.

Ввод:

enter image description here

convert img.png -trim +write tmp1.png -trim result.png

Результат первой обрезки (tmp1.png):

enter image description here

Окончательный результат после второй подстройки:

enter image description here

ДОПОЛНЕНИЕ:

Глядя на документы для Python Wand:

trim(*args, **kwargs)
Remove solid border from image. Uses top left pixel as a guide by default, or you can also specify the color to remove.

Parameters: 
color (Color) – the border color to remove. if it’s omitted top left pixel is used by default
fuzz (numbers.Integral) – Defines how much tolerance is acceptable to consider two colors as the same.


Вам потребуется указать color = black для первой обрезки, так как эта версия обрезки использует верхний левый угол для обрезки,Командная строка Imagemagick смотрит на все углы.Если это не помогло, добавьте некоторое значение fuzz.

0 голосов
/ 30 января 2019

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

Чтобы обрезать один образ, запустите терминал (или командную строку в Windows) иrun:

magick input.png -fuzz 20% -trim result.png

Это даст вам это - хотя я добавил черную рамку, чтобы вы могли разглядеть ее размер:

enter image description here

Если у вас есть много дел, вы можете сделать их параллельно с GNU Parallel следующим образом:

parallel -X magick mogrify -trim ::: *png

Я сделал 1000 копий вашего изображения и сделал все эточерез 4 секунды на MacBook Pro.

Если у вас нет GNU Parallel , вы можете сделать 1000 изображений за 12 секунд, например:

magick mogrify -trim *png

Если вы хотите это сделатьс Python вы можете попробовать что-то вроде этого:

#!/usr/bin/env python3

from PIL  import Image, ImageChops

# Load image and convert to greyscale
im = Image.open('image.png').convert('L') 

# Invert image and find bounding box
bbox = ImageChops.invert(im).getbbox()

# Debug
print(*bbox)

# Crop and save
result = im.crop(bbox)
result.save('result.png')       

Это дает тот же вывод, что и ImageMagick версия.Я бы посоветовал вам использовать многопоточный инструмент для параллельного выполнения партий для лучшей производительности.

Последовательная версия занимает 65 секунд для 1000 изображений, а мультиобработка - 14 секунд для 1000 изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...