Opencv - Python RGB到灰色转换

时间:2013-01-20 08:01:23

标签: python opencv numpy grayscale computer-vision

我想将此RGB编码为灰度转换器,而无需任何内置的Open-CV功能。这就是我的代码的样子

import cv2 , numpy
def GrayConvertor(img):


    rows , cols , layers = img.shape

    matrix = numpy.zeros((rows , cols))

    for i in range(rows):
        for j in range(cols):
            val = 0.114 * (img[i][j][0]) + 0.587 * (img[i][j][1]) + 0.299 * (img[i][j][2])
            fraction = val - int(val)
            if fraction >= 0.5:
                matrix[i][j] = (int(val) + 1) 

            else: 
                matrix[i][j] = int(val) 
    cv2.imshow("gray" , matrix)
    cv2.waitKey(0)

然而它显示一个空白图像,任何想法?

2 个答案:

答案 0 :(得分:4)

使用matrix创建np.zeros数组时,默认情况下会为其分配dtype=float。因此,即使您将值转换为int并将其转换为matrix,也会将其存储为float。如果您阅读the docs for cv.imshow,您会发现以下内容:

  
      
  • 如果图像是32位浮点,则像素值为   乘以255.也就是说,值范围[0,1]被映射到   [0255]。
  •   

因此,图像中的所有内容都会乘以255,从而弄乱您的最终结果。

你可以做两件事:

  1. 有一个浮点matrix,跳过所有舍入,并将值除以255。
  2. 使用matrix明确创建dtype='uint8'并保持一切不变。
  3. 还有一个事实是你使用numpy的能力非常差。我上面给出的两个选项,你可以编码没有循环或矩阵赋值,作为

    rgb2k = np.array([0.114, 0.587, 0.299])
    matrix_int = np.round(np.sum(img * rgb2k, axis=-1)).astype('uint8')
    matrix_float = np.sum(img * rgb2k, axis=-1) / 255
    

答案 1 :(得分:0)

尝试:

import cv2 , numpy
def GrayConvertor(img):


    rows , cols , layers = img.shape

    matrix = numpy.zeros((rows , cols))

    for i in range(rows):
        for j in range(cols):
            val = 0.114 * (img[i][j][0]) + 0.587 * (img[i][j][1]) + 0.299 * (img[i][j][2])
                matrix[i][j] = round(val) 
    cv2.imshow("gray" , matrix)
    cv2.waitKey(0)