Преобразовать значения пикселей RGB в диапазоне в последовательные числа

1

Ребята, я новичок в python, и я застрял на этом. Было бы очень признательно, если бы вы могли мне помочь.

У меня есть изображение с несколькими цветами в каждом пикселе. Все они обозначают число.

Изображение 174551

Изображение было построено с использованием этого диапазона от 0 до 15625 пикселей. Каждый из пикселей в диапазоне от 0 до 15625 имеет другой цвет, и вышеописанное изображение было построено с использованием этого.

диапазон изображения (это массивное, так что вы, возможно, потребуется, чтобы загрузить его, чтобы увидеть изображение)

То, что я пытаюсь сделать, - это преобразовать значения RGB из диапазона, такого как первое значение пикселя (5,5,5) в 1, и следующее значение пикселя в диапазоне до 2 и так далее. Следовательно, каждый пиксель на изображении выше может соответствовать значению.

Это похоже на этот вопрос, но я не думаю, что он делает то, что я хочу сделать. Как преобразовать все пиксельные значения изображения в определенный диапазон -python

Это код, который я использовал для создания диапазона

#!/usr/local/bin/python3
from PIL import Image
import numpy as np

# Create array to hold output image
result=np.zeros([1,25*25*25,3],dtype=np.uint8)

#change the values above i.e. 51*51*51 done by (upperbound-lowerbound)/step i.e (255-0)/5
j=0
for r in range(5,255,10):
    for g in range(5,255,10):
        for b in range(5,255,10):
            result[0,j]= (r,g,b)
            j+=1

# Convert output array to image and save
im=Image.fromarray(result)
im.save("perfect1.png")

Это код для поиска значений RGB для каждого пикселя в диапазоне

from PIL import Image

i = Image.open('perfect1.png')
pixels = i.load() # this is not a list, nor is it list()'able
width, height = i.size

all_pixels = []
for x in range(width):
    for y in range(height):
        cpixel = pixels[x, y]
        all_pixels.append(cpixel)

print all_pixels

Это код для создания вспомогательного массива без дополнительных значений пикселей, так как каждое значение "пиксель" в изображении имеет количество заключенных пикселей. a = массив значений изображения

rows_mask = np.insert(np.diff(a[:, 0]).astype(np.bool), 0, True)
columns_mask = np.insert(np.diff(a[0]).astype(np.bool), 0, True)
b = a[np.ix_(rows_mask, columns_mask)]
Теги:
opencv
image-processing
numpy
range

1 ответ

0

Вот какая-то идея.

Позвольте загружать изображения

import numpy as np
from scipy.misc import imread

img = imread("img.png")[..., :3]   # drop alpha channel
lut = imread("lut.png").squeeze()  # squeeze 1D first axis

print(img.shape)
print(lut.shape)

Какие результаты

(589, 612, 3)
(15625, 3)

Теперь позвольте сказать, что мы хотим найти первый пиксель в изображении

print(img[0, 0])
[245 245  95]

Вы можете найти все пиксели в таблице поиска с тем же значением (axis=1 для сравнения по строкам)

np.all(img[0, 0] == lut, axis=1)

Это дает вам маску для всех пикселей, которая является True для совпадений, а False противном случае.

Теперь вы можете преобразовать это в список индексов (который в вашем случае мы можем предположить, будет иметь длину 1) с np.where

idx = np.where(np.all(img[0, 0] == lut, axis=1))

И, предполагая, что каждый пиксель имеет уникальное отображение, вы получите

(array([15609]),)

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

  • 0
    Огромное спасибо. Я немного смущен. Я стараюсь выучить. Я немного запутался в том, что пытается сделать сжатие, и пропал ли альфа-канал, потому что это значение RGBa? А также, что вывод представляет во втором блоке кода? Я знаю, что 15625 - это длина диапазона пикселей, но что означает 3? огромное спасибо
  • 0
    @AbidAbdulGafoor у изображения, которое вы разместили, был альфа-канал, но таблица соответствия отображает значения RGB, поэтому я оставил первые три канала с [..., :3] . Таблица поиска - это массив 1x15625x3 , но если вам не нужно дополнительное 1 измерение, вы можете удалить его с помощью squeeze. Выходные данные представляют формы загруженного изображения, 3 - количество каналов для каждого пикселя (красный, зеленый, синий).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню