将RGB图像分离为R、G、B通道 - python
我正在做图像处理,想知道这段代码是否能把彩色图像分成不同的通道,并计算它们的平均值。因为我试过后发现,它给我的是我读取的图像,显示了蓝色、绿色和红色的值,还有平均值。当我尝试把这些值添加到一个列表中并打印出来时,列表里却只有零。
这是我的代码:
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通道的平均值。你的代码有两个问题:
- ttl应该除以3,像下面这样,因为如果不这样做,它实际上是像素数量乘以通道数(比如说,对于一个256X256的RGB图像,这个值会是196608)。
你代码里的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)
希望这些对你有帮助。
祝好!