python直方图opencv计算每种颜色
您好,我正在尝试计算每个R/G/B的像素,并创建一些图片的直方图,直方图看起来不错,但我无法计算每个颜色的像素。它说每种颜色的数量相同,我怀疑这是正确的 这是我的代码,我对它相当陌生,我已经没有想法了python直方图opencv计算每种颜色,python,opencv,histogram,Python,Opencv,Histogram,您好,我正在尝试计算每个R/G/B的像素,并创建一些图片的直方图,直方图看起来不错,但我无法计算每个颜色的像素。它说每种颜色的数量相同,我怀疑这是正确的 这是我的代码,我对它相当陌生,我已经没有想法了 import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('photo.jpg') color = ('b','g','r') qtdBlue = 0 qtdGreen =
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('photo.jpg')
color = ('b','g','r')
qtdBlue = 0
qtdGreen = 0
qtdRed = 0
totalPixels = 0
for i,col in enumerate(color):
histr = cv.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0, 256])
totalPixels+=sum(histr)
if i==0:
qtdBlue = sum(histr)
elif i==1:
qtdGreen = sum(histr)
elif i==2:
qtdRed = sum(histr)
print("Red Quantity")
print(qtdRed)
print("Blue Quantity")
print(qtdBlue)
print("Green Quantity")
print(qtdGreen)
plt.show()
如果我正确地理解了您的意思,您希望提取每种颜色对图像的贡献。下面是如何使用matplotlib。正如您在代码末尾看到的,每种颜色的形状(像素数)是相同的
import numpy as np
import matplotlib.pyplot as plt
# Load the image
img = plt.imread('C:\Documents\Roses.jpg')
# Extract each colour channel
red, green, blue = img[:,:,0], img[:,:,1], img[:,:,2]
# Total red+green+blue intensity
intensity = img.sum(axis=2)
# Function to calculate proportion of a certain channel
def colour_frac(color):
return np.sum(color)/np.sum(intensity)
# Calculate the proportion of each colour
red_fraction = colour_frac(red)
green_fraction = colour_frac(green)
blue_fraction = colour_frac(blue)
sum_colour_fraction = red_fraction + green_fraction + blue_fraction
print('Red fraction: {}'.format(red_fraction))
print('\nGreen fraction: {}'.format(green_fraction))
print('\nBlue fraction: {}'.format(blue_fraction))
print('\nRGB sum: {}'.format(sum_colour_fraction))
print(red.shape == green.shape == blue.shape)
# Output
Red fraction: 0.3798302547713819
Green fraction: 0.33196874775790813
Blue fraction: 0.28820099747071
RGB sum: 1.0
red.shape == green.shape == blue.shape
Out[68]: True
这可能无法回答您的问题,但我将解释为什么不同通道的直方图的
和的结果具有相同的值。直方图是关于强度分布的,这意味着最后所有的总和都是一样的
让我们看一个更简单的例子:一个充满红色像素的3x3
图像
红色通道显示箱255的强度计数为9
。在其他两个通道(b、g)中,强度也为9
,但对于bin0
。正如你所看到的,在Historogram比较中,计数没有改变
直方图值:
b = [9, 0, 0, ..., 0] #0 - 255
g = [9, 0, 0, ..., 0] #0 - 255
r = [0, 0, 0, ..., 9] #0 - 255
任何人:你可能真的对图像的主色调感兴趣
你想干什么?当对强度求和时,它们将始终具有相同的值。