Python 如何绘制提取图像颜色通道的直方图

Python 如何绘制提取图像颜色通道的直方图,python,image,numpy,matplotlib,histogram,Python,Image,Numpy,Matplotlib,Histogram,我正在尝试制作一个我的图像所具有的不同通道的直方图 出现错误“形状不匹配:无法将对象广播到单个形状”,而不是制作直方图 以下是我目前拥有的代码。你知道我做错了什么吗 将numpy导入为np 将matplotlib.image导入为mpimg 将matplotlib.pyplot作为plt导入 im=mpimg.imread('ps09_display-helix.png')) im=im[100:560368:864,:] pl=np.直方图(im) plt.bar(范围(768),pl[:2

我正在尝试制作一个我的图像所具有的不同通道的直方图

出现错误
“形状不匹配:无法将对象广播到单个形状”
,而不是制作直方图

以下是我目前拥有的代码。你知道我做错了什么吗

将numpy导入为np
将matplotlib.image导入为mpimg
将matplotlib.pyplot作为plt导入
im=mpimg.imread('ps09_display-helix.png'))
im=im[100:560368:864,:]
pl=np.直方图(im)
plt.bar(范围(768),pl[:256],color='r',alpha=0.5)
plt.bar(范围(768),pl[256:2*256],color='g',alpha=0.4)
plt.bar(范围(768),pl[2*256:],color='b',alpha=0.3)
plt.show()
错误
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
2 im=im[100:560368:864,:]
3 pl=np.直方图(im)
---->4 plt.bar(范围(768),pl[:256],color='r',alpha=0.5)
5 plt.bar(范围(768),pl[256:2*256],color='g',alpha=0.4)
6 plt.bar(范围(768),pl[2*256:],color='b',alpha=0.3)
e:\Anaconda3\lib\site packages\matplotlib\pyplot.py条形图(x、高度、宽度、底部、对齐、数据,**kwargs)
2485 x,高度,宽度=0.8,底部=无,*,对齐=中心,
2486数据=无,**kwargs):
->2487返回gca().bar(
2488 x,高度,宽度=宽度,底部=底部,对齐=对齐,
2489**({“数据”:数据}如果数据不是其他{}),**kwargs)
e:\Anaconda3\lib\site packages\matplotlib\\uuuu init\uuuuuu.py在内部(ax、数据、*args、**kwargs)
1445 def内部(ax,*参数,数据=无,**kwargs):
1446如果数据为无:
->1447返回函数(ax,*map(sanitize_序列,args),**kwargs)
1448
1449绑定=新的信号绑定(ax,*args,**kwargs)
e:\Anaconda3\lib\site packages\matplotlib\axes\\u axes.py在条形图中(self、x、高度、宽度、底部、对齐、**kwargs)
2428 yerr=self.\u convert\u dx(yerr,y0,y,self.convert\u yunits)
2429
->2430 x,高度,宽度,y,线宽=np(
2431#使args也可接受。
2432 np.至少1d(x)、高度、宽度、y、线宽)
在广播数组中(*args,**kwargs)
e:\Anaconda3\lib\site packages\numpy\lib\stride\u tricks.py在广播数组中(subok,*args)
536 args=[np.array(_m,copy=False,subok=subok)表示args中的_m]
537
-->538形状=_广播_形状(*args)
539
540如果全部(array.shape==参数中数组的形状):
e:\Anaconda3\lib\site packages\numpy\lib\stride\u tricks.py在广播形状(*args)中
418#使用旧的迭代器,因为np.nditer不处理大小为0的数组
419#始终如一
-->420 b=np.广播(*args[:32])
421#不幸的是,它无法直接处理32个或更多参数
422用于范围内的位置(32,透镜(args),31):
ValueError:形状不匹配:无法将对象广播到单个形状
  • 随着时间的推移,包的更改导致原始答案不起作用。
    • 预期代码可以与以下包版本一起使用。答案无法解释将来的包更改,并且可能不适用于较旧版本的包
    • 如果代码不能使用比下面所述更新的版本,请留下注释
  • 代码已更新,可用于以下软件包:
    • matplotlib v3.3.4
    • numpyv1.20.1
    • cv2 v4.0.1
加载图像并提取颜色通道
  • 鉴于以下情况:

  • ValueError:形状不匹配
    是因为未正确提取图像中的数组
  • 提取RGB通道的二维阵列
  • 将RGB通道的二维阵列展平为一维
导入matplotlib.pyplot作为plt
将numpy作为np导入
#将图像加载到数组中:image
image=plt.imread('ps09_display-helix.png'))
#裁剪图像-此图像需要裁剪图像,因为左/右边框较宽
image=image[100:560368:864,:]
#显示裁剪后的图像
plt.imshow(图片)
#提取RGB通道的二维阵列:红色、绿色、蓝色
红色、绿色、蓝色=图像[:,:,0],图像[:,:,1],图像[:,:,2]
#将RGB通道的二维阵列展平为一维
红色像素=红色。展平()
绿色\像素=绿色。展平()
蓝色\像素=蓝色。展平()
绘制单一直方图
#将每种颜色的像素直方图叠加在底部子图中
plt.图(figsize=(12,12))
plt.hist(红色像素,存储单元=256,密度=False,颜色=red',alpha=0.5)
plt.hist(绿色像素,存储单元=256,密度=False,颜色=green',alpha=0.4)
plt.hist(蓝色像素,存储单元=256,密度=False,颜色=blue',alpha=0.3)
#设置标签和记号
plt.xticks(ticks=np.linspace(0,1,17),labels=range(0,257,16))
#化妆品
plt.title('彩色图像直方图')
plt.ylabel('计数')
plt.xlabel(“强度”)
#显示绘图
plt.show()

备用地块1
  • 每个直方图分别显示
fig,axes=plt.子批次(nrows=1,ncols=3,figsize=(18,6))
axes=axes.ravel()
对于pix、color、ax-in-zip([红色像素、绿色像素、蓝色像素],“红色”、“绿色”、“蓝色”],轴):
ax.hist(像素,存储单元=256,密度=False,颜色=color,alpha=0.5)
#设置标签和记号
ax.set_xticks(ticks=np.linspace(0,1,17))
ax.set_xticklabels(标签=范围(0,257,16),旋转=90)
ax.set_ylim(0,10000)
#化妆品
ax.set_title(f'颜色{color}'的直方图)
ax.set_ylabel('计数')
ax.set_xlabel(‘强度’)
#显示绘图
plt.紧_布局()
plt.show()

备用地块2
  • 图像上使用from
导入cv2
颜色=('r'、'g'、'b')
plt.图(figsize=(8,6))
对于i,枚举中的列(颜色):
histr=cv2.calcHist([image],[i],无[256],[0,1])