图像处理 ——几种图像增强技术
- 前言
- 一、几种图像增强技术
- 1.直方图均衡化
- 2.直方图适应均衡化
- 3.灰度变换
- 4.同态滤波
- 5.对比拉伸
- 6.对数变换
- 7.幂律变换(伽马变换)
前言
图像增强是指通过各种算法和技术,改善或提高数字图像的质量、清晰度、对比度、亮度、颜色等方面的处理过程。它可以通过调整图像的像素值来改善图像的可视化效果,使图像更易于观察和分析。图像增强广泛应用于医学影像诊断、监控、遥感、数字图像处理等领域。常见的图像增强方法包括灰度拉伸、直方图均衡化、滤波、锐化、颜色增强等。
一、几种图像增强技术
1.直方图均衡化
想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。
代码如下
# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread('gray.png', 0)
#=============================直方图均衡化==========================
equ = cv2.equalizeHist(img)
2.直方图适应均衡化
直方图适应均衡化(CLAHE)是数字图像处理中用于增强图像对比度的一种技术。它可以将原始图像中局部对比度较低的区域的像素值映射到一个更广的范围内,从而提高图像的整体对比度。
CLAHE算法可以有效地增强图像的对比度,尤其适用于图像中存在大范围灰度变化的情况下。但是,CLAHE算法也存在一些问题,如对于纹理复杂的图像(如自然场景图片)可能会产生可见的块状伪影等。因此在实际应用中还需要结合其他技术进行综合处理。
代码如下
#=============================直方图适应均衡化==========================
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(16,16))
"""
该函数包含以下参数:
clipLimit: 用于控制直方图均衡化的局部对比度,值越高,越容易出现失真和噪声。建议值为2-4,若使用默认值0则表示自动计算。
tileGridSize: 表示每个块的大小,推荐16x16。
tileGridSize.width: 块的宽度。
tileGridSize.height: 块的高度。
函数返回一个CLAHE对象,可以通过该对象调用apply函数来实现直方图均衡化。
"""
cl1 = clahe.apply(img)
3.灰度变换
灰度变换的基本思想是将灰度值在某个范围内的像素值通过某种函数关系映射到另一个范围内的像素值。常见的灰度变换函数有对数变换、幂变换、反转变换等。具体的变换函数的选择取决于实际应用中需要增强的目标属性。
代码如下
#=============================灰度变换==========================
# 通过将像素值映射到新的范围来增强图像的灰度
min_gray = 0 # 新的最小灰度值
max_gray = 255 # 新的最大灰度值
gray_img_enhanced = cv2.convertScaleAbs(img, alpha=(max_gray-min_gray)/255, beta=min_gray)
4.同态滤波
同态滤波是一种常用的图像增强技术,它能够增强图像的低频信息,同时抑制高频信息。同态滤波的本质是利用了信号的对数域与频率域之间的对应关系,将原图像分解成低频与高频两部分,对低频进行增强,对高频进行抑制,然后再将两部分合并起来得到增强后的图像。
同态滤波可以用以下公式表示:
H ( u , v ) = γ H − γ L ( 1 − e − c ( D 2 ( u , v ) D 0 2 ) ) H(u,v) = \gamma_H - \gamma_L(1-e^{-c(\frac{D^2(u,v)}{D_0^2})}) H(u,v)=γH−γL(1−e−c(D02D2(u,v)))
其中, H ( u , v ) H(u,v) H(u,v) 是频域中的同态滤波函数, D ( u , v ) D(u,v) D(u,v) 表示频率域中点 ( u , v ) (u,v) (u,v) 到图像中心的距离, D 0 D_0 D0 是频率域中的截止频率, c c c 是控制增益的参数, γ H \gamma_H γH 和 γ L \gamma_L γL 分别是高频增益和低频衰减系数。
同态滤波的具体步骤如下:
1.将原图像转换到对数域。
2.对转换后的图像进行离散傅里叶变换,得到频率域的图像。
3.根据上述公式计算同态滤波函数 H ( u , v ) H(u,v) H(u,v)。
4.将 H ( u , v ) H(u,v) H(u,v) 与频率域的图像相乘,得到增强后的频率域图像。
5.对增强后的频率域图像进行反傅里叶变换,得到增强后的图像。
同态滤波技术主要应用于图像的增强、去噪、颜色校正、图像分割等领域。它可以有效地增强低光度图像、消除背景噪声等问题,并且能够适用于各种类型的图像,具有广泛的应用前景。
代码如下
#=============================同态滤波==========================
gray = cv2.bilateralFilter(img, 15, 75, 75)
# 对数变换和傅里叶变换
H, W = gray.shape
gray_log = np.log(gray+1)
gray_fft = np.fft.fft2(gray_log)
# 设置同态滤波器参数
c, d, gamma_L, gamma_H, gamma_C = 1, 10, 0.2, 2.5, 1
# 构造同态滤波器
u, v = np.meshgrid(range(W), range(H))
Duv = np.sqrt((u-W/2)**2 + (v-H/2)**2)
Huv = (gamma_H - gamma_L) * (1 - np.exp(-c*(Duv**2)/(d**2))) + gamma_L
Huv = Huv * (1 - gamma_C) + gamma_C
# 进行频域滤波
gray_fft_filtered = Huv * gray_fft
gray_filtered = np.fft.ifft2(gray_fft_filtered)
gray_filtered = np.exp(np.real(gray_filtered))-1
# 转为uint8类型
gray_filtered = cv2.normalize(gray_filtered, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
5.对比拉伸
对比拉伸称为归一化,用于拉伸强度值的范围以提高图像的对比度。Python/OpenCV 可以通过使用 min_max 归一化的 cv2.normalize() 方法进行对比度拉伸。
代码如下
#=============================对比拉伸==========================
norm_img1 = cv2.normalize(img,None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
# scale to uint8
norm_img1 = (255 * norm_img1).astype(np.uint8)
6.对数变换
对数变换用于将图像的每个像素值替换为其对数值,以增强较低强度值的对比度。它有助于缩小较亮的像素值范围并扩大暗像素。当需要减少图像的偏度分布以获得更好的解释时,可以应用此转换。
代买如下
#=============================对数变换==========================
# Apply log transformation method
c = 255 / np.log(1 + np.max(img))
log_image = c * (np.log(img + 1))
# Specify the data type so that
# float value will be converted to int
log_image = np.array(log_image, dtype=np.uint8)
7.幂律变换(伽马变换)
幂律变换用于从较亮图像到较暗图像突出显示对象,可以通过以下表达式使用:s = c × r^ γ ,其中 s 和 r 分别是输出和输入图像的像素值,c 是常数值,γ称为伽马值。为了减少不同强度值的计算机显示器显示问题,在此转换中使用了不同的伽马值
代买如下
#=============================幂律变换(伽马变换)==========================
# Apply Gamma=0.4 on the normalised image and then multiply by scaling constant (For 8 bit, c=255)
gamma_point_eight = np.array(255 * (img / 255) ** 0.8, dtype='uint8')
希望你喜欢阅读这篇文章,希望它能帮助你了解不同类型的图像增强技术。