Ребята, я новичок в python, и я застрял на этом. Было бы очень признательно, если бы вы могли мне помочь.
У меня есть изображение с несколькими цветами в каждом пикселе. Все они обозначают число.
Изображение было построено с использованием этого диапазона от 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)]
Вот какая-то идея.
Позвольте загружать изображения
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]),)
Теперь этот метод очень медленный и неэффективный, вам придется повторять его для каждого пикселя изображения. Вероятно, есть способ ускорить его, но на данный момент я его не вижу, пусть у кого-нибудь есть лучший вклад.
[..., :3]
. Таблица поиска - это массив1x15625x3
, но если вам не нужно дополнительное1
измерение, вы можете удалить его с помощью squeeze. Выходные данные представляют формы загруженного изображения,3
- количество каналов для каждого пикселя (красный, зеленый, синий).