将RGB图像分离为R、G、B通道 - python

5 投票
3 回答
31430 浏览
提问于 2025-04-18 03:37

我正在做图像处理,想知道这段代码是否能把彩色图像分成不同的通道,并计算它们的平均值。因为我试过后发现,它给我的是我读取的图像,显示了蓝色、绿色和红色的值,还有平均值。当我尝试把这些值添加到一个列表中并打印出来时,列表里却只有零。

这是我的代码:

b, g, r = cv2.split(re_img1)
ttl = re_img1.size
B = sum(b) / ttl
G = sum(g) / ttl
R = sum(r) / ttl
B_mean1.append(B)
G_mean1.append(G)
R_mean1.append(R)

re_img1 是调整大小后的图像(也就是256x256)。图像可以是任何东西。我在两个不同的函数中使用了相同的代码,但遇到的问题是一样的。

欢迎任何建议!提前谢谢!

3 个回答

0

从PIL库中导入Image模块。然后,我们用Image模块来打开一张名为“leonard_de_vinci.jpg”的图片。最后,显示这张图片。

0

我觉得你需要把这个部分改成这样:

ttl = re_img1.size

改成:

ttl = re_img1.size[0] #This only works correctly if the img is a perfect square

因为 img.size 是一个包含两个数字的元组(x,y),你在尝试做一个不合法的操作(对元组进行除法),所以才会得到那个结果。

6

如果我理解得没错,你是想计算每个RGB通道的平均值。你的代码有两个问题:

  1. ttl应该除以3,像下面这样,因为如果不这样做,它实际上是像素数量乘以通道数(比如说,对于一个256X256的RGB图像,这个值会是196608)。
  2. 你代码里的b, g, 和 r实际上是numpy.ndarray类型的,所以你需要用合适的方法来处理它们,也就是ndarray.sum。要把总和转换成浮点数,不然你会丢失小数部分,因为两个整数相除会得到一个整数。

    import cv2
    import numpy as np
    re_img1 = cv2.imread('re_img1.png')
    b, g, r = cv2.split(re_img1)
    
    ttl = re_img1.size / 3 #divide by 3 to get the number of image PIXELS
    
    """b, g, and r are actually numpy.ndarray types,
    so you need to use the appropriate method to sum
    all array elements"""
    B = float(np.sum(b)) / ttl #convert to float, as B, G, and R will otherwise be int
    G = float(np.sum(g)) / ttl
    R = float(np.sum(r)) / ttl
    B_mean1 = list()
    G_mean1 = list()
    R_mean1 = list()
    B_mean1.append(B)
    G_mean1.append(G)
    R_mean1.append(R)
    

希望这些对你有帮助。

祝好!

撰写回答