地方网站不让做吗,专业购物网站建设哪家好,分类信息 wordpress,免费网站奖励自己游戏前言#xff1a; Hello大家好#xff0c;我是Dream。 均衡化是数字图像处理中常用的一种技术#xff0c;用于增强图像的视觉效果和对比度。#xff0c;今天我们将实现对同一张图像的直方图均衡化和自适应直方图均衡化处理#xff0c;学习一下两者的的基本原理和实现过程 Hello大家好我是Dream。 均衡化是数字图像处理中常用的一种技术用于增强图像的视觉效果和对比度。今天我们将实现对同一张图像的直方图均衡化和自适应直方图均衡化处理学习一下两者的的基本原理和实现过程一起来看看吧~ 一、直方图均衡化
直方图均衡化Histogram Equalization是一种图像处理技术通过重新分配图像灰度级别来增强图像的对比度和视觉效果。它基于整个图像的灰度直方图来调整像素的灰度值分布。通过增加较暗区域的亮度和减少较亮区域的亮度直方图均衡化可以使图像的灰度级别分布更均匀从而增强图像的细节和对比度。
1.得到灰度图
通过三同道的彩色图生成单通道的灰度图 首先我们使用PIL库中的Image.open()函数读取彩色图像并将其转换为数组。然后我们获取图像的高度和宽度并创建一个与原始图像大小相同、数据类型为uint8的全黑数组gray_img用于保存灰度图像。
接着我们遍历每个像素将三个通道的值求平均并将结果保存到灰度图像中。由于RGB图像的三个通道具有相同的权重因此将三个通道的值求平均可以得到一个比较准确的灰度值。
然后我们将灰度图像转换为PIL图像对象并使用Matplotlib库中的plt.imshow()函数显示彩色图像和灰度图像。最后我们使用PIL库中的Image.save()函数将灰度图像保存为文件。
import numpy as np
import cv2
from PIL import Image
import matplotlib.pyplot as plt# 读取彩色图像
img Image.open(image.jpg)# 将图像转换为数组
img_arr np.array(img)# 获取图像的高度和宽度
h, w, _ img_arr.shape# 创建一个新的数组用于保存灰度图像
gray_img np.zeros((h, w), dtypenp.uint8)# 遍历每个像素将三个通道的值求平均并保存到灰度图像中
for i in range(h):for j in range(w):gray_img[i, j] int(np.mean(img_arr[i, j]))# 将灰度图像转换为PIL图像对象
gray_pil_img Image.fromarray(gray_img)
plt.imshow(img)
plt.title(imge)
plt.axis(off)
plt.show()
plt.imshow(gray_pil_img, cmapgray)
plt.title(gray_pil_imge)
plt.axis(off)
plt.show()
# 保存灰度图像
gray_pil_img.save(gray_image.jpg)2. 直方图统计
使用PIL库中的Image.open()函数读取灰度图像并使用convert(L)方法将图像转换为灰度模式。然后我们获取图像的宽度和高度并创建一个长度为256的全0列表hist用于保存直方图统计结果。
接着遍历每个像素获取其灰度值并将对应的直方图计数器加1。最后我们输出直方图统计结果即每个灰度值出现的像素数。
# 读取灰度图像
gray_img Image.open(gray_image.jpg).convert(L)
width, height gray_img.size# 统计直方图
hist [0] * 256
for y in range(height):for x in range(width):pixel gray_img.getpixel((x, y))hist[pixel] 1
print(hist)
# 输出直方图统计结果
for i in range(len(hist)):print(灰度值 %d: %d 个像素 % (i, hist[i]))3. 绘制直方图
# 绘制直方图
plt.bar(range(256), hist)
plt.show()4. 直方图均衡化
使图片有更好的视觉效果有更高的对比度即像素的灰度分布更平均 首先我们使用PIL库中的histogram()函数对灰度图像进行直方图统计得到一个长度为256的列表equ_img其中每个元素表示对应灰度级别的像素数量。
接着我们创建一个空列表lut用于保存灰度级别的映射表。然后通过遍历equ_img列表将每个灰度级别的像素数量除以255得到一个步长step表示每个灰度级别在均衡化后的直方图中所占的比例。接下来我们定义一个变量n初始化为0用于记录当前累积的像素数量。
在内层循环中我们遍历256个灰度级别并将当前累积的像素数量除以步长step得到一个映射值n / step。这个映射值表示当前灰度级别在均衡化后的直方图中所对应的灰度级别。
最后我们使用PIL库中的point()方法根据映射表lut将灰度图像进行映射得到均衡化后的图像equ_img。在这里lut列表中的值被用作灰度级别的映射L参数表示输出图像的模式为灰度模式。
这样经过直方图均衡化处理后图像的灰度分布将更加均匀增强了图像的对比度和细节。
# 直方图均衡化
equ_img gray_img.histogram()
lut []
for b in range(0, len(equ_img), 256):step sum(equ_img[b:b256]) / 255n 0for i in range(256):lut.append(n / step)n equ_img[bi]
equ_img gray_img.point(lut, L)# 显示原始图像和均衡化后的图像
plt.imshow(gray_img, cmapgray)
plt.title(Original Image)
plt.axis(off)
plt.show()plt.imshow(equ_img, cmapgray)
plt.title(Equalized Image)
plt.axis(off)
plt.show()# 保存原始图像和均衡化后的图像
gray_img.save(Original.jpg)
equ_img.save(Equalized.jpg)# 统计均衡化后的直方图
hist_equ equ_img.histogram()# 绘制均衡化前后的直方图
plt.hist(gray_img.histogram(), 256, [0, 256])
plt.title(Original Image)
plt.xlim([0, 256])
plt.show()plt.hist(hist_equ, 256, [0, 256])
plt.title(Equalized Image)
plt.xlim([0, 256])
plt.show()二、自适应直方图均衡化
自适应直方图均衡化Adaptive Histogram Equalization是直方图均衡化的一种变体它考虑到图像中不同区域的局部差异。与直方图均衡化不同自适应直方图均衡化将图像分成多个小块并在每个小块内独立地应用直方图均衡化。通过这种方式自适应直方图均衡化可以更好地保留图像的细节并避免过度增强噪声。自适应直方图均衡化可以根据图像的局部特征自动调整每个小块的灰度级别以实现更精细的图像增强。
1.自适应直方图均衡化AHE
AHE是一种局部直方图均衡化方法它将图像分成若干个小区域对每个小区域进行直方图均衡化处理从而增强图像的对比度。该算法的核心思想是在每个小区域内计算直方图并将其变换为累积分布函数CDF然后将CDF拉伸以增加对比度。因此AHE可以有效地增强图像中的局部细节信息。 在此处我们的输入参数包括原始图像img和窗口大小window_size。首先函数遍历每个像素获取以该像素为中心的大小为window_size的窗口。如果窗口越界则跳过该像素。然后计算窗口的直方图并计算其累积分布函数。接着将CDF归一化并拉伸以增加窗口内像素的对比度。最后将均衡化后的像素值放回原图中得到均衡化后的结果。
# 自适应直方图均衡化AHE
def adaptive_histogram_equalization(img, window_size):# 获取图像大小height, width img.shape[:2]# 创建一个全黑的图像result np.zeros((height, width), dtypenp.uint8)# 遍历每个像素for i in range(height):for j in range(width):# 获取窗口中心点center_x, center_y i window_size // 2, j window_size // 2# 如果窗口越界则跳过if center_x window_size // 2 or center_x height - window_size // 2 or center_y window_size // 2 or center_y width - window_size // 2:continue# 获取窗口window img[center_x - window_size // 2:center_x window_size // 2 1, center_y - window_size // 2:center_y window_size // 2 1]# 计算窗口的直方图hist, _ np.histogram(window.ravel(), 256, [0, 256])# 计算累积分布函数cdf hist.cumsum()# 归一化cdf_normalized cdf * 255 / cdf[-1]# 将均衡化后的像素值放回原图中result[i][j] cdf_normalized[img[i][j]]return result2.限制对比度自适应直方图均衡化CRHE
CRHE是在AHE的基础上增加了对比度限制。它通过在AHE之后对像素值进行限制以避免过度增加对比度而导致噪声的出现。该算法的核心思想是先使用AHE增强图像的对比度然后使用限制对比度的方法对像素值进行截断从而控制对比度的增加。 在代码中输入参数包括原始图像img、窗口大小window_size和对比度限制因子clip_limit。首先调用自己实现的自适应直方图均衡化函数adaptive_histogram_equalization对原始图像进行直方图均衡化处理得到均衡化后的结果。接着使用OpenCV库中的cv2.createCLAHE函数创建一个限制对比度的CLAHE对象并将均衡化后的图像作为输入进行处理。
# 限制对比度自适应直方图均衡化CRHE
def contrast_limited_adaptive_histogram_equalization(img, window_size, clip_limit):# 使用自己实现的自适应直方图均衡化ahe_img adaptive_histogram_equalization(img, window_size)# 使用OpenCV库实现限制对比度自适应直方图均衡化clahe cv2.createCLAHE(clipLimitclip_limit, tileGridSize(window_size, window_size))result clahe.apply(ahe_img)return result3.读取图片
# 读取图片
img cv2.imread(image.jpg, cv2.IMREAD_GRAYSCALE)4.自适应直方图均衡化
首先创建一个与原始图像img相同大小的全黑图像ahe_result用于保存处理后的结果。然后使用一个循环遍历多个窗口尺寸依次调用自适应直方图均衡化函数adaptive_histogram_equalization对原始图像进行处理并将处理后的结果加到ahe_result中。最后得到多个尺寸的均衡化结果的平均值作为最终的均衡化结果。
我们使用了不同尺寸的窗口分别为50、100、150和200。最后将这四个结果取平均值作为最终结果这种方法可以提高均衡化的效果因为不同尺寸的窗口可以捕捉到图像中不同尺度的局部细节信息从而增强图像的对比度和细节信息避免过大或过小的窗口对结果产生较大影响。
# 自适应直方图均衡化
# 创建一个和原始图像大小相同的全零数组ahe_result用于存储最终的自适应直方图均衡化结果ahe_result np.zeros_like(img)# 遍历不同的窗口大小从50到200步长为50
for window_size in range(50, 201, 50):# 对原始图像img进行自适应直方图均衡化操作使用当前窗口大小window_sizeahe_img adaptive_histogram_equalization(img, window_size)# 将每次处理后的图像ahe_img累加到ahe_result中ahe_result ahe_img# 将ahe_result除以4取整得到最终的自适应直方图均衡化结果
ahe_result // 45.限制对比度自适应直方图均衡化
首先创建一个与原始图像img相同大小的全黑图像crhe_result用于保存处理后的结果。然后使用一个循环遍历多个窗口尺寸依次调用限制对比度自适应直方图均衡化函数对原始图像进行处理并将处理后的结果加到crhe_result中。在本例中设置对比度限制因子clip_limit为2.0。 我们使用了不同尺寸的窗口分别为50、100、150和200。最后将这四个结果取平均值作为最终结果避免过大或过小的窗口对结果产生较大影响。
# 限制对比度自适应直方图均衡化
# 创建一个和原始图像大小相同的全零数组crhe_result用于存储最终的限制对比度自适应直方图均衡化结果crhe_result np.zeros_like(img)# 遍历不同的窗口大小从50到200步长为50
for window_size in range(50, 201, 50):# 对原始图像img进行限制对比度自适应直方图均衡化操作使用当前窗口大小window_size和对比度限制参数2.0crhe_img contrast_limited_adaptive_histogram_equalization(img, window_size, 2.0)# 将每次处理后的图像crhe_img累加到crhe_result中crhe_result crhe_img# 将crhe_result除以4取整得到最终的限制对比度自适应直方图均衡化结果
crhe_result // 46.可视化显示结果
# 显示结果
fig, ax plt.subplots(nrows1, ncols3, figsize(12, 8))
ax[0].imshow(img, cmapgray)
ax[0].set_title(Original1 Image)
ax[1].imshow(ahe_result, cmapgray)
ax[1].set_title(AHE1 Image)
ax[2].imshow(crhe_result, cmapgray)
ax[2].set_title(CRHE1 Image)
plt.show()三、对比总结
直方图均衡化Histogram Equalization和自适应直方图均衡化Adaptive Histogram Equalization都是用于图像增强的技术目的是改善图像的对比度和视觉效果。它们的主要区别在于处理图像的方式和局部性。
直方图均衡化是一种全局的方法它基于整个图像的灰度直方图来调整像素的灰度值分布。通过使灰度级别在图像中更均匀地分布直方图均衡化可以增强图像的对比度和细节。它使用累积分布函数将原始图像中的灰度级别映射到一个新的灰度范围从而实现图像的均衡化。
然而直方图均衡化是一种全局的方法它没有考虑到图像中不同区域的局部差异。这可能会导致图像的某些区域过度增强或细节丢失的问题。为了解决这个问题自适应直方图均衡化应运而生。
自适应直方图均衡化是一种局部的方法在处理图像时会考虑到不同区域的灰度分布情况。它将图像分成许多小区域对每个区域独立地应用直方图均衡化。通过这种方式自适应直方图均衡化可以更好地保留图像细节并避免过度放大噪声。
自适应直方图均衡化的一种常见变体是自适应直方图均衡化CLAHE它在每个小区域中使用对比度限制来防止过度放大噪声。CLAHE的核心思想是将图像分成许多小块然后对每个小块进行局部直方图均衡化并对像素值进行裁剪以限制对比度的增强程度。通过这种方式CLAHE在增强图像细节的同时有效控制了噪声的增强。
总而言之直方图均衡化是一种全局的方法通过整个图像的灰度直方图来增强图像对比度。 而 自适应直方图均衡化是一种局部的方法通过对图像的小块进行独立的直方图均衡化来增强图像并通过对比度限制来控制噪声的放大。