使用opencv和python实现图像的智能处理,python opencv画图
本文主要讲解灰度直方图的基本概念,Python调用OpenCV绘制图像直方图。
本文由eastmount分享自华为云社区《[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图》。
一、灰度直方图的基本概念什么是灰度直方图?直方图是灰度的函数,描述了一幅图像中每个灰度的像素数,反映了一幅图像中每个灰度的出现频率。横坐标是灰度,纵坐标是灰度的频率。
对于连续图像,它从中心的高灰度级平滑地变化到边缘的低灰度级。直方图定义为:
其中A(D)是阈值面积函数:连续图像中所有灰度级为D的轮廓线所包围的面积。对于离散函数,如果 d固定为1,则:H(D)=A(D)-A(D 1)。
颜色直方图是高维直方图的特例,它统计颜色出现的频率,即颜色概率分布信息。这通常需要一定的量化过程,将颜色分成几个不重叠的类别。一般不在RGB颜色空间直接统计,而是在亮度分离后,统计代表颜色部分的信息,比如在HSI空间的HS子空间,YUV空间的UV子空间,以及其他反映人类视觉特性的颜色空间表示。
直方图计算如下:
根据定义,如果图像有L(通常L=256,即8位灰度级)个灰度级,那么大小为MxN的灰度级图像f(x,y)的灰度直方图hist[0…L-1]可以通过下面的计算得到。
1.初始化hist[k]=0;k=0,…,L-1
2.统计历史[f(x,y)];x=0,…,M-1,y=0,…,N-1
3.归一化hist[f(x,y)]/=M*N
说了这么多,直方图的作用是什么?
用轮廓线确定物体边界时,用直方图选取边界的阈值较好,并对阈值进行处理。这对于对象和背景之间具有强对比度的场景的分割特别有用。简单物体的面积和综合光密度IOD可以从图像的直方图中获得。
2.绘制直方图1。基本概念在直方图中,横坐标表示图像中每个像素的灰度级,纵坐标表示具有灰度级的像素数。
假设有一张3*3的图片,如下图所示。X数组计算像素的灰度,Y数组计算具有该灰度的像素数。其中,灰度为1的像素有3个,灰度为2的像素有1个,灰度为3的像素有2个,灰度为4的像素有1个,灰度为5的像素有2个。
x=[1,2,3,4,5]
y=[3,1,2,1,2]
画一个如下的折线图:
绘制的直方图如下:
如果灰度为0-255(最小值为0黑,最大值为255白),也可以画出相应的直方图。下图显示了拼接在一起的三张图片及其对应的直方图。
2.归一化直方图这个直方图的横坐标表示图像中每个像素的灰度,纵坐标表示这个灰度的概率。计算方法如下:
(1)首先计算灰度和对应的像素数
x=[1,2,3,4,5]
t=[3,1,2,1,2]
(2)计算像素的总数
n=(3 1 2 1 2)=9
(3)统计每个灰度级的概率。
y=t/n=[3/9,1/9,2/9,1/9,2/9]
3.绘制直方图主要调用matplotlib的子库pyplot,它提供了一个类似于Matlab的绘图框架。matplotlib是一个Python绘图包,基础非常强。提供一个类似MATLAB的绘图框架。导入代码如下:
导入matplotlib.pyplot为plt,其中直方图绘制主要通过调用hist函数来实现,hist函数根据数据源和像素级别绘制直方图。功能原型如下:
Hist(数据源,像素级)
参数:
数据源必须是一维数组,通常图像需要用函数ravel()拉直。
像素级别通常为256,这意味着[0,255]
函数ravel()将多维数组简化为一维数组,格式如下:
一维数组=多维数组。拉威尔()
4.代码实现#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
src=cv2.imread(test01.jpg )
cv2.imshow(src ,src)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.hist(src.ravel(),256)
plt.show()的输出结果如下:
3.使用OpenCV统计绘制直方图。1.前面解释了函数原型,调用matplotlib库绘制直方图,后面是使用OpenCV statistics绘制直方图的例子。
直方图:图像中每个像素的灰度级。
直方图:具有该灰度级的像素数。
调用主函数calcHist()来实现:
hist=cv2.calcHist(图像、通道、遮罩、histSize、范围、累积)
参数:
Hist代表直方图,返回的二维数组图像代表原始图像通道代表指定的通道,通道号需要用括号括起来。当输入图像是灰度图像时,其值是[0],而彩色图像是[0]、[1]和[2],它们分别表示代表掩模图像的B、G和Rmask。统计整幅图像的直方图,设置为无,统计其中一幅图像。
Ranges表示像素值范围,例如,[0,255]accumulate表示累积叠加标记,默认为false。如果设置为true,直方图将不会在分配开始时被清除。该参数允许从多个对象计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于一组图像的直方图计算。
2.代码实现:首先计算图像灰度的基本大小、形状和内容。
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
src=cv2.imread(test01.jpg )
# Parameter:原始图像通道[0]-B蒙版箱为0-255范围内的256像素。
hist=cv2.calcHist([src],[0],None,[256],[0,255])
打印(类型(历史))
打印(历史尺寸)
打印(历史形状)
打印(历史)输出结果如下:
下面是绘制图像的代码。先在matplotlib库中添加一些绘制图像的代码,也推荐一下我的文章。
【Python数据挖掘教程】六。Numpy,Pandas和Matplotlib包的基础知识
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#绘制正弦函数曲线
x1=np.arange(0,6,0.1)
y1=np.sin(x1)
plt.plot(x1,y1)
#绘制坐标点折扣
x2=[0,1,2,3,4,5,6]
y2=[0.3,0.4,2.5,3.4,4,5.8,7.2]
plt.plot(x2,y2)
#用常规增量省略x2参数
y3=[0,0.5,1.5,2.4,4.6,8]
plt.plot(y3,color=r )
plt.show()的输出结果有三行,如下所示:
最后给出了调用calcHist()计算B、G、R灰度并绘制图形的代码。
#编码:utf-8
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
src=cv2.imread(test01.jpg )
histb=cv2.calcHist([src],[0],None,[256],[0,255])
histg=cv2.calcHist([src],[1],None,[256],[0,255])
histr=cv2.calcHist([src],[2],None,[256],[0,255])
cv2.imshow(src ,src)
cv2.waitKey(0)
cv2.destroyAllWindows()
plt.plot(histb,color=b )
plt.plot(histg,color=g )
plt.plot(histr,color=r )
plt.show()的输出结果如下图所示:
第一时间点击了解华为云鲜技术~
原创作品来自华为云开发者联盟,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。