介绍
这篇文章将为大家详细讲解有关基于OpenCV如何生成图像直方图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
01。什么是图像直方图?
在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图像的处理过程。
图像直方图表示图像的像素分布情况。换言之,图像直方图显示具有特定像素值的图像点数量,例如,假设正常图像的像素强度在0到255之间变化。为了生成其直方图,我们只需要计算像素值为0的像素数量,然后计算1并继续到255年即可。在图1中,我们有一个5 * 5的样本图像,我们通过计算每个像素强度的数量来创建直方图表。
图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中,我们显示了先前样本的均衡直方图。
图2:计算CDF。
图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如何生成图像直方图