Уменьшите размер изображения с отображением - PullRequest
0 голосов
/ 16 октября 2018

У меня есть изображение .png с четырьмя цветами.Если я преобразую изображение в пустой массив, я получу массив со следующими размерами: [length X height X 3], с length == height.Как я могу уменьшить размер с отображением цветов?

Это текущая структура:

array([[[  0,  65, 101],
    [  0,  65, 101],
    [  0,  65, 101],
    ...,
    [  0,  65, 101],
    [  0,  65, 101],
    [  0,  65, 101]],

   [[  0,  65, 101],
    [163, 219, 232],
    [163, 219, 232],
    ...,
    [  0,  65, 101],
    [163, 219, 232],
    [  0,  65, 101]],

   [[  0,  65, 101],
    [163, 219, 232],
    [  0,  65, 101],
    ...,
    [  0,  65, 101],
    [163, 219, 232],
    [  0,  65, 101]],

   ...,

   [[  0,  65, 101],
    [163, 219, 232],
    [  0,  65, 101],
    ...,
    [  0,  65, 101],
    [  0,  65, 101],
    [  0,  65, 101]],

   [[  0,  65, 101],
    [163, 219, 232],
    [163, 219, 232],
    ...,
    [163, 219, 232],
    [163, 219, 232],
    [  0,  65, 101]],

   [[  0,  65, 101],
    [  0,  65, 101],
    [  0,  65, 101],
    ...,
    [  0,  65, 101],
    [  0,  65, 101],
    [  0,  65, 101]]], dtype=uint8)  

И я хотел бы массив с двумя измерениями, и каждое значение в строке i'th и столбце j'th будет соответствовать цветуэто было в третьем измерении.Поэтому, если исходное изображение имеет размер 7 X 7 X 3 с четырьмя цветами, результат будет примерно таким:

array([[0, 1, 1, 3, 3, 3, 0],
   [0, 2, 1, 1, 1, 1, 0],
   [0, 2, 0, 1, 2, 1, 0],
   [0, 3, 1, 1, 3, 1, 0],
   [0, 1, 0, 0, 3, 0, 0],
   [0, 1, 1, 1, 1, 1, 0],
   [0, 0, 0, 0, 0, 0, 0]])

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

Я прочитал картинку как:

from PIL import Image
import numpy as np

img = Image.open('image.png')
imgarray = np.asarray(img)

print(imgarray)

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете использовать numpy.unique для этого.Например, вот изображение 3х5, которое имеет только три цвета:

In [105]: img
Out[105]: 
array([[[10, 20, 30],
        [ 5,  5,  0],
        [ 5,  5,  0],
        [ 5,  5,  0],
        [ 0,  0,  0]],

       [[ 5,  5,  0],
        [ 5,  5,  0],
        [ 0,  0,  0],
        [ 0,  0,  0],
        [ 0,  0,  0]],

       [[10, 20, 30],
        [10, 20, 30],
        [10, 20, 30],
        [10, 20, 30],
        [ 5,  5,  0]]])

Вызов numpy.unique для измененного изображения.Первые два измерения сведены в одно измерение, а затем используется axis=0, чтобы мы получили уникальные цвета.inv будет содержать массив "инверсий", то есть индексов в colors исходных значений.

In [106]: colors, inv = np.unique(img.reshape(-1, 3), axis=0, return_inverse=True)

In [107]: colors
Out[107]: 
array([[ 0,  0,  0],
       [ 5,  5,  0],
       [10, 20, 30]])

In [108]: inv
Out[108]: array([2, 1, 1, 1, 0, 1, 1, 0, 0, 0, 2, 2, 2, 2, 1])

Изменить форму inv, чтобы получить массив индексов в colors с тем жеФорма как исходное изображение:

In [109]: inv.reshape(img.shape[:2])
Out[109]: 
array([[2, 1, 1, 1, 0],
       [1, 1, 0, 0, 0],
       [2, 2, 2, 2, 1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...