如何使用OpenCV-Python访问图像的像素?

28

我想知道如何循环遍历图像的所有像素。我尝试了以下代码:

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

它打印出一个不以数组形式呈现的垂直数字集合。我还遇到了一个数组越界异常。请建议一种方法。

11个回答

35

我不明白你的x变量有什么作用。你不需要它。

直接使用:

img = cv2.imread('/path/to/Capture1.jpg',0)
rows,cols,_ = img.shape

for i in range(rows):
    for j in range(cols):
        k = img[i,j]
        print(k)

如果您想打印出垂直排列的数字,请使用 img.itemset() 来修改像素值。若要打印整个数组,请使用 print(img)。 参考链接:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html


嗨,我知道这已经很长时间了,我有一个关于垂直数字集的问题。是因为它是灰度图像,所以它才会将单个值垂直打印出来吗? - Darkgenius007
1
flag=0传递给imread(..., flag)IMREAD_GRAYSCALE标志。对于彩色图像,您需要传递IMREAD_COLOR,它的值为1,例如:imread("img.jpg", 1) - jackw11111
1
请使用rows,cols,_ = img.shape - jackw11111

21

在Python中访问特定像素

import cv2
image = cv2.imread("sample.jpg")
pixel= image[200, 550]
print pixel

输出: [ 73 89 102]


10
pixel_b, pixel_g, pixel_r = image[row][column] - João Cartucho

6

使用numpy数组的索引访问速度较慢。

您可以使用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

5
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[y,x], end = "\t")
    print("\t")

3

试试这个:

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

3

提取图像像素(r,g,b)值的最佳方法是使用numpy.ndindex():

  • 它将采用图像的高度(h)、宽度(w)或高度、宽度和通道数(c)来遍历。

例如,以下代码片段中np.ndindex仅使用高度和宽度:

import cv2
import numpy as np

image = cv2.imread("cat.jpg") 
for i, j in np.ndindex(image.shape[:-1]): #image.shape = (150,150)
    print(image[i,j])

现在的输出是r、g、b值,具体如下:
[ 54  97 231]
[ 63 105 241]
[ 67 109 245]
[ 71 115 250]
[ 79 125 255]
[ 81 130 255]

1

通过循环,这段代码将以数组'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

1

你可以做到这一点

  for (int y = 0; y<im.rows; y++) 
    {

  for (int x = 0; x<im.cols; x++)
    {
        Vec3b color = im.at<Vec3b>(Point(x, y));
        //you can print color this has the pixel value

    }
}

0

垂直数组是图像的RGB(红色,绿色,蓝色)通道值。如果您想要像素的单个值,您可能需要先将图像转换为灰度。这实际上取决于您的应用程序以及您想要对图像进行什么操作,将其转换为灰度只是一种方法。

要转换为灰度

grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

一些基本操作在文档中展示。


它是按照BGR的顺序,而不是你所说的RGB。请注意,在转换为灰度时,常数为XXX_BGR2GRAY。 - ivan_onys

0
import cv2
import numpy as np 

image = cv2.imread('/path/to/test.jpg', cv2.IMREAD_COLOR)

for x in range (1,480):
    for y in range (1,640):
        pixel = image[x,y]
        print(pixel)

3
你能解释为什么这是解决方案吗?原帖作者错过了什么,他需要知道什么才能理解这个解决方案? - Luis Sieira
1
图像从0开始索引。 - Ian Zurutuza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接