图像处理:灰度变换与图像增强

本文详细介绍了灰度图像的概念及其在图像处理中的重要性,探讨了灰度变换的四种常见算法:对数变换、指数变换、gamma变换和直方图均衡化。通过对这些变换的数学公式和实际效果的展示,揭示了它们如何增强图像的对比度和细节,特别是在低光照区域的表现。此外,还提供了相应的Python代码实现,便于读者理解和应用。
摘要由CSDN通过智能技术生成

目录

一,何为灰度图像?

二,何为灰度变换?

三,灰度变换算法总结

①,对数变换

 ②,指数变换

③ gamma变换 

④ 直方图均衡化


一,何为灰度图像?

定义:RGB三色只有一种采样的图片,由白色到黑色按比例分成不同的灰度等级,在物体的边缘呈现灰度的不连续性,图像分割就是基于这个原理。灰度就是没有色彩,RGB色彩分量全部相等。如果是一个二值灰度图象,它的象素值只能为0或1,我们说它的灰度级为2。用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

二,何为灰度变换?

定义:将一个像素点的灰度值按照算法数学公式转换成一个新的灰度值,使原来图像的某些部分区域特征增强,使图片变清晰。

三,灰度变换算法总结

①,对数变换

由对数的函数图像可知,对数变换提升低亮区域,压缩高亮区域,使低亮区域的特征更加突出明显

公式:

 C :常量  src:原图像

原图像 

 变换后的图像

 通过上图我们发现 原本暗淡的礁石变得明亮清晰起来,树丛中的阴影也少了许多

代码:

def logGray(img, c, showPlt):
    newImg = c * np.log(1.0 + img)
    if showPlt:
        x = np.arange(0, 256, 0.01)
        y = c * np.log(1 + x)
        plt.plot(x, y, 'r', linewidth=1)
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.title(u'对数变换函数')
        plt.xlim(0, 255), plt.ylim(0, 255)
        plt.show()
    newImg = np.uint8(newImg)
    return newImg

 ②,指数变换

由指数函数可知,图片低亮度区域将被压缩,高亮度区域将被扩展

公式:

原图像

变换后的图像

 

 代码:

def indexGray(img, c, b, a, showPlt):
    newImg = np.array(b ** (c * (img - a)) - 1,dtype=np.uint8)
    if showPlt:
        x = np.arange(0, 256, 0.01)
        y = b ** (c * (x - a)) - 1
        plt.plot(x, y, 'r', linewidth=1)
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.title(u'指数变换函数')
        plt.xlim(0, 255), plt.ylim(0, 255)
        plt.show()
    return newImg

③ gamma变换 

Gamma变换用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

 gamma>1, 较亮的区域灰度被拉伸,较暗的区域灰度被压缩的更暗,图像整体变暗;
gamma<1, 较亮的区域灰度被压缩,较暗的区域灰度被拉伸的较亮,图像整体变亮;

公式:

 代码:

def gammaGray(img, c, r, showPlt):
    newImg = c * img ** r
    lut = np.zeros(256, dtype=np.float32)
    for i in range(256):
        lut[i] = c * i ** r
    output_img = cv2.LUT(img, lut)
    output_img = np.uint8(output_img + 0.5)
    if showPlt:
        x = np.arange(0, 256, 0.01)
        y = c * x ** r
        plt.plot(x, y, 'r', linewidth=1)
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.title(u'gamma变换函数')
        plt.xlim(0, 255), plt.ylim(0, 255)
        plt.show()
    return output_img

④ 直方图均衡化

直方图均衡化增加图像的全局对比,直方图均值化,将低灰度值归并,高灰度值拉伸,当一个图像灰度分布均匀时,图像的整体细节与质量会提升很多

公式:

公式推导:

推导截图源自 直方图均衡化_schwein_van的博客-CSDN博客_直方图均衡化 该大佬博客

步骤:(以灰度深度8为例)

1,统计每个阶级灰度值的数量

2,计算每个阶级灰度值出现的概率 p\left ( r \right ) = sum(r)/img.size

3,将每个概率的灰度值以前缀和的形式累加 P(i) = \sum_{n}^{i}p(i)

4,将图片代入计算,p[x,y]*img[x,y]

原图

变换后的图像

 可以明显的发现,太阳表面的光斑纹理更加清晰

代码:

def histogramEqualization(img, RGB=True):
    newImg = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
    N = img.shape[0] * img.shape[1]
    BGR = np.zeros((3, 256), dtype=np.float)
    for i in range(0, img.shape[0]):
        for j in range(0, img.shape[1]):
            BGR[0][img[i][j][0]] += 1
            BGR[1][img[i][j][1]] += 1
            BGR[2][img[i][j][2]] += 1
    Pr = BGR / N
    Ps = np.zeros((3, 256), dtype=np.float)
    for i in range(0, 256):
        if i == 0:
            Ps[:, i] = Pr[:, i]
        else:
            Ps[:, i] += Ps[:, i - 1] + Pr[:, i]
    for i in range(0, img.shape[0]):
        for j in range(0, img.shape[1]):
            b, g, r = img[i, j, :]
            newImg[i][j] = [round(Ps[0][b] * 255), round(Ps[1][g] * 255), round(Ps[2][r] * 255)]

    otherImg = cv2.equalizeHist(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
    return newImg, otherImg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值