WedX - журнал о программировании и компьютерных науках

Вычислить соотношение площадей различных цветов в изображении

Я пытаюсь рассчитать пропорцию цветов в изображении и вернуть ее как соотношение. У меня есть много изображений «бревен», которые представляют собой вертикальные последовательности цветов, и я хотел бы знать разницу общей площади 1 цвета по сравнению с другим и соотношение 1 цвета по отношению ко всему изображению.

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

* обратите внимание, что цвета не всегда будут такими, как показано ниже, и я хотел бы иметь возможность использовать более двух цветов, если это возможно (и, возможно, просто указать код RGB цвета, на котором я сосредоточен и хочу отношение этого цвета ко всему).

Обратите внимание, что у меня МНОГО изображений, мне нужно будет запустить это, поэтому было бы полезно перебрать все изображения в папке, если это возможно.

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

import cv2
import numpy as np 
from matplotlib import pyplot as plt

# load image
image = cv2.imread('/Users/Me/Desktop/logtest.png',0)

# plot the binary image
imgplot = plt.imshow(image, "gray")
plt.show()

#Calculate percent of pixels that are black
ret,thresh = cv2.threshold(image,0,230, cv2.THRESH_BINARY)
height, width = image.shape

print ("Height and Width : ",height, width)
size = image.size

print ("Total number of pixels in the image is =", size)

ChosenPix = cv2.countNonZero(image)
print("Total number of black pixels =", count)

Ratio = (ChosenPix/size)*100
print("Ratio of black to total is =", Ratio)

введите здесь описание изображения

19.08.2019

  • @Prune отредактировано на основе ваших комментариев. 21.08.2019
  • Хорошо -- вы близки к минимальному, полному, проверяемому примеру, который мы ожидаем. Какой результат вы получаете, и что вы ожидали? Является ли logtest.png тем же файлом, который вы разместили? Вы ссылаетесь на черно-белые пиксели, но в вашем посте есть коричневые и бирюзовые. 21.08.2019
  • Я также выдвинул вопрос для повторного открытия. Вы можете не знать, но ваше текущее изображение содержит 6 уникальных цветов, а не 2, которые вы предлагаете. Пожалуйста, добавьте еще один пример - может быть, один с 3 цветами. Также уточните, пожалуйста, ПАРТИИ, это 137 или 2 миллиона? Также укажите, пожалуйста, вашу ОС. 22.08.2019

Ответы:


1

Я сделал несколько образцов изображений, подобных этому:

введите здесь описание изображения введите здесь описание изображения введите здесь описание изображения

Затем я использовал glob для выбора всех файлов с именем log*png и обработал каждый из них. Это заключалось в подсчете уникальных цветов в изображении и повторении этих цветов, чтобы подсчитать, сколько пикселей соответствует каждому уникальному цвету:

#!/usr/bin/env python3

from PIL import Image
import numpy as np
import glob

def processLog(filename):
    print(f"Processing log: {filename}")
    # Open this image and make a Numpy version for easy processing
    im   = Image.open(filename).convert('RGBA').convert('RGB')
    imnp = np.array(im)
    h, w = imnp.shape[:2]

    # Get list of unique colours...
    # Arrange all pixels into a tall column of 3 RGB values and find unique rows (colours)
    colours, counts = np.unique(imnp.reshape(-1,3), axis=0, return_counts=1)

    # Iterate through unique colours
    for index, colour in enumerate(colours):
        count = counts[index]
        proportion = (100 * count) / (h * w)
        print(f"   Colour: {colour}, count: {count}, proportion: {proportion:.2f}%")

# Iterate over all images called "log*png" in current directory
for filename in glob.glob('log*png'):
    processLog(filename)

Вывод

Processing log: log2.png
   Colour: [  0 255 255], count: 800, proportion: 5.00%
   Colour: [255   0 255], count: 6400, proportion: 40.00%
   Colour: [255 255   0], count: 8800, proportion: 55.00%
Processing log: log1.png
   Colour: [  0 255   0], count: 6400, proportion: 36.36%
   Colour: [255   0   0], count: 11200, proportion: 63.64%
Processing log: log9.png
   Colour: [ 83 195 187], count: 16160, proportion: 67.33%
   Colour: [ 87 190 179], count: 80, proportion: 0.33%
   Colour: [ 88 184 171], count: 80, proportion: 0.33%
   Colour: [ 89 180 165], count: 80, proportion: 0.33%
   Colour: [ 94 175 158], count: 80, proportion: 0.33%
   Colour: [ 96 164 143], count: 80, proportion: 0.33%
   Colour: [107 146 116], count: 80, proportion: 0.33%
   Colour: [120 114  71], count: 80, proportion: 0.33%
   Colour: [124  99  50], count: 80, proportion: 0.33%
   Colour: [126  88  35], count: 7120, proportion: 29.67%
   Colour: [126  90  37], count: 80, proportion: 0.33%

Конечно, если вы не хотите писать какой-либо Python, вы можете просто перебирать файлы в цикле bash и использовать ImageMagick для извлечения общего количества пикселей и количества пикселей каждого цвета. для тебя. ImageMagick устанавливается в большинстве дистрибутивов Linux и доступен для macOS и Windows:

for f in log*png; do magick "$f" -format "%f: %[fx:w*h]\n"  -write info: -format %c histogram:info: ; done

Вывод

log1.png: 17600
      6400: (  0,255,  0) #00FF00 lime
     11200: (255,  0,  0) #FF0000 red
log2.png: 16000
       800: (  0,255,255) #00FFFF cyan
      6400: (255,  0,255) #FF00FF magenta
      8800: (255,255,  0) #FFFF00 yellow
log9.png: 24000
     16160: ( 83,195,187,255) #53C3BBFF srgba(83,195,187,1)
        80: ( 87,190,179,255) #57BEB3FF srgba(87,190,179,1)
        80: ( 88,184,171,251) #58B8ABFB srgba(88,184,171,0.984314)
        80: ( 89,180,165,255) #59B4A5FF srgba(89,180,165,1)
        80: ( 94,175,158,246) #5EAF9EF6 srgba(94,175,158,0.964706)
        80: ( 96,164,143,255) #60A48FFF srgba(96,164,143,1)
        80: (107,146,116,246) #6B9274F6 srgba(107,146,116,0.964706)
        80: (120,114, 71,246) #787247F6 srgba(120,114,71,0.964706)
        80: (124, 99, 50,255) #7C6332FF srgba(124,99,50,1)
      7120: (126, 88, 35,255) #7E5823FF srgba(126,88,35,1)
        80: (126, 90, 37,250) #7E5A25FA srgba(126,90,37,0.980392)
27.08.2019
  • вау это отлично! Я бился головой о стену, пытаясь что-то придумать, и это работает блестяще! 28.08.2019
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    Для любых предложений по сайту: [email protected]