Найти средний цвет каждого раздела изображения - PullRequest
0 голосов
/ 29 апреля 2019

Я ищу лучший способ достичь следующих результатов с помощью Python:

  1. Импорт изображения.
  2. Добавить сетку из n секций (4 показаны в этом примере ниже).
  3. Для каждой секции найдите доминирующий цвет.

sky

Желаемый вывод

Вывод массива, списка, диктанта или аналогичных значений, фиксирующих эти доминирующие значения цвета.

Может быть, даже график Matplotlib, показывающий цвета (как в пиксельной графике).

Что я пробовал?

Изображение может быть нарезано с использованием изображенияslicer:

import image_slicer
image_slicer.slice('image_so_grid.png', 4)

Затем я мог бы потенциально использовать что-то вроде this , чтобы получить средний цвет, но я уверен, что есть лучшие способы сделать это.

Каковы наилучшие способы сделать это с Python?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Это работает для 4 разделов, но вам нужно выяснить, как заставить это работать для 'n' разделов:

import cv2

img = cv2.imread('image.png')

def fourSectionAvgColor(image):
    rows, cols, ch = image.shape
    colsMid = int(cols/2)
    rowsMid = int(rows/2)

    numSections = 4
    section0 = image[0:rowsMid, 0:colsMid]
    section1 = image[0:rowsMid, colsMid:cols]
    section2 = image[rowsMid: rows, 0:colsMid]
    section3 = image[rowsMid:rows, colsMid:cols]
    sectionsList = [section0, section1, section2, section3]

    sectionAvgColorList = []
    for i in sectionsList:
        pixelSum = 0
        yRows, xCols, chs = i.shape
        pixelCount = yRows*xCols
        totRed = 0
        totBlue = 0
        totGreen = 0
        for x in range(xCols):
            for y in range(yRows):
                bgr = i[y,x]
                b = bgr[0]
                g = bgr[1]
                r = bgr[2]
                totBlue = totBlue+b
                totGreen = totGreen+g
                totRed = totRed+r

        avgBlue = int(totBlue/pixelCount)
        avgGreen = int(totGreen/pixelCount)
        avgRed = int(totRed/pixelCount)
        avgPixel = (avgBlue, avgGreen, avgRed)
        sectionAvgColorList.append(avgPixel)
    return sectionAvgColorList

print(fourSectionAvgColor(img))
cv2.waitKey(0)
cv2.destroyAllWindows()
0 голосов
/ 01 мая 2019

Вы можете использовать scikit-image's view_as_blocks вместе с numpy.mean. Вы указываете размер блока вместо количества блоков:

import numpy as np
from skimage import data, util
import matplotlib.pyplot as plt

astro = data.astronaut()
blocks = util.view_as_blocks(astro, (8, 8, 3))

print(astro.shape)
print(blocks.shape)

mean_color = np.mean(blocks, axis=(2, 3, 4))

fig, ax = plt.subplots()
ax.imshow(mean_color.astype(np.uint8))

Выход:

(512, 512, 3)
(64, 64, 1, 8, 8, 3)
* +1012 *blocked and averaged

Не забывайте приведение к uint8, потому что matplotlib и scikit-image ожидают, что изображения с плавающей точкой будут в [0, 1], а не в [0, 255]. Для получения дополнительной информации см. Документацию scikit-image о типах данных .

...