从零开始学cv-6:图像的灰度变换


一,简介:

图像灰度变换涉及对图像中每个像素的灰度值执行数学运算,进而调整图像的视觉效果或突出其特定特征。作为一种基础的图像处理方法,灰度变换常用于图像的预处理和增强阶段。由于其独特的特性,灰度变换在工业领域中被广泛应用于缺陷检测、异常检测以及在恶劣环境下的图像重建等场景。
灰度变换的本质是根据特定的规则(即灰度映射函数)调整图像中每个像素的灰度值,以此来改变图像灰度的动态范围。根据灰度映射函数的不同性质,灰度变换可分为线性变换、分段线性变换和非线性变换。在非线性变换中,常见的类型包括对数变换、指数变换以及幂律变换(如n次幂、n次方根)。这些变换方法能够有效地改善图像质量,满足不同应用场景的需求。

二、图像的线性变换

线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。线性灰度变化对图像的每一个像素作线性拉伸,可以凸显图像的细节,提高图像的对比度。
线性灰度变换可以由以下公式描述 :
在这里插入图片描述
式中,D 为原始图像的灰度值,Dt 为线性灰度变换后的图像灰度值。
当 α = 1 , β = 0 时,保持原始图像不变
当 α = 1 , β > 0 ,图像的灰度值上移,灰度图像颜色发白(彩色图像颜色发亮)
当 α = 1 , β < 0时,图像的灰度值下移,灰度图像颜色发黑(彩色图像颜色发暗)
当 α > 1 ,图像的对比度增强
当 0 < α < 1 时,图像的对比度减小
当 α < 0 , β = 255时,图像暗区域变亮,亮区域变暗,图像求补
当 α = − 1 , β = 255时,图像的灰度值反转
可以这样理解参数的作用:参数 a 在灰度变换中起到了缩放像素值的作用,可以视为图像整体对比度的调整因子。当 a 大于1时,图像中所有像素的灰度值都会按照 a 的比例进行放大。这意味着原本灰度值较高的像素在放大后将变得更加明亮,而原本灰度值较低的像素虽然也有所增加,但增加的幅度相对较小。这样的操作会增强图像的对比度,使得明暗差异更加明显,从而拉伸图像的对比度范围。
参数 β 则是图像灰度值的偏移量,它通过在每个像素的灰度值上加上 β 值,实现了图像的整体亮度的提升或降低。当 β 为正值时,图像的整体亮度会增加,使得图像看起来更亮,即发白;相反,当 β 为负值时,图像的整体亮度会降低,使得图像看起来更暗,即发黑。因此,β 参数可以用来调整图像的亮度,使图像更适合特定的显示需求或视觉效果。

三、分段线性变换

分段线性变换是一种常见的图像处理技术,它通过将图像的灰度范围分割成几个不同的区间,并对每个区间分别应用不同的线性变换来调整图像的亮度和对比度。这种变换的灵活性使得它能够针对图像的不同部分进行精确的调整。
分段线性变换函数可以增强图像各部分的反差,增强感兴趣的灰度区间、抑制不感兴趣的灰度级。
分段线性函数的优点是可以根据需要拉伸特征物的灰度细节,一些重要的变换只能用分段函数来描述和实现,缺点则是参数较多不容易确定。
公式为:
在这里插入图片描述
变换步骤

  1. 确定区间:根据图像的特点和需求,确定需要划分的灰度区间。例如,可以将图像的灰度范围分为三个部分:低灰度区间、中灰度区间和高灰度区间。
  2. 设置变换函数:为每个区间设置一个线性变换函数。这些函数的参数(斜率和截距)需要根据具体的需求来确定,以实现不同的图像增强效果。
  3. 应用变换:对图像中的每个像素,根据其灰度值所属的区间,应用相应的线性变换函数。

简单概述为,分段线性变换与线性变换相似,唯一的区别就是加了像素值范围判定,即在不同的像素值区间执行不同的线性变换.

四,非线性变换

4.1 对数变换

对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率小。对数变换将输入中范围较窄的低灰度值映射为范围较宽的灰度级,输入中的高灰度值则被映射为范围较窄的灰度级。对数变换后,较暗区域的对比度提升,可以增强图像的暗部细节,简而言之是对图像中低灰度细节进行增强
公式:
在这里插入图片描述
曲线为:
在这里插入图片描述

4.2 Gamma变换

Gamma校正多用在图像整体偏暗,扩展灰度级。另外一种情况是,图像有“冲淡”的外观(很亮白)需要压缩中高以下的大部分的灰度级。伽马变换本质上是对图像矩阵中的每个值进行幂运算。0< γ <1时,拉伸图像中灰度级较低的区域,压缩灰度级较高的部分,增加图像的对比度;γ>1 时,拉伸图像中灰度级较高的区域,压缩灰度级较低的部分,降低图像的对比度。
伽马变换通过非线性变换对人类视觉特性进行补偿,最大化地利用有效的灰度级带宽。很多拍摄、显示、打印设备的亮度曲线都符合幂律曲线,因此伽马变换广泛应用于各种设备显示效果的调校,称为伽马校正。

公式为:
在这里插入图片描述
曲线为:
请添加图片描述
伽马变换的曲线形状由伽马值 γ 决定,当 γ < 1 时,虽然也是增强暗部,但其效果和对数变换不同,对数变换的增长速度随输入值的增加而减慢,而伽马变换的增长速度是一致的。
与对数变换不同的是伽马变换是对整体灰度值进行改变,所以说如果想要对光照条件较好的阴影部分进行校正,使用对数变换较好,如果是对光照情况较差,整体像素全部偏暗或偏亮,则用伽马变换效果较好。
实现代码:

import cv2
import numpy as np

# 图像灰度变换

def nonlinear_logarithm_transform(img_gray, c):  # 对数变换
    result = c * np.log(1.0 + img_gray)
    # uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255
    # 这里要转换成unit8,否则会报错
    result = np.uint8(result)
    return result


def gamma_bianhuan(image,gamma):  # gamma 变换
    image=image/255.0
    New=np.power(image,gamma)
    return New



img = cv2.imread(r"E:\PS\2.png")  # 读取彩色图像(BGR)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 颜色转换:BGR(OpenCV) -> Gray
h, w = img.shape[:2]  # 图片的高度和宽度
img1 = img.copy()
img2 = img.copy()
# Dt[i,j] = alfa*D[i,j] + beta
alfa1, beta1 = 3, 50

alfa2, beta2 = 3, 50

for i in range(h):
    for j in range(w):
        img1[i][j] = min(255, max((alfa1*imgGray[i][j] + beta1), 0))   # 线性变换
        if imgGray[i][j] < 100:
            img2[i][j] = min(255, max((alfa2 * imgGray[i][j] + beta2), 0))   # 分段线性变换

img3 = nonlinear_logarithm_transform(imgGray,40)
img4 = gamma_bianhuan(imgGray,0.4)
cv2.imshow("liner",img1)
cv2.imshow("liner2",img2)
cv2.imshow("log",img3)
cv2.imshow("gam",img4)
cv2.waitKey(0)

五,效果:

线性变换:
在这里插入图片描述
分段线性变换:
在这里插入图片描述
对数变换:‘
在这里插入图片描述

伽马变换:
在这里插入图片描述

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值