我在将图像的直方图拟合到特定范围以获取更好的对比度时遇到问题。
首先,我使用的数据从输入图像+直方图到输出图像+直方图再到想要的输出+直方图:
我在程序中使用的方法描述只是说“将黑色映射到最小强度,将白色映射到最大强度”。
以下是执行映射的代码:
for y in range(0, h):
for x in range(0, w):
image[y,x] = (((image[y,x] - smallest) / diff) * 65535)
此代码中最小的是原始图像中的最小强度,并区分最大和最小强度之间的差异。
我需要怎么做才能最终获得更平滑的直方图?
感谢您的帮助!
答案 0 :(得分:1)
如果image
是整数类型,则(image[y,x] - smallest) / diff)
是较小的整数-此操作会舍入结果,从而有效地量化输入灰度。
为防止这种情况发生,请按以下方式预先计算乘数:
scale = 65535 / diff
image[y,x] = (image[y,x] - smallest) * scale
或者,在计算映射之前将像素值转换为浮点数,然后转换回整数以将其存储回image
数组中。
答案 1 :(得分:0)
您可能想尝试scikit-image exposure
模块的直方图均衡化(通常产生比对比度/直方图拉伸更好的结果):
from skimage.io import imread
from skimage.exposure import equalize_hist
import matplotlib.pylab as plt
image = imread('../lc.png')
image = image / np.max(image)
plt.figure(figsize=(15,10))
plt.subplot(221)
plt.imshow(image, cmap='gray')
plt.title('original image')
plt.subplot(222)
plt.hist(image.ravel(), normed=True)
plt.title('histogram')
image = equalize_hist(image)
plt.subplot(223)
plt.imshow(image, cmap='gray')
plt.title('contrast-enhanced image')
plt.subplot(224)
plt.hist(image.ravel(), normed=True)
plt.title('histogram')
plt.show()