Python для сравнения цветных областей изображений - PullRequest
0 голосов
/ 06 января 2020

Предполагается, что в изображении только 2 цвета. Какой самый простой способ в Python сказать, что изображение имеет больше (цветные области) из этих 2 цветов, чем другой (группа похожих изображений)?

Определение «больше»: общая площадь окрашенного блоки одной картинки, больше другой. (обратите внимание, что форма цветов может быть неправильной)

Спасибо.

enter image description here

1 Ответ

1 голос
/ 06 января 2020

Хорошо, после некоторых экспериментов у меня есть возможное решение. Вы можете использовать Pillow, общую библиотеку загрузки / обработки изображений, чтобы конвертировать изображения в ndarray, а затем использовать метод count_nonzero() для получения желаемых результатов. Как забавный побочный эффект, это работает с произвольным количеством цветов. Вот полный рабочий код, который я только что попробовал:

from PIL import Image # because for some reason, that's how you import something from Pillow
import numpy as np

im = Image.open("/path/to/image.png")
arr = np.array(im.getdata())
unique_colors, counts = np.unique(arr.reshape(-1, arr.shape[1]), axis=0, return_counts=True)

Теперь переменная unique_colors содержит уникальные цвета, которые появляются на вашем изображении, а counts содержит соответствующие значения для каждого цвета на изображении; то есть counts[i] - это количество раз, которое unique_colors[i] появляется на изображении для любого i.

Как работает уникальная + линия изменения формы? Это заимствовано из этого конкретного ответа . По сути, вы сглаживаете массив изображений так, что он имеет форму (num_pixels, num_channels), которая может быть 1, 3 или 4 в зависимости от формата изображения (одноканальный, RGB, RGBA и т. Д. c.). Теперь, когда у меня есть гигантская двумерная «таблица» пикселей, я просто нахожу, какие значения строк (следовательно, axis=0) уникальны, а затем использую ключевое слово return_counts, чтобы вернуть, ну, ну, счетчики.

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

Для моего конкретного изображения формат каналов оказался RGBA; в любом случае, я бы порекомендовал распечатать arr.shape до изменения формы, чтобы убедиться, что у вас правильный индекс. Если вам / кому-либо еще известен более общий способ найти индекс канала для изображения, полученного таким образом - я весь в ушах. Таким образом, вам может потребоваться изменить индекс arr.shape на что-то другое в зависимости от вашего изображения. Для записи я попробовал это на .png изображении, как вы указали. Надеюсь, это поможет!

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