使用opencv和python实现图像的智能处理,python opencv画图

  使用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: