发布时间:2021-09-22 22:29:14编辑:run阅读(5960)
直方图匹配是指一幅图像的直方图与另一个参考(模版)图像的直方图相匹配的过程。
实现直方图匹配过程的算法:
1 计算每个图像的累积直方图
2 已知输入(将要调整的)图像中任意像素值Xi,在输出图像中通过匹配输入图像的直方图与模版图像的直方图找到对应的像素值Xj
3 已知Xi像素值的累积直方图值G(Xi),找到一个像素值Xj, 使其累积分布值H(Xj)在参照图中等于G(Xi), 即H(Xj) = G(Xi)
4 输入值Xi由Xj替代
from skimage.io import imread from skimage.color import rgb2gray from skimage.exposure import cumulative_distribution import matplotlib.pylab as pylab import numpy as np pylab.rcParams['font.sans-serif'] = ['KaiTi'] pylab.rcParams['axes.unicode_minus'] = False def cdf(im): c, b = cumulative_distribution(im) c = np.insert(c, 0, [0]*b[0]) c = np.append(c, [1]*(255-b[-1])) return c def hist_matching(c, c_t, im): pixels = np.arange(256) new_pixels = np.interp(c, c_t, pixels) im = (np.reshape(new_pixels[im.ravel()], im.shape)).astype(np.uint8) return im def plot_image(image, title=''): pylab.title(title, size=20) pylab.imshow(image) pylab.axis('off') pylab.gray() im = (rgb2gray(imread(r'D:\image_processing\image4\4.jpg'))*255).astype(np.uint8) im_t = (rgb2gray(imread(r'D:\image_processing\image4\a.jpg'))*255).astype(np.uint8) pylab.figure(figsize=(20, 15)) pylab.subplot(2, 3, 1) plot_image(im, '输入图像') pylab.subplot(2, 3, 2) plot_image(im_t, '模版图像') c = cdf(im) c_t = cdf(im_t) pylab.subplot(2, 3, 3) p = np.arange(256) pylab.plot(p, c, 'r.-', label='输入图像') pylab.plot(p, c_t, 'b.-', label='模版图像') pylab.legend(prop={'size': 20}) pylab.title('累积分布函数', size=20) im = hist_matching(c, c_t, im) pylab.subplot(2, 3, 4) plot_image(im, '直方图匹配的输出图像') c1 = cdf(im) pylab.subplot(2, 3, 5) pylab.plot(np.arange(256), c, 'r.-', label='输入图像') pylab.plot(np.arange(256), c_t, 'b.-', label='模版图像') pylab.plot(np.arange(256), c1, 'g.-', label='输出图像') pylab.legend(prop={'size': 20}) pylab.title('累积分布函数', size=20) pylab.show()
47569
45926
36869
34433
29042
25681
24530
19685
19205
17717
5542°
6119°
5653°
5707°
6663°
5449°
5454°
5960°
5934°
7264°