【问题标题】:How to get the pixel indices of a specific RGB value of a image in python?如何在python中获取图像的特定RGB值的像素索引?
【发布时间】:2016-10-04 23:24:06
【问题描述】:

我已经使用 openCV 的 imread 函数导入了一张彩色图像。

im = cv2.imread('test.jpg')

我正在寻找像素值为 [255, 255, 255] 的白色像素的索引。我知道 im 实际上是一个 3D 数组。但奇怪的是 im[0,0] 的值是 [255 255 255],而不是 [255, 255, 255]。而 im[0,0,0] 是 255。所以 [255 255 255] 看起来像一个列表或其他东西,但实际上并不等于 [255, 255, 255]。

>>> print im[0,0]
[255 255 255]

>>> print im[0,0,0]
255

所以我的问题是:

  1. [255 255 255] 和 [255, 255, 255] 有什么区别?
  2. 如何获取所有像素的索引?我应该使用什么搜索算法?

【问题讨论】:

  • 在 C++ 中,您将在白色像素的掩码上使用 cv::findNonZerocv::Mat1b mask; cv::inRange(img, cv::Scalar(255,255,255), cv::Scalar(255,255,255), mask); std::vector<cv::Point> pts; cv::findNonZero(mask, pts);。 Python 包装器中也应该有类似的东西。或者可能是一些使用 Numpy 设施的快捷方式......

标签: python image opencv image-processing


【解决方案1】:

如果要获取所有白色像素的索引,可以将图像转换为二维数组,然后找到索引

import operator

image = cv2.imread("test.jpg")
img = image.astype('float')
img = img[:,:,0] # convert to 2D array
row, col = img.shape
for i in range(row):
    for j in range(col):
        if img[i,j] == 255:
            x.append(i) # get x indices
            y.append(j) # get y indices

注意 image[0,0] 显示 2D 矩阵,而 image[0,0,0] 显示 3D 矩阵,带 0 色带。该元素基本上定义了图像的色带。 如果您不指定第三个元素,它将为图像的每个色带显示三个值。但是当您提到色带时,它会显示确切的像素值。

注意: 无需将图像转换为二维数组。您也可以随时为实际数组执行此操作。我这样做只是为了向您解释算法。

【讨论】:

    【解决方案2】:

    你是对的。值 [255 255 255] 不等于 [255, 255, 255]。所以您需要将像素值( [255 255 255] )转换为数组值( [255, 255, 255] )进行比较。所以你需要使用 '[:]' 将其转换为数组。 此外,如果您想找到所有白色像素,您可以使用此代码。而像素索引将作为元组存储在列表“White_pix_ind”中。

    White_pix_ind = []
    row,col,depth = Img.shape
    for i in range(row):
        for j in range(col):
            if( (Img[(i,j)][:]==White_pix_ind ).all() ):
                print(i,j)
                White_pix_ind.append((i,j))
                break;
    

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多