Python计算并绘制灰度直方图

  • Post author:
  • Post category:python




灰度直方图

灰度直方图是关于灰度级分布的函数,将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。

如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用probability density function (PDF)来刻画和描述,表现为灰度直方图。



OpenCV计算并绘制直方图

import cv2
import SimpleITK as sitk
import matplotlib.pyplot as plt

ct_path = './volume-0.nii'
seg_path = './segmentation-0.nii'
ct_array = sitk.GetArrayFromImage(sitk.ReadImage(ct_path))
seg_array = sitk.GetArrayFromImage(sitk.ReadImage(seg_path))
seg_bg = seg_array==0
seg_liver = seg_array>=1
seg_tumor = seg_array==2

ct_bg = ct_array*seg_bg
ct_liver = ct_array*seg_liver
ct_tumor = ct_array*seg_tumor

bg_min = ct_bg.min()
bg_max = ct_bg.max()
liver_min = ct_liver.min()
liver_max = ct_liver.max()
tumor_min = ct_tumor.min()
tumor_max = ct_tumor.max()
hist_bg = cv2.calcHist([ct_bg.flatten()],[0],None,[100],[int(bg_min),int(bg_max)])# shape(100, 1)
hist_liver = cv2.calcHist([ct_liver.flatten()],[0],None,[100],[int(liver_min),int(liver_max)])# shape(100, 1)
hist_tumor = cv2.calcHist([ct_tumor.flatten()],[0],None,[100],[int(tumor_min),int(tumor_max)])# shape(100, 1)
plt.plot(hist_bg,'k')
plt.plot(hist_liver,'r')
plt.plot(hist_tumor,'g')
plt.legend(('bg', 'liver', 'tumor'),loc='upper right')
plt.title('Tissue Intensity Distribution')
plt.show()

目的:查看并分析backgroud,liver,tumor的intensity distribution。

在这里插入图片描述



OpenCV计算直方图

hist = cv2.calcHist(images,channels,mask,histSize,ranges [,hist [,accumulate]]

参数说明:

images:uint8或float32类型的原图像。用方括号表示,即“[img]”;

channels:计算直方图的通道索引,也在方括号中给出.例如,如果输入是灰度图像,则其值为[0].对于彩色图像,可以通过[0],[1]或[2]分别计算蓝色,绿色或红色通道的直方图.

mask:蒙版图像.要查找完整图像的直方图,它将显示为“无”.但是,如果要查找图像特定区域的直方图,则必须为其创建蒙版图像并将其作为蒙版.

histSize:这代表我们的BIN计数.需要在方括号中给出.对于满量程,我们通过[256].

ranges:这是我们的范围。通常,它是[0,256].

import cv2
img = cv2.imread('img.jpg')
hist = cv2.calcHist([img],[0],None,[256],[0,256])



Numpy计算直方图

hist,bins = np.histogram(img.ravel(),256[0,256])
hist = np.bincount(img.ravel(),minlength = 256

bins将有257个元素,因为Numpy计算bins为0-0.99,1-1.99,2-2.99等.所以最终范围是255-255.99. 为了表示这一点,他们还在箱柜末尾添加256. 但我们不需要256.高达255就足够了.

Note:

OpenCV函数比np.histogram() 大约快40倍,

np.bincount(),比np.histogram()大约快10倍。




matplotlib.pyplot绘制直方图

from matplotlib import pyplot as plt
plt.hist(img,256,[0,256])
plt.show()


灰度直方图

能够很直观的展示图像中灰度级的整体分布情况,对图像的后续处理有很好的指导作用。


直方图均衡化

的是将一幅图像的直方图变平,使各个灰度级的趋于均匀分布,这样能够很好的增强图像对比度。直方图均衡化是一种自动化的变换,仅需要输入图像,就能够确定图像的变换函数。但是直方图的均衡化操作也有一定的确定,在均衡化的过程中对图像中的数据不加选择,这样有可能会增强图像的背景;变换后图像的灰度级减少,有可能造成某些细节的消失;会压缩图像直方图中的高峰,造成处理后图像对比度的不自然等。


直方图规定化

,也称为直方图匹配,经过规定化处理将原图像的直方图变换为特定形状的直方图(上面中的示例,就是将图像的直方图变换为另一幅图像的直方图)。它可以按照预先设定的某个形状来调整图像的直方图,运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状它可以按照预先设定的某个形状来调整图像的直方图。直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补直方图均衡化的一些缺点.

参考:


图像处理基础(8):图像的灰度直方图、直方图均衡化、直方图规定化(匹配)



opencv python 直方图



版权声明:本文为weixin_44058333原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。