直方图规定化 python
时间: 2023-10-30 20:07:51 浏览: 131
直方图规定化是一种用于图像处理的技术,它可以通过将一幅图像的像素值映射到另一幅图像的像素值来实现两幅图像之间的颜色匹配。在Python中,可以使用numpy和matplotlib库以及PIL库来实现直方图规定化。
首先,我们需要加载待处理的两幅图像。可以使用PIL库的Image模块将图像读入,并使用numpy库将图像转换为数组。然后,使用matplotlib库的pyplot模块显示原图像和参考图像。
接下来,我们需要计算原图像和参考图像的直方图。可以使用numpy库的histogram函数来计算直方图,并将直方图归一化。
然后,计算原图像和参考图像的累积分布函数(CDF),并将CDF归一化。可以使用numpy库的cumsum函数来计算CDF,并使用numpy库的interp函数来进行插值。
创建一个新的图像数组,并针对每个像素应用灰度映射。可以使用numpy库的zeros_like函数创建一个与原图像相同大小的全零数组,并使用numpy库的interpolate函数来计算灰度值映射。
最后,使用matplotlib库的pyplot模块显示规定化后的图像。
以下是完整的代码:
```python
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 读入原图像和参考图像
img1 = np.array(Image.open('img1.jpg'))
img2 = np.array(Image.open('img2.jpg'))
# 显示原图像和参考图像
plt.subplot(2,2,1)
plt.imshow(img1, cmap='gray')
plt.axis('off')
plt.title('原图像')
plt.subplot(2,2,2)
plt.imshow(img2, cmap='gray')
plt.axis('off')
plt.title('参考图像')
# 计算原图像和参考图像的直方图
hist1, bins1 = np.histogram(img1.flatten(), 256, [0,256])
hist2, bins2 = np.histogram(img2.flatten(), 256, [0,256])
# 将直方图归一化
hist1 = hist1 / float(np.sum(hist1))
hist2 = hist2 / float(np.sum(hist2))
# 计算原图像和参考图像的累积分布函数(CDF)
cdf1 = hist1.cumsum()
cdf2 = hist2.cumsum()
# 将CDF归一化
cdf1 = cdf1 / float(cdf1[-1])
cdf2 = cdf2 / float(cdf2[-1])
# 创建新的图像数组
img3 = np.zeros_like(img1)
# 计算灰度值映射
lut = np.interp(cdf1, cdf2, np.arange(0, 256))
# 针对每个像素应用灰度映射
for i in range(256):
img3[img1 == i] = lut[i]
# 显示规定化后的图像
plt.subplot(2,2,3)
plt.imshow(img3, cmap='gray')
plt.axis('off')
plt.title('规定化后的图像')
plt.show()
```
阅读全文