3

我想在没有任何内置 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)

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

4

2 回答 2

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
于 2013-01-20T09:06:07.190 回答
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)
于 2013-01-20T08:51:03.893 回答