opencv 直方图均衡化,opencv直方图统计

  opencv 直方图均衡化,opencv直方图统计

  本文将介绍如何使用OpenCV函数进行直方图均衡化,将其应用于灰度和彩色图像,归一化亮度,提高图像对比度。感兴趣的朋友可以了解一下。

  00-1010前言灰度直方图均衡化颜色直方图均衡化

  

目录

 

  图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具。我们可以用它们来完成各种计算机视觉任务。在本文中,我们将介绍如何使用OpenCV函数cv2.equalizeHist()来执行直方图均衡化,并将其应用于灰度和彩色图像。函数cv2.equalizeHist()使亮度正常化,并提高图像的对比度。

  

前言

 

  使用cv2.equalizeHist()函数均衡给定灰度图像的对比度:

  #加载图像并将其转换为灰度图像

  image=cv2.imread(example.png )

  gray_image=cv2.cvtColor(image,cv2。COLOR_BGR2GRAY)

  hist=cv2.calcHist([gray_image],[0],None,[256],[0,256])

  #直方图均衡化

  gray _ image _ eq=cv2 . equalize hist(gray _ image)

  #直方图均衡化后的图像直方图

  hist _ eq=cv2 . calchist([gray _ image _ eq],[0],None,[256],[0,256])

  为了更多地了解直方图均衡化,我们修改原始灰度图像,对图像的每个像素加/减30,计算直方图均衡化前后的直方图:

  M=np.ones(gray_image.shape,dtype=uint8) * 30

  #图像的每个像素加30

  add _ image=cv2 . add(gray _ image,M)

  hist _ added _ image=cv2 . calchist([added _ image],[0],None,[256],[0,256])

  #直方图均衡化

  added _ image _ eq=cv2 . equalize hist(gray _ image _ eq)

  hist _ eq _ added _ image=cv2 . calchist([added _ image _ eq],[0],None,[256],[0,256])

  #图像的每个像素减去30

  subtracted_image=cv2.subtract(灰色_图像,M)

  hist _ subtracted _ image=cv2 . calchist([subtracted _ image],[0],None,[256],[0,256])

  #直方图均衡化

  subtracted _ image _ eq=cv2 . equalize hist(subtracted _ image)

  hist _ eq _ subtracted _ image=cv2 . calchist([subtracted _ image _ eq],[0],None,[256],[0,256])

  最后,画出所有这些图像:

  def show _ img _ with _ matplotlib(color _ img,title,pos):

  img_RGB=color_img[:-1]

  ax=plt.subplot(3,4,pos)

  plt.imshow(img_RGB)

  plt.title(title,fontsize=8)

  plt.axis(“关”)

  def show _ hist _ with _ matplotlib _ gray(历史,标题,位置,颜色):

  ax=plt.subplot(3,4,pos)

  PLT . xlabel( bin )

  plt.ylabel(像素数)

  plt.xlim([0,256])

  plt.plot(历史,颜色=颜色)

  #可视化

  show _ img _ with _ matplotlib(cv2 . CVT color(gray _ image,cv2。COLOR_GRAY2BGR),灰色,1)

  show _ hist _ with _ matplotlib _ gray(hist,灰度直方图,2, m )

  显示_图像_w

  ith_matplotlib(cv2.cvtColor(added_image, cv2.COLOR_GRAY2BGR), "gray lighter", 5)

  show_hist_with_matplotlib_gray(hist_added_image, "grayscale histogram", 6, m)

  show_img_with_matplotlib(cv2.cvtColor(subtracted_image, cv2.COLOR_GRAY2BGR), "gray darker", 9)

  show_hist_with_matplotlib_gray(hist_subtracted_image, "grayscale histogram", 10, m)

  # 其他图像的可视化方法类似,不再赘述

  # ...

  

  程序运行的输出如下图所示:

  

 

  在上图中,我们可以看到三个均衡化后的图像非常相似,这也反映在均衡化后的直方图中,这是因为直方图均衡化倾向于标准化图像的亮度,同时增加对比度。

  

 

  

颜色直方图均衡化

 

  使用相同的方法,我们可以在彩色图像中执行直方图均衡,将直方图均衡应用于 BGR 图像的每个通道(虽然这不是彩色图像直方图均衡的最佳方法),创建 equalize_hist_color() 函数,使用 cv2.split() 分割 BGR 图像并将 cv2.equalizeHist() 函数应用于每个通道,最后,使用 cv2.merge() 合并结果通道:

  

def equalize_hist_color(img):

 

  接下来,将此函数应用于三个不同的图像:原始 BGR 图像、将原始图像的每个像素值添加 10、将原始图像的每个像素值减去 10,并计算直方图均衡前后的直方图:

  

# 加载图像

 

  最后,绘制所有这些图像:

  

def show_img_with_matplotlib(color_img, title, pos):

 

  

 

  将直方图均衡化应用于 BGR 图像的每个通道并不是颜色直方图均衡化的好方法,这是由于 BGR 色彩空间的加性特性导致彩色图像的颜色变化很大。由于我们独立地改变三个通道中的亮度和对比度,因此在合并均衡通道时,这可能会导致图像中出现新的色调,正如上图所看到的那样。

  一种颜色直方图均衡化更好的方法是将 BGR 图像转换为包含亮度/强度通道的色彩空间( YuvLabHSVHSL )。然后,只在亮度通道上应用直方图均衡,最后合并通道并将它们转换回 BGR 颜色空间,以 HSV 空间为例,创建 equalize_hist_color_hsv() 函数实现上述颜色直方图归一化方法:

  

def equalize_hist_color_hsv(img):

 

  接下来,将此函数应用于三个不同的图像:原始 BGR 图像、将原始图像的每个像素值添加 10、将原始图像的每个像素值减去 10,并计算直方图均衡前后的直方图:

  

hist_color = hist_color_img(image)

 

  最后,绘制所有这些图像:

  

# show_img_with_matplotlib() 和 show_hist_with_matplotlib_rgb() 函数与上一示例相同

 

  

 

  由上图可以看出,仅均衡 HSV 图像的 V 通道得到的结果比均衡 BGR 图像的所有通道的效果要好很多,也可以将这种方法用于其他包含亮度/强度通道的色彩空间( YuvLabHSL )。

  以上就是Python OpenCV直方图均衡化详解的详细内容,更多关于OpenCV直方图均衡化的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • opencv图像识别数字,opencv 识别
  • opencv图像识别数字,opencv 识别,如何基于opencv实现简单的数字识别
  • opencv图像的旋转角度计算,opencv图像仿射变换
  • opencv图像的旋转角度计算,opencv图像仿射变换,OpenCV图像几何变换之透视变换
  • opencv图像的旋转角度计算,opencv 旋转任意角度
  • opencv图像的旋转角度计算,opencv 旋转任意角度,opencv图片的任意角度旋转实现示例
  • opencv图像处理函数,opencv图像轮廓合并
  • opencv图像处理函数,opencv图像轮廓合并,OpenCV图像处理之七种常用图像几何变换
  • opencv双线性插值函数,opencv 图像插值
  • LBPH人脸识别,基于opencv的人脸识别技术
  • LBPH人脸识别,基于opencv的人脸识别技术,Opencv LBPH人脸识别算法详解
  • ,,OpenCV黑帽运算(BLACKHAT)的使用
  • opencv双线性插值函数,opencv 图像插值,C++ OpenCV实现图像双三次插值算法详解
  • ,,C语言 OpenCV实现柱面投影
  • ,,C++ Opencv imfill孔洞填充函数的实现思路与代码
  • 留言与评论(共有 条评论)
       
    验证码: