Как мне получить доступ к пикселям изображения с помощью OpenCV-Python?
Я хочу знать, как перебрать все пиксели изображения. Я попробовал это:
import cv2 import numpy as np x = np.random.randint(0,5,(500,500)) img = cv2.imread('D:\Project\Capture1.jpg',0) p = img.shape print p rows,cols = img.shape for i in range(rows): for j in range(cols): k = x[i,j] print k
Он печатает вертикальный набор чисел, который не имеет форму массива. Я также получаю массив за пределами исключения. Пожалуйста, предложите метод.
ОТВЕТЫ
Ответ 1
Доступ к определенному пикселю в Python
import cv2 image = cv2.imread("sample.jpg") pixel= image[200, 550] print pixel
Ответ 2
Я не понимаю, какова цель вашей переменной x. Тебе это не нужно.
for i in range(rows): for j in range(cols): k = img[i,j] print k
который будет печатать действительно вертикальный набор чисел. Если вы хотите изменить значения пикселей, используйте img.itemset() . http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html
Если вы хотите распечатать весь массив, используйте print(img)
Ответ 3
Доступ с использованием индекса массива будет медленным с пустым массивом.
Вы можете использовать метод item() для доступа и itemset для внесения изменений.
for i in range(0,img.shape[0]): for j in range(0,img.shape[1]): pixel = img.item(i, j) print pixel
Ответ 4
import numpy as np import Image image = Image.open("example.png") image_data = np.asarray(image) for i in range(len(image_data)): for j in range(len(image_data[0])): print(image_data[i][j]) # this row prints an array of RGB color for each pixel in the image
Ответ 5
import cv2 import numpy as np image = cv2.imread('C:/Users/Asus/Desktop/test.jpg', cv2.IMREAD_COLOR) for x in range (1,480): for y in range (1,640): pixel = image[x,y] print pixel
Ответ 6
for (int y = 0; y(Point(x, y)); //you can print color this has the pixel value > >
Ответ 7
Вертикальный массив — это значения канала RGB (Reg, Green, Blue) для изображения. Если вам нужно одно значение для пикселя, вы можете сначала преобразовать изображение в оттенки серого. Это действительно зависит от вашего приложения и того, что вы хотите сделать с изображением, преобразование в оттенки серого — это всего лишь один подход.
Чтобы преобразовать в оттенки серого
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Некоторые основные операции показаны в документации
Ответ 8
вы читаете изображение в шкале серого
img = cv2.imread(‘D:\Project\Capture1.jpg’, 0)
здесь вы получите только intencity
Ответ 9
Этот код даст вам значения пикселей в массиве ‘k’, пройдя цикл.
import cv2 import numpy as np img = cv2.imread('sample.jpg',0) rows,cols = img.shape k = [] for i in range(rows): for j in range(cols): k.append(img[i,j]) print k
Ответ 10
import cv2 import numpy as np imagename = "capure.jpg" img = cv2.imread(imagename, 0) # 0 params, for gray image height, width = img.shape[:2] # image height and width print(img) # all image pixels value in array print(img[10, 10]) # one pixel value in 10,10 coordinate for y in range(height): for x in range(width): print(img[x], img[y], end = "\t")
Получение списка значений пикселей из PIL
Ребята, мне нужна помощь. Я начинающий программист, и одна из проблем, с которыми я сталкиваюсь в данный момент, — это попытка преобразовать черно-белое .jpg изображение в список, который я затем могу преобразовать в аудиосигнал. Это часть большого проекта по созданию программы SSTV на Python. Я импортировал модуль PIL и пытаюсь вызвать встроенную функцию: list(im.getdata()) . Когда я его вызываю, python вылетает. Есть ли способ разбить изображение (всегда 320×240) на 240 строк, чтобы упростить вычисления? Или я просто вызываю не ту функцию. Если у кого-то есть предложения, пожалуйста, увольняйте. Если у кого-то есть опыт создания модулированных звуковых тонов с использованием Python, я с радостью приму любые «жемчужины мудрости», которые они готовы поделиться. заранее спасибо
Включение сообщения, которое вы получаете, когда он разбился, было бы действительно полезно — person dbr   schedule 11.07.2009
Ответы (9)
Python не должен давать сбой при вызове getdata (). Возможно, образ поврежден или что-то не так с вашей установкой PIL. Попробуйте это с другим изображением или опубликуйте изображение, которое вы используете. Это должно разбить изображение так, как вы хотите:
from PIL import Image im = Image.open('um_000000.png') pixels = list(im.getdata()) width, height = im.size pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)]
Когда я вызываю list (im.getdata ()), не только происходит сбой python (предположительно), но и вся моя система Linux перестает отвечать. Жесткая перезагрузка решает эту проблему. — person Stephen Cagle; 16.11.2011
он вылетает как на Windows, так и на Linux. я начал думать о стабильности PIL. — person Mirat Can Bayrak; 17.03.2013
Проблема, похоже, заключается в преобразовании в стандартный список Python. Если я вызываю только pixels=im.getdata() (который возвращает специальный упрощенный тип списка), все в порядке. Однако, если я добавлю приведение, python начнет использовать огромное количество оперативной памяти, а если доступного компьютера недостаточно, он начнет менять местами и, наконец, выйдет из строя. Возможно, использование списка Python для хранения нескольких миллионов значений пикселей — это немного излишне. — person jesjimher; 19.03.2014
Не могли бы вы добавить следующие строки? import Image; im = Image.open(‘um_000000.png’) — person Martin Thoma; 18.05.2015
Конечно .. кто-нибудь знает, что list () делает в python? Из-за большого объема данных функции возвращают своего рода асинхронное значение, а именно итератор. Итак, когда вы впоследствии вставляете цикл for, он идет плавно, пиксель за пикселем, без использования огромного количества оперативной памяти. НО, когда вы используете list (), он фактически получает ВСЕ данные СИНХРОНИЗАЦИЮ. Google, что делает list (). — person ioan; 24.03.2017
В моем случае проблема была в списке печати. Если я вызываю print (list (img.getdata ())), он вылетает, но при вызове только list (img.getdata ()) все в порядке. — person user3777939; 28.03.2017
Спасибо за это. У меня не было проблем со сбоями, но я предлагаю следующее дополнение для всех, кто вместо этого хочет массив numpy: pixels = np.array(im.getdata()).reshape((im.size[1], im.size[0])) — person Bill; 04.11.2017
(Я говорю «попробуйте» здесь, потому что непонятно, почему getdata() у вас не работает, и я не знаю, использует ли asarray getdata, но это стоит проверить.)
Я предполагаю, что вы получаете сообщение об ошибке типа .. _1 _. См. Документацию Image.load, чтобы узнать, как получить доступ к пикселям. В основном, чтобы получить список пикселей в изображении, используя PIL :
from PIL import Image i = Image.open("myfile.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)
Это добавляет каждый пиксель к all_pixels — если файл является изображением RGB (даже если он содержит только черно-белое изображение), это будет кортеж, например:
Чтобы преобразовать изображение в монохромное, вы просто усредняете три значения — так, последние три строки кода станут .
cpixel = pixels[x, y] bw_value = int(round(sum(cpixel) / float(len(cpixel)))) # the above could probably be bw_value = sum(cpixel)/len(cpixel) all_pixels.append(bw_value)
cpixel = pixels[x, y] luma = (0.3 * cpixel[0]) + (0.59 * cpixel[1]) + (0.11 * cpixel[2]) all_pixels.append(luma)
cpixel = pixels[x, y] if round(sum(cpixel)) / float(len(cpixel)) > 127: all_pixels.append(255) else: all_pixels.append(0)
Вероятно, в PIL есть методы, позволяющие делать такие RGB -> BW преобразования быстрее, но это работает, и не особенно медленно. Если вы хотите выполнять вычисления только для каждой строки, вы можете пропустить добавление всех пикселей в промежуточный список .. Например, чтобы вычислить среднее значение каждой строки:
from PIL import Image i = Image.open("myfile.png") pixels = i.load() # this is not a list width, height = i.size row_averages = [] for y in range(height): cur_row_ttl = 0 for x in range(width): cur_pixel = pixels[x, y] cur_pixel_mono = sum(cur_pixel) / len(cur_pixel) cur_row_ttl += cur_pixel_mono cur_row_avg = cur_row_ttl / width row_averages.append(cur_row_avg) print "Brighest row:", print max(row_averages)
python — RGB матрица изображения
Взяв изображение как вход, как я могу получить соответствующую ему матрицу rgb? Я проверил функцию numpy.asarray. Это дает мне матрицу rgb или некоторую другую матрицу?
5 ответов
Обратите внимание, что этот ответ устарел с 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-изображения 640×480 это даст вам массив 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 640×480 из 4-х RGBA. Или вы можете просто вызвать getpixel на изображении:
img.getpixel(20, 30) # tuple of 4 ints