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)
但是它显示一个空白图像,有什么想法吗?
当您matrix使用np.zeros它创建数组时,默认情况下会分配dtype=float. 因此,即使您将值四舍五入并将其转换为int,当将它们写入时,它们matrix也会存储为floats。如果您阅读文档,cv.imshow您会发现以下内容:
- 如果图像是 32 位浮点数,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。
因此,您图像中的所有内容都乘以 255,从而弄乱了您的最终结果。
你可以做两件事:
matrix,跳过所有的舍入,然后将你的值除以 255。matrix,dtype='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)