Numpy如何调整灰度图像直方图来实现高光/中调/阴影比例的要求

Numpy如何调整灰度图像直方图来实现高光/中调/阴影比例的要求

在本文中,我们将介绍如何使用Numpy来转换灰度图像的直方图,以实现高光/中调/阴影的比例要求。直方图是一种显示图像像素分布情况的图表,可以通过调整直方图来改变图像的整体亮度和对比度。

在开始之前,我们需要先导入Numpy库和matplotlib库,并加载一张灰度图像。我们可以使用下面的代码进行导入和加载:

import numpy as np
import matplotlib.pyplot as plt
from skimage import data

image = data.camera()

这个代码将加载一张名为“camera”的灰度图像,它是skimage库中自带的一张图像。现在,我们可以开始调整它的直方图了。

阅读更多:Numpy 教程

调整灰度图像直方图的方法

下面是一些我们可以使用的方法来调整灰度图像的直方图:

  • 线性拉伸:将图像的亮度范围拉伸到0-255范围内。
  • 直方图均衡化:将图像的亮度谱均匀分布在整个亮度范围内,以增强图像的对比度。
  • 自适应直方图均衡化:将直方图均衡化应用于图像的局部区域,以避免直方图均衡化过度压缩图像。

接下来,我们将对这些方法进行详细说明,并使用代码和示例进行说明。

线性拉伸

线性拉伸是一种简单的直方图调整方法,它将图像的亮度范围压缩或拉伸到0-255范围内,以增强图像的对比度。这是通过下面的公式进行计算的:

output_pixel = (input_pixel - min_value) * 255 / (max_value - min_value)

其中input_pixel是输入图像的像素值,min_value和max_value是图像像素值的最小和最大值,output_pixel是调整后的像素值。

以下是使用Numpy库实现线性拉伸的代码示例:

def linear_stretching(image):
    min_value = np.min(image)
    max_value = np.max(image)
    output = (image - min_value) * (255.0 / (max_value - min_value))
    return output.astype(np.uint8)

stretched = linear_stretching(image)

在上面的示例中,我们使用了NumPy库的函数来计算输入图像像素的最小值和最大值,然后使用上述公式计算输出像素。最后,我们用astype函数将输出像素转换为8位整数值类型。

可以看到,通过线性拉伸,图像的对比度得到了增强,但是它的亮度也发生了改变。这可能会影响图像的视觉效果。因此,我们需要使用其他方法来保持图像亮度的平衡。

直方图均衡化

直方图均衡化是一种比线性拉伸更复杂的调整方法,它将图像的亮度谱平均分布到整个亮度范围内,以增强图像的对比度。这是通过下面的公式进行计算的:

output_pixel = CDF(input_pixel) * (L - 1)

其中CDF是累积分布函数,用于计算输入图像中小于或等于当前像素值的像素数量的分数,L是输出像素的灰度级数。

以下是使用Numpy库实现直方图均衡化的代码示例:

def histogram_equalization(image):
    hist, bins = np.histogram(image.flatten(), 256, [0, 256])
    cdf = hist.cumsum()
    cdf_normalized = cdf * hist.max() / cdf.max()
    output = np.interp(image.flatten(), bins[:-1], cdf_normalized).reshape(image.shape)
    return output.astype(np.uint8)

equalized = histogram_equalization(image)

在上面的示例中,我们首先使用NumPy库的函数来计算输入图像的直方图和累积分布函数。然后,使用interp函数将输入图像中的每个像素值映射到均衡化后的值。最后,我们reshape函数将输出数组重新转换为具有相同形状的图像,并使用astype函数将输出像素转换为8位整数值类型。

可以看到,通过直方图均衡化,图像的对比度显著增强,但是它的亮度也发生了改变。因此,我们需要使用自适应直方图均衡化来同时保持图像的亮度和对比度。

自适应直方图均衡化

自适应直方图均衡化是一种比直方图均衡化更复杂的调整方法,它将直方图均衡化应用于图像的局部区域,以避免直方图均衡化过度压缩图像。这是通过以下步骤来实现的:

  • 将图像分解为较小的块(例如16×16像素)。
  • 对于每个块,应用直方图均衡化进行亮度调整。
  • 将每个块重新组合成一张图像。

以下是使用Numpy库实现自适应直方图均衡化的代码示例:

def adaptive_histogram_equalization(image, block_size=16):
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(block_size, block_size))
    output = clahe.apply(image)
    return output

adaptive_equalized = adaptive_histogram_equalization(image)

在上面的示例中,我们使用OpenCV的createCLAHE函数创建一个CLAHE对象,并将其应用于输入图像。clipLimit参数控制直方图均衡化的振幅限制,tileGridSize参数定义块的大小。

可以看到,通过自适应直方图均衡化,图像的对比度显著增强,并且不会对图像的亮度进行大幅度的调整。

总结

使用Numpy库,我们可以轻松地进行灰度图像直方图的转换,从而实现高光/中调/阴影比例的要求。线性拉伸是一种简单但有限的方式,直方图均衡化可以显著增强图像的对比度,但会对图像的亮度进行调整。自适应直方图均衡化可以同时保持图像的亮度和对比度,并避免直方图均衡化过度压缩图像。根据不同的图像需求,我们可以选择适当的直方图调整方法来获得理想的效果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程