打开 CV - Python RGB 到 GRAY 转换器

Man*_*noj 3 python opencv numpy computer-vision grayscale

我想在没有任何内置 Open-CV 函数的情况下将此 RGB 编码为灰度转换器。这是我的代码的样子

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)
Run Code Online (Sandbox Code Playgroud)

但是它显示一个空白图像,有什么想法吗?

Jai*_*ime 5

当您matrix使用np.zeros它创建数组时,默认情况下会分配dtype=float. 因此,即使您将值四舍五入并将其转换为int,当将它们写入时,它们matrix也会存储为floats。如果您阅读文档,cv.imshow您会发现以下内容:

  • 如果图像是 32 位浮点数,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。

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

你可以做两件事:

  1. 有一个浮点matrix,跳过所有的舍入,然后将你的值除以 255。
  2. 显式地创建你的matrixdtype='uint8'并保持一切不变。

还有一个事实是,您对 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
Run Code Online (Sandbox Code Playgroud)