基于OpenCV如何生成图像直方图

  介绍

这篇文章将为大家详细讲解有关基于OpenCV如何生成图像直方图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

01。什么是图像直方图?

在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图像的处理过程。

图像直方图表示图像的像素分布情况。换言之,图像直方图显示具有特定像素值的图像点数量,例如,假设正常图像的像素强度在0到255之间变化。为了生成其直方图,我们只需要计算像素值为0的像素数量,然后计算1并继续到255年即可。在图1中,我们有一个5 * 5的样本图像,我们通过计算每个像素强度的数量来创建直方图表。

基于OpenCV如何生成图像直方图

图1:生成图像直方图的过程

02。如何生成图像直方图?

在python中,我们可以使用以下两个函数来创建然后显示图像的直方图。

import  matplotlib.pyplot  as  plt   import  numpy  as  np   ,   ,   def  generate_histogram (img, do_print):   “才能”;“   @params才能:img:,还要be  a  grayscale 或是color 图像只calculate 我方表示歉意,Normalized  histogram  of 却;能够形象。   @params才能:do_print:, if 或是not  print 从而result 直方图   ,,@return: will  return  both  histogram 以及,grayscale  image    “才能”;“   if 才能len (img.shape),==, 3:, #, img  is 多彩,,so  convert 我方表示歉意it 用灰度   ,,,gr_img =, np.mean (img,,轴=1)   其他的才能:   ,,,gr_img =img   & # 39;才能& # 39;& # 39;你calc 我方表示歉意grayscale 直方图# 39;& # 39;& # 39;   时间=gr_hist 才能;np.zeros ([256])   ,   ,   for 才能;x_pixel 拷贝范围(gr_img.shape [0]):   ,,,for  y_pixel 拷贝范围(gr_img.shape [1]):   ,,,,,pixel_value =, int (gr_img [y_pixel x_pixel也])   ,,,,,gr_hist (pixel_value), +=1   ,   ,   & # 39;才能& # 39;& # 39;normalizing 从而直方图# 39;& # 39;& # 39;   gr_hist 才能;/=,(gr_img.shape [0], *, gr_img.shape [1])   if 才能;do_print:   ,,,print_histogram (gr_hist, name=皀_h_img",, title=癗ormalized  Histogram")   return 才能;gr_hist gr_img   ,   ,   ,def  print_histogram (_histrogram、,名称,标题):   plt.figure才能()   plt.title才能(标题)   plt.plot才能(_histrogram,颜色=& # 39;# ef476f& # 39;)   plt.bar才能(np.arange (len (_histrogram)), _histrogram,,颜色=& # 39;# b7b7a4& # 39;)   plt.ylabel才能(& # 39;Number  of 像素# 39;)   plt.xlabel才能(& # 39;Pixel 价值# 39;)   plt.savefig才能(“hist_", +,名字)

在大多数情况下,当我们创建直方图时,我们通过将每个强度值的像素数除以归一化因子(即图像宽度和图像高度的乘积)来对直方图进行归一化。为了便于使用,如果generate_histogram函数的输入图像是彩色图像,我们首先将其转换为灰度图像(请参见第6行)。

03。如何均衡图像直方图?

直方图均衡化通常用于增强图像的对比度,因此,该技术不能保证始终提高图像质量。计算CDF(累积分布函数)是均衡图像直方图的常用方法。在图2中,我们计算了在图1中创建的样本图像的CDF。此外,在图3中,我们显示了先前样本的均衡直方图。

基于OpenCV如何生成图像直方图

图2:计算CDF。

基于OpenCV如何生成图像直方图

图3:均方图。

为了计算python中的均衡直方图,我们创建了以下代码:

def  equalize_histogram (img,组织,,L):   时间=eq_histo 才能;np.zeros_like(组织)   时间=en_img 才能;np.zeros_like (img)   for 才能小姐:拷贝范围(len(组织)):   ,,,eq_histo[我],=,int ((L 作用;1),*,np.sum(组织(0:我)))   print_histogram才能(eq_histo, name=癳q_" + str(指数),title=癊qualized  Histogram")   & # 39;才能& # 39;& # 39;enhance  image  as : & # 39; & # 39; & # 39;   for 才能;x_pixel 拷贝范围(img.shape [0]):   ,,,for  y_pixel 拷贝范围(img.shape [1]):   ,,,,,pixel_val =, int (img [y_pixel x_pixel也])   ,,,,,en_img [x_pixel, y_pixel],=, eq_histo [pixel_val]   & # 39;才能& # 39;& # 39;creating  new 直方图# 39;& # 39;& # 39;   ,,hist_img, _ =, generate_histogram (en_img,打?False,,指数=指数)   print_img才能(img=en_img, histo_new=hist_img, histo_old=组织,指数=str(指数),L=L)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

基于OpenCV如何生成图像直方图