Python 3.x 使用plt.plot v/s plt.hist[Python]的彩色图像直方图的差异
我使用下面的代码使用两种方法生成彩色图像的直方图: 方法1:-Python 3.x 使用plt.plot v/s plt.hist[Python]的彩色图像直方图的差异,python-3.x,opencv,matplotlib,computer-vision,opencv-python,Python 3.x,Opencv,Matplotlib,Computer Vision,Opencv Python,我使用下面的代码使用两种方法生成彩色图像的直方图: 方法1:- 使用cv2.calcHist()函数计算频率 使用plt.plot()生成频率的线形图 方法2:- 使用plt.hist()函数计算并生成直方图(我添加了bin=250,以便两个直方图保持一致) 观察:两个直方图大致相似。第一个直方图(使用plt.plot)看起来非常平滑。然而,第二个直方图(使用plt.hist)有额外的尖峰和下降 问题:由于图像只有int值,因此不应存在不一致的装箱。直方图-2中出现这些额外峰值和下降的原因是什么
blue_bricks = cv2.imread('Computer-Vision-with-Python/DATA/bricks.jpg')
fig = plt.figure(figsize=(17,10))
color = ['b','g','r']
# Histogram Type-1
fig.add_subplot(2,2,1)
for i,c in enumerate(color):
hist = cv2.calcHist([blue_bricks], mask=None, channels=[i], histSize=[256], ranges=[0,256])
plt.plot(hist,color=c)
plt.title('Histogram-1')
# Histogram Type-2
fig.add_subplot(2,2,2)
for i,c in enumerate(color):
plt.hist(blue_bricks[:,:,i].flatten(),color=c, alpha=0.5, bins=250)
plt.title('Histogram-2')
料仓=250
在最低值和最高值之间创建251条等间距的料仓边。这些值与离散值不一致。当最高值和最低值之间的差值大于250时,某些箱子将为空。当差值小于250时,一些存储箱将获得两个相邻数字的值,从而产生峰值。此外,当叠加直方图时,所有直方图使用完全相同的箱边是很方便的
您需要将存储单元精确地设置在整数值之间,设置bins=np。arange(-0.5256,1)
将实现这一点。或者,您可以使用seaborn的histplot(..,discrete=True)
下面是一些数字较小的代码来说明发生了什么
导入matplotlib.pyplot作为plt
将numpy作为np导入
图,((ax1,ax2),(ax3,ax4))=plt.子批(nrows=2,ncols=2,figsize=12,3))
对于ax-in(ax1、ax2、ax3、ax4):
如果ax在[ax1,ax3]中:
x=np.arange(1,10)
其他:
x=np.arange(1,12)
如果ax在[ax1,ax2]中:
垃圾箱=10
其他:
箱子=np.arange(0.5,x.max()+1,1)
_,bin_边,u=ax.hist(x,bin=bin,ec='white',lw=2)
ax.vlines(bin_边,0,2.5,color='crimson',ls='--'))
最大散射(x,[2.2]*len(x),color='lime',s=50)
ax.set_title((f“{bins}bins”if type(bins)==int else“discrete bins”)+f',{len(x)}值')
ax.set_xticks(x)
ax.set_-yticks([0,1,2])
plt.紧_布局()
plt.show()
料仓=250
在最低值和最高值之间创建251条等间距的料仓边。这些值与离散值不一致。当最高值和最低值之间的差值大于250时,某些箱子将为空。当差值小于250时,一些存储箱将获得两个相邻数字的值,从而产生峰值。此外,当叠加直方图时,所有直方图使用完全相同的箱边是很方便的
您需要将存储单元精确地设置在整数值之间,设置bins=np。arange(-0.5256,1)
将实现这一点。或者,您可以使用seaborn的histplot(..,discrete=True)
下面是一些数字较小的代码来说明发生了什么
导入matplotlib.pyplot作为plt
将numpy作为np导入
图,((ax1,ax2),(ax3,ax4))=plt.子批(nrows=2,ncols=2,figsize=12,3))
对于ax-in(ax1、ax2、ax3、ax4):
如果ax在[ax1,ax3]中:
x=np.arange(1,10)
其他:
x=np.arange(1,12)
如果ax在[ax1,ax2]中:
垃圾箱=10
其他:
箱子=np.arange(0.5,x.max()+1,1)
_,bin_边,u=ax.hist(x,bin=bin,ec='white',lw=2)
ax.vlines(bin_边,0,2.5,color='crimson',ls='--'))
最大散射(x,[2.2]*len(x),color='lime',s=50)
ax.set_title((f“{bins}bins”if type(bins)==int else“discrete bins”)+f',{len(x)}值')
ax.set_xticks(x)
ax.set_-yticks([0,1,2])
plt.紧_布局()
plt.show()