Хорошо, после некоторых экспериментов у меня есть возможное решение. Вы можете использовать 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
изображении, как вы указали. Надеюсь, это поможет!