2.1 Python图像的空域增强处理-灰度映射

2.1 Python图像的空域增强处理-灰度映射


空域增强处理,包括给定变化曲线的灰度映射(求反、动态范围压缩、阶梯量化、阈值分割)、图像的算术运算(加法、平均法消除噪声、减法)、直方图修正(直方图均衡化、直方图规定化)、空域滤波(线性平滑滤波器、线性锐化滤波器、非线性平滑滤波器、非线性锐化滤波器)。

1 算法原理

灰度映射是一种基于图像像素的点操作,图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度线性变换的计算公式如下所示:

image-20210707095549076

1)求反就是将像素点的颜色变成与原先相反的颜色,这里的“相反”指的是用色彩值的最高值 255 减去原先的色彩值。

求反,灰度s根据映射曲线映射为t的公式:

​ t = L–1–s

2)动态范围压缩。传统显示设备所能显示的场景、视频和图像通常受限于硬件设备,通常只能表达出很小一部分的亮度范围,比如如常见的 8 比特图像显示 0 到 255 的整数范围,因此为了能够显示高动态范围的影响,需要实现从高动态范围图像(HDR)到低动态范围图像(LDR)的映射,并且不同显示设备的出现,需要实现 HDR 和之间的相互转换 ,即动态范围压缩(DRC,Dynamic Range Compression)。实现动态范围压缩有许多种算法,比如线性移位算法、对数映射算法、分段函数映射算法、自适应性对数映射算法、高动态范围图像可视化算法。

线性移位算法是最简单的 DRC 算法,它将以 n 比特整数表示的 HDR 图像直接右移(n—m)个比特得 m(m<n)比特整数的 LDR 图像。对数映射算法是以 2 为底,将数值区间[0,2^n ]对数化到区间[0,n],然后再线性变换到区间[0,2^m] 。对数变换:S = c * log(1+r);log(1+r)函数为正值,系数 c 保证了 S 属于[0, L-1]。

3)阶梯量化。阶梯量化算法将图像灰度分阶段量化成较少的级数,获得数据量压缩的效果,量化函数图形如下所示:

image-20210707095838931

本实验将映射函数分每个阶段代表相应的以 64 为倍数的灰度值,0-63 对应值为 0,64-127 对应值为 64,128-191 对应值为 128,其他值对应为 192。

4)图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。难点在于如何选择一个合适的阈值实现较好的分割。

当 T 是一个适用于整个图像的常数时,该公式给出的处理成为全局阈值处理;

当 T 值在一副图像上改变时,称为可变阈值处理;

当 T 取决于空间坐标 x, y 本身的时候,则可变阈值处理称为动态阈值处理。

当 f(x,y)大于阈值 T 时,其g(x,y)为 1,表示白色;当 f(x,y)小于或等于阈值 T 时,其 g(x,y)值为 0,表示黑色。

2 代码

运行代码说明

1.要改变代码中的地址

更改put(path)函数中的路径put(r'../image/image1.jpg')

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

import numpy as np
import cv2
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


def put(path):
    img = cv2.imread(path, 1)
    # 求反
    rev_img = 255 - np.array(img)
    # 动态范围压缩
    log_img = np.uint8(42 * np.log(1.0 + img))
    # 阶梯量化
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    step_img = np.zeros((img2.shape[0], img2.shape[1]))
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            if img2[i, j] < 64:
                step_img[i,j] = 0
            elif img2[i, j] < 128:
                step_img[i,j] = 64
            elif img2[i, j] <192:
                step_img[i, j] = 128
            else:
                step_img[i,j] = 192

    # 阈值分割
    threshold_img = cv2.adaptiveThreshold(img2, 114, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    # 画图
    fig = plt.figure(figsize=(10,7))

    ax5 = fig.add_subplot(231)
    ax5.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax5.set_title('原图')

    ax1 = fig.add_subplot(232)
    ax1.imshow(cv2.cvtColor(rev_img, cv2.COLOR_BGR2RGB))
    ax1.set_title('求反')

    ax2 = fig.add_subplot(233)
    ax2.imshow(cv2.cvtColor(log_img, cv2.COLOR_BGR2RGB))
    ax2.set_title('动态范围压缩')

    ax6 = fig.add_subplot(234)
    ax6.imshow(img2, cmap='gray')
    ax6.set_title('灰度图')

    ax3 = fig.add_subplot(235)
    ax3.imshow(step_img,cmap='gray')
    ax3.set_title('灰度图阶梯量化')

    ax4 = fig.add_subplot(236)
    ax4.imshow(threshold_img,cmap='gray')
    ax4.set_title('灰度图阈值分割')

    # plt.savefig('1.newimage1.jpg')
    plt.show()

# 处理函数,要传入路径
put(r'../image/image1.jpg')

3 效果

image-20210707100901338

image-20210707100914325

image-20210707100926164

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值