Взяв изображение как вход, как я могу получить соответствующую ему матрицу rgb? Я проверил функцию numpy.asarray. Это дает мне матрицу rgb или некоторую другую матрицу?
Python - матрица RGB изображения
Ответ 1
Обратите внимание, что этот ответ устарел с 2018 года; scipy
устарел как imread
, и вам следует переключиться на imageio.imread
. Посмотрите этот документ о разнице между ними. Приведенный ниже код должен работать без изменений, если вы просто импортируете новую библиотеку вместо старой, но я ее не проверял.
Самый простой ответ - использовать обертки NumPy и SciPy вокруг PIL. Там отличный учебник, но основная идея такова:
from scipy import misc
arr = misc.imread('lena.png') # 640x480x3 array
arr[20, 30] # 3-vector for a pixel
arr[20, 30, 1] # green value for a pixel
Для RGB-изображения 640x480 это даст вам массив uint8
640x480x3.
Или вы можете просто открыть файл с помощью PIL (или, скорее, Pillow; если вы все еще используете PIL, это может не сработать или может быть очень медленным) и передать его прямо в NumPy:
import numpy as np
from PIL import Image
img = Image.open('lena.png')
arr = np.array(img) # 640x480x4 array
arr[20, 30] # 4-vector, just like above
Это даст вам массив 640x480x4 типа uint8
(четвертый - альфа; PIL всегда загружает файлы PNG как RGBA, даже если они не имеют прозрачности; смотрите img.getbands()
если вы все не уверены).
Если вы вообще не хотите использовать NumPy, собственный тип PixelArray
PIL является более ограниченным массивом:
arr = img.load()
arr[20, 30] # tuple of 4 ints
Это дает вам массив PixelAccess
640x480 из 4-х RGBA.
Или вы можете просто вызвать getpixel
на изображении:
img.getpixel(20, 30) # tuple of 4 ints
Ответ 2
У меня есть чувство, что я не делаю то, что вы хотели здесь, поэтому, пожалуйста, укажите, полностью ли это. Вы можете открыть изображение, подобное этому, и получить массив пикселей:
import Image
im = Image.open('Lenna.png')
pixels = list(im.getdata())
Это даст вам плоский список RGB-данных, который выглядит как
[(226, 137, 125), (226, 137, 125), (223, 137, 133), (223, 136, 128),
(226, 138, 120), (226, 129, 116), (228, 138, 123), (227, 134, 124),
(227, 140, 127), (225, 136, 119), (228, 135, 126), (225, 134, 121),...
Теперь это будут все пиксели в плоском массиве, если вам нужен двухмерный массив, тогда для этого потребуется дополнительный код. Не уверен, есть ли в PIL прямая функция в PIL.
Ответ 3
Также добавить, если вы или кто-либо еще используете opencv.
imgc=cv2.imread(file)
или для чтения в виде оттенков серого
imgc=cv2.imread(file,0)
Если вы сделаете некоторое сравнение между изображениями, вы можете подумать о том, чтобы превратить массив пикселей в гистограммы, чтобы нормализовать данные.
hist = np.histogram(img.flatten(),256,[0,256])[0]
Вышеупомянутая строка сначала сглаживает ваш массив img, поэтому вы теряете размерность вашего изображения. Затем он создает ячейки размером от 0 до 256 (для изображения в градациях серого) и добавляет отсчеты из img к этим ячейкам и возвращает их как гистограмму, которая затем может быть нанесена на график. Например, если 100 bin имеет значение 20, это означает, что 20 пикселей на вашем изображении имеют значение 100.
Надеюсь, что это добавит еще одну возможность подумать или кому-нибудь, кто хочет начать работу в opencv.
Ответ 4
Я попытался imageio.imread
и он работал большой, но через минуту наткнулся на функцию в matplotlib
, который работал точно так же, получая numpy
п на т на 3 массива:
from matplotlib import pyplot as plot
image = plt.imread(path)
Ответ 5
Вы можете сделать это с помощью Pillow
, метод getdata
дает вам плоский массив пикселей, после чего вы можете построить матрицу, используя size
изображения.
from PIL import Image
def getPixels(filename):
img = Image.open(filename, 'r')
w, h = img.size
pix = list(img.getdata())
return [pix[n:n+w] for n in range(0, w*h, w)]
Ответ 6
Спасибо, абарнет! Пожалуйста, используйте imageio
вместо scipy
, так как scipy
больше не продолжается.
Упрощенный ответ abarnet:
Установить imageio
pip3 install imageio
код Python3:
Если изображение имеет размеры
260X340
, то rgb_matrix представляет собой массив измерений260X340X3
from imageio import imread rgb_matrix = imread('image13.png') print(rgb_matrix[15][23])