【问题标题】:How do I access the pixels of an image using OpenCV-Python?如何使用 OpenCV-Python 访问图像的像素?
【发布时间】:2015-05-12 22:27:15
【问题描述】:

我想知道如何遍历图像的所有像素。我试过这个:

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

它打印一组不是数组形式的垂直数字。我也得到了一个数组越界异常。请提出一种方法。

【问题讨论】:

    标签: python opencv image-processing pixels


    【解决方案1】:

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

    • 需要遍历图像的 h,w 或 h,w,c(高度、宽度、通道)

    例如下面是sn-p代码,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]
    

    【讨论】:

      【解决方案2】:

      我不明白你的 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()http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html

      如果要打印整个数组,请使用print(img)

      【讨论】:

      • 嗨,我知道这已经很久了,我有一个关于垂直数字集的问题。是因为它是灰度的,所以它垂直打印一个单独的值吗?
      • @Darkgenius007 将flag=0 传递给imread(..., flag)IMREAD_GRAYSCALE 标志。对于颜色,您需要传递 IMREAD_COLOR,即 1,例如。 imread("img.jpg", 1).
      • 并改用rows,cols,_ = img.shape
      【解决方案3】:
      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)
      

      【讨论】:

      • 您能解释一下为什么这是解决方案吗? OP 遗漏了什么,为了理解这个解决方案,他需要知道什么?
      • 图片索引为 0
      【解决方案4】:
      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")
      

      【讨论】:

        【解决方案5】:

        使用数组索引访问 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
        

        【讨论】:

          【解决方案6】:

          你可以这样做

            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
          
              }
          }
          

          【讨论】:

            【解决方案7】:

            此代码将通过循环为您提供数组 '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
            

            【讨论】:

              【解决方案8】:

              您正在阅读灰度图像

              img = cv2.imread('D:\Project\Capture1.jpg',0)

              在这里你只会得到强度

              【讨论】:

              • 这如何回答这个问题?
              【解决方案9】:

              试试这个:

              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
              

              【讨论】:

                【解决方案10】:

                在 Python 中访问特定像素

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

                输出: [73 89 102]

                【讨论】:

                • pixel_b, pixel_g, pixel_r = image[row][column]
                【解决方案11】:

                垂直数组是图像的 RGB(Reg、Green、Blue)通道值。如果您想要像素的单个值,您可能需要先将图像转换为灰度。这实际上取决于您的应用程序以及您想对图像做什么,转换为灰度只是一种方法。

                转为灰度

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

                一些基本操作见documentation

                【讨论】:

                • 按这个顺序是BGR,而不是你说的RGB。注意,转换为灰度时,常数为 XXX_*BGR*2GRAY
                猜你喜欢
                • 1970-01-01
                • 2011-11-03
                • 2019-08-25
                • 2011-11-24
                • 2013-07-28
                • 2015-12-18
                • 1970-01-01
                • 2014-01-03
                相关资源
                最近更新 更多