繁体   English   中英

灰度图像的 OpenCV 读取返回 3 通道(颜色?)数组而不是单通道

[英]OpenCV imread of grayscale image returns 3-channel (color?) array instead of single-channel

我有以下 python function 下面将图像和噪声系数作为输入参数,以便转换为噪声的总像素的百分比与系数成正比(表示为噪声矩阵)。 然后将该噪声矩阵与原始图像相乘以获得噪声图像。

def dot_salt_pepper(img, noise_coeff):
    height = img.shape[0]
    width = img.shape[1]
    noise_matrix = np.ones([height, width])
    num_noise_pixels = int(height * width * noise_coeff)
    
    for i in range(num_noise_pixels):
        noise_matrix[np.random.randint(height)][np.random.randint(width)] = 0
        
    new_img = np.multiply(img, noise_matrix)
    new_img = np.uint8(img)
    
    return new_img

我知道为了给现有图像添加点噪声,必须首先将图像转换为灰度。 然而,我正在使用的图像是灰度格式的,因此当我使用cv2.imread('img.jpg')在 OpenCV 中读取它时,调用print(img.shape)输出元组(3000, 4000, 3)这表明BGR 通道仍然存在于图像中(因此我不能将 2D 噪声矩阵乘以 3D 图像矩阵)。 我如何解决这个问题?

这是有问题的图像

图像是 RGB 数据类型,即使它没有颜色
转换为灰度

这可以在读取图像cv2.imread(IMAGE_FILE, cv2.IMREAD_GRAYSCALE)

您提供的 JPEG 文件是 grayscale ,而不是 RGB。

imread始终转换为 BGR,除非您传递一些标志。

传递IMREAD_UNCHANGED标志以准确获取文件中的内容。 这将适用于您的文件,因为它是灰度的。

传递IMREAD_GRAYSCALE强制转换为灰色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM