如何轻松对存储在NumPy数组中的多个灰度图像进行直方图均衡化?
我有96x96像素的NumPy数据,格式为4D:
(1800, 1, 96,96)
如何轻松对存储在NumPy数组中的多个灰度图像进行直方图均衡化?
我有96x96像素的NumPy数据,格式为4D:
(1800, 1, 96,96)
import numpy as np
def image_histogram_equalization(image, number_bins=256):
# from http://www.janeriksolem.net/histogram-equalization-with-python-and.html
# get image histogram
image_histogram, bins = np.histogram(image.flatten(), number_bins, density=True)
cdf = image_histogram.cumsum() # cumulative distribution function
cdf = (number_bins-1) * cdf / cdf[-1] # normalize
# use linear interpolation of cdf to find new pixel values
image_equalized = np.interp(image.flatten(), bins[:-1], cdf)
return image_equalized.reshape(image.shape), cdf
if __name__ == '__main__':
# generate some test data with shape 1000, 1, 96, 96
data = np.random.rand(1000, 1, 96, 96)
# loop over them
data_equalized = np.zeros(data.shape)
for i in range(data.shape[0]):
image = data[i, 0, :, :]
data_equalized[i, 0, :, :] = image_histogram_equalization(image)[0]
density=True
所做的。因此,在这里 image_histogram
实际上就是归一化直方图。 - mh sattariancdf = 255 * cdf / cdf[-1]
中的 255 应该改为 (number_bins - 1)
,这样更加一致。 - Dominik Stańczak使用skimage模块提供的累积分布函数非常简单快捷。基本上,你需要数学证明它。
from skimage import exposure
import numpy as np
def histogram_equalize(img):
img = rgb2gray(img)
img_cdf, bin_centers = exposure.cumulative_distribution(img)
return np.interp(img, bin_centers, img_cdf)
截至今天,janeriksolem的网址已经失效。
然而,我找到了this gist,它链接到相同的页面,并声称可以在不计算直方图的情况下执行直方图均衡化。
代码如下:
img_eq = np.sort(img.ravel()).searchsorted(img)
import numpy as np
from skimage import exposure
def hist_eq(image):
hist, bins = exposure.histogram(image, nbins=256, normalize=False)
# append any remaining 0 values to the histogram
hist = np.hstack((hist, np.zeros((255 - bins[-1]))))
cdf = 255*(hist/hist.sum()).cumsum()
equalized = cdf[image].astype(np.uint8)
return equalized