Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用直方图查找主色RGB?_Python_Image Processing_Colors_Histogram - Fatal编程技术网

Python 如何使用直方图查找主色RGB?

Python 如何使用直方图查找主色RGB?,python,image-processing,colors,histogram,Python,Image Processing,Colors,Histogram,我目前正在开发一系列测试代码,以探索处理图像数据的不同方法,其中一个主要主题是颜色提取 我开发了以下Python代码,在给定图像的情况下,它能够用R、G和B值提取相应的直方图: # Reading original image, in full color img = mpimg.imread('/content/brandlogos/Images/14 (48).jpg') # Displaying the image imgplot = plt.imshow(img) plt.show()

我目前正在开发一系列测试代码,以探索处理图像数据的不同方法,其中一个主要主题是颜色提取

我开发了以下Python代码,在给定图像的情况下,它能够用R、G和B值提取相应的直方图:

# Reading original image, in full color
img = mpimg.imread('/content/brandlogos/Images/14 (48).jpg')

# Displaying the image
imgplot = plt.imshow(img)
plt.show()

# Creating a tuple to select colors of each channel line
colors = ("r", "g", "b")
channel_ids = (0, 1, 2)

# Making an histogram with three lines, one for each color
# The X limit is 255, for RGB values
plt.xlim([0,256])
for channel_id, c in zip(channel_ids, colors):
  histogram, bin_edges = np.histogram(
      img[:, :, channel_id], bins = 256, range=(0,256)
  )
  plt.plot(bin_edges[0:-1], histogram, color=c )

# Displaying the histogram
plt.xlabel("Color Value")
plt.ylabel("Pixels")

plt.show()
例如:

但是,我现在想根据直方图信息找到最主要颜色的RGB值

预期输出:
(87、74、163)
(或类似内容)

如何找到三种颜色通道的最高存储单元计数,并将它们组合成一种颜色?

您可以关注图像中的颜色,并找到计数最高的一种:

将matplotlib.image导入为mpimg
将numpy作为np导入
img=np.uint8(mpimg.imread('path/to/your/image.png')*255)
img=np.重塑(img,(np.产品(img.形状[:2]),3))
res=np.unique(img,axis=0,return\u counts=True)
dom_color=res[0][np.argmax(res[1]),:]
打印(彩色)
或者,您可以使用枕头,并获得数量最多的枕头:

从PIL导入图像
img=Image.open('path/to/your/Image.png'))
dom_color=sorted(img.getcolors(2**24),reverse=True)[0][1]
打印(彩色)
两者都可以很容易地提供第二、第三。。。主色调,如果需要的话

对于一些像这样的标志

主色如下所示:

[208 16 18]
分别

(208,16,18)
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
PyCharm:2021.1.1
Matplotlib:3.4.1
NumPy:1.20.2
枕头:8.2.0
----------------------------------------

编辑:也许,为了给直方图方法的对手一个机会,Cris在评论中也解释了这一点,请参见下图:

很难看到,但有三种不同类型的红色,最大的矩形的RGB值为
(208,0,18)

现在,让我们将柱状图方法与枕头的
getcolors
进行比较:

将numpy导入为np
从PIL导入图像
adv=np.zero((512,512,3),np.uint8)
adv[:200,:200,:]=[208,16,18]
adv[:200200:,:]=[208,16,0]
adv[200:,:200,:][0,16,18]
adv[200:,200:,:][208,0,18]
#直方图法
dom_color=[]
对于[0,1,2]中的通道_id:
dom_color.append(np.argmax(np.histogram(adv[…,channel_id],bin=256,range=(0256))[0]))
打印(彩色)
# [208, 16, 18]
#枕头颜色
dom_color=sorted(Image.fromarray(adv).getcolors(2**24),reverse=True)[0][1]
打印(彩色)
# (208, 0, 18)
敌人正在集结,以便在
(208、16、18)
处给出直方图峰值。然而,主色是
(208,0,18)
,因为我们可以很容易地从图像(或代码)中派生出来。

您可以关注图像中的颜色,并找到计数最高的颜色:

将matplotlib.image导入为mpimg
将numpy作为np导入
img=np.uint8(mpimg.imread('path/to/your/image.png')*255)
img=np.重塑(img,(np.产品(img.形状[:2]),3))
res=np.unique(img,axis=0,return\u counts=True)
dom_color=res[0][np.argmax(res[1]),:]
打印(彩色)
或者,您可以使用枕头,并获得数量最多的枕头:

从PIL导入图像
img=Image.open('path/to/your/Image.png'))
dom_color=sorted(img.getcolors(2**24),reverse=True)[0][1]
打印(彩色)
两者都可以很容易地提供第二、第三。。。主色调,如果需要的话

对于一些像这样的标志

主色如下所示:

[208 16 18]
分别

(208,16,18)
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
PyCharm:2021.1.1
Matplotlib:3.4.1
NumPy:1.20.2
枕头:8.2.0
----------------------------------------

编辑:也许,为了给直方图方法的对手一个机会,Cris在评论中也解释了这一点,请参见下图:

很难看到,但有三种不同类型的红色,最大的矩形的RGB值为
(208,0,18)

现在,让我们将柱状图方法与枕头的
getcolors
进行比较:

将numpy导入为np
从PIL导入图像
adv=np.zero((512,512,3),np.uint8)
adv[:200,:200,:]=[208,16,18]
adv[:200200:,:]=[208,16,0]
adv[200:,:200,:][0,16,18]
adv[200:,200:,:][208,0,18]
#直方图法
dom_color=[]
对于[0,1,2]中的通道_id:
dom_color.append(np.argmax(np.histogram(adv[…,channel_id],bin=256,range=(0256))[0]))
打印(彩色)
# [208, 16, 18]
#枕头颜色
dom_color=sorted(Image.fromarray(adv).getcolors(2**24),reverse=True)[0][1]
打印(彩色)
# (208, 0, 18)

敌人正在集结,以便在
(208、16、18)
处给出直方图峰值。尽管如此,主色是
(208,0,18)
,因为我们可以很容易地从图像(或代码)中推导出来。

您需要为RGB值构建一个3D直方图(联合直方图),而不是为每个通道构建单独的直方图(边缘直方图)。在3D直方图中,你可以找到最高的峰值,你可以找到权重最大的峰值,或者其他任何数量的东西。这取决于你如何定义“主色”。所谓主色,我指的是像素数最高的R、G和B。例如,如果我在上面给出的直方图中找到峰值,我会得到非常接近(87,74,163)的值。这就是我计划做的:为三个通道中的每一个找到“颜色值”峰值。你不能对每个通道都这样做。您需要使用关节历史记录