• Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)



    改善图像质量的方法:
    图像增强(Image Enhancement):不考虑图像降质的原因,选择性增强图像中的兴趣特征、或者抑制图像中某些不需要的特征(如亮度、对比度、边缘、轮廓等),以便显示、观察或分析。
    图像复原(ImageRestoration):针对降质的具体原因,设法补偿降质因素,使得改善后的图像尽可能逼近理想图像。

    在这里插入图片描述

    2.1 图像的亮度、对比度和动态范围

    2.1.1 亮度

    通常指图像的整体亮度。每个像素的明暗程度取决于其颜色分量或灰度值的大小图像的整体亮度则取决于所有像素的平均值。
    简单地将图像每个像素的灰度值加上一个常数,就可以改变图像整体的亮度:
    g(x,y) = f(x,y) + b;
    b>0,图像整体变亮;b<0,图像整体变暗;
    当灰度变换函数与像素位置无关时,可以用变量r、s分别表示输入、输出图像中任一像素的灰度值
    s = r + b
    示例: 改变图像亮度

    % 2.1.1改变图像亮度
    clear;
    clc;
    i = imread('lena.jpg');
    i1 = rgb2gray(i);   % 获取灰度图像
    % imshow(i1)  
    b=100;
    g= i1 +b;
    %显示结果
    %figure(1),imshow(i1);title('原图像');
    %figure(2),imshow(g);title('亮度改变后的图像');
    figure; montage({i1,g});title('左侧为原始image|右侧为亮度改变后的图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述需要注意的是,MATLAB中灰度图像数据多采用无符号8位整数类型(uint8),取值范围在[0,255]之间,运算时MATLAB将自动把小于0或大于255的计算结果分别限制为0或255。

    2.1.2 对比度

    对比度用于描述图像中不同区域、物体之间的可区分性
    对比度的高低取决于图像中明、暗区域之间的差别,即亮度的反差大小。反差越大意味着对比度越大,反差越小则对比度越小。
    图像对比度的简单调整
    将图像所有像素的灰度值乘以常数a,就可以简单地增加或缩小像素灰度值之间的差距,从而改变图像的对比度,即:
    在这里插入图片描述
    a>1,对比度增强;a< 1,对比度降低。

    示例:改变灰度图像的对比度

    % 2.1.2 改变图像对比度
    clear;
    clc;
    i = imread('lena.jpg');
    i1 = rgb2gray(i);   % 获取灰度图像
    % imshow(i1)  
    a = 0.5;
    g = i1* a;
    %显示结果
    figure; montage({i1,g});title('左侧为原始image|右侧为对比度改变后的图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    2.1.3 动态范围

    一幅图像像素灰度值所跨越的值域,称为该图像灰度值的动态范围,像素的明暗变化被限制在这个范围内。动态范围越大,变化层次越多,图像细节的表达能力也就越强。对于8位256级灰度图像而言,图像像素灰度值最大的动态范围为[0,255]。

    在这里插入图片描述

    2.2 线性灰度变换

    线性灰度变换的一般表达式: s = a*r + b

    2.2.1 具有饱和处理的线性灰度变换

    令rlow和rhigh表示输入图像灰度值有效动态范围的下限值和上限值,slow和shigh表示输出图像期望动态范围的下限值和上限值,利用下式可将输入图像的有效动态范围[rlow,rhigh]线性映射为[slow,shigh]

    在这里插入图片描述
    如果slow和shigh 之差 > rlow和rhigh 之差 图像动态范围扩展(对比度拉伸);
    如果slow和shigh 之差 < rlow和rhigh 之差 图像动态范围压缩(对比度收缩)

    如何选取?
    采用百分位数(percentile)来选择rlow和rhigh,比如,选择rlow的值,使得输入图像中灰度值 ≤ rlow的像素数占图像总像素数的1%;选择rhigh的值,使得输入图像中灰度值 ≥ rhigh的像素数占图像总像素数的1%; 对于8位 256级的灰度图像,通常 slow = 0,shigh = 255。
    示例:具有饱和处理的线性灰度变换

    % 2.2.1  具有饱和处理的线性灰度变换
    clear;
    clc;
    i = imread('lena.jpg');
    i1 = rgb2gray(i);   % 获取灰度图像
    % imshow(i1)  
    g=imadjust(i1);%函数默认方式采用百分位数0.01选择rlow和rhigh
    rlow=min(min(double(i1)))/255;%令rlow为输入图像中的最小灰度值
    rhigh=max(max(double(i1)))/255;%令rhigh为输入图像中的最大灰度值
    g1=imadjust(i1,[rlow;rhigh],[]);%[low_out;high_out]采用默认值
    %显示处理结果
    subplot(2,3,1); imshow(i1);title('原图像');
    subplot(2,3,2); imshow(g);title('默认百分位数选择rlow和rhigh');
    subplot(2,3,3); imshow(g1);title('采用图像最小、最大灰度值');
    subplot(2,3,4); imhist(i1);title('原图像');
    subplot(2,3,5); imhist(g);title('默认百分位数方式');
    subplot(2,3,6); imhist(g1);title('采用图像最小、最大灰度值');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    在这里插入图片描述

    2.2.2 分段线性灰度变换

    选择输入灰度值的一个区间范围[r1,r2],以及输出灰度值的一个区间范围[s1,s2],这样由(r1,s1)和(r2,s2)两个拐点,加上(0,0)、(255,255)两个定点,构造了一个三段折线变换曲线。
    在这里插入图片描述
    改变拐点(r1,s1)和(r2,s2)的位置,可以控制分段直线的斜率,就能对任意灰度区间进行扩展和压缩。

    示例: 分段线性灰度变换

    % 2.2.2  分段线性灰度变换
    clear;
    clc;
    i = imread('daisy.jpg');
    f = rgb2gray(i);
    %设置控制点位置
    r1=double(min(f(:)));r2=double(max(f(:)));
    s1=40;s2=240;    % 改变拐点(r1,s1)(r2,s2)的位置,可以控制分段直线的斜率,就能对任意灰度区间进行扩展和压缩。
    %调用自定义变换函数
    [g,lut]=IMpwlineartransform(f,r1,s1,r2,s2);
    %显示处理结果
    figure;subplot(3,2,1);imshow(f);title('Original image');
    subplot(3,2,2);imhist(f);title('Histogram of the Original image');
    subplot(3,2,3);imshow(g);title('Processed image');
    subplot(3,2,4);imhist(g);title('Histogram of the processed image');
    subplot(3,2,6);plot(lut);title('The gray transform function curve');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    2.2.3 连续单独或同时调整图像的亮度和对比度

    s = [ r - 127.5 * ( 1 - b ) * k + 127.5 * ( 1 + b) ]
    其中, k = tan( 45° + 44° * c )

    % 2.2.3 连续调整图像的亮度和对比度
    clear;
    clc;
    i = imread('lena.jpg');
    f = rgb2gray(i); % 获取灰度图像
    %将输入图像数据转换为double型
    fd=double(f);
    %降低亮度,同时提高对比度  
    %b<0,降低亮度;b>0,提高亮度。  参数b在区间[-1,1]内取值
    %c<0,降低对比度;c>0,提高对比度。  参数c在区间[-1,1]内取值
    b=-0.25;c=0.45;k=tand(45+44*c);
    g=(fd-127.5.*(1-b))*k+127.5*(1+b);
    g=uint8(g);%将输出图像数据类型转换为uint8型
    %显示处理结果
    figure;montage({f,g});title('原图像(左)|亮度降低25%对比度提高45%后的图像(右)');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    2.3 非线性灰度变换

    在这里插入图片描述

    2.3.1 伽马变换

    伽马变换Gamma Transformation,又称伽马校正Gamma Correction、幂次变换Power law transformation,定义为:

    在这里插入图片描述式中,指数 g 称伽马值,这也是被称作伽马变换的由来。为保证输入灰度值 r 和输出灰度值 s 具有相同的取值范围,变换时需先将输入灰度值 r 从[0,255]归一化到 [0,1],变换后再把输出灰度值s从 [0,1] 线性映射到 [0,255] 之间。

    2.3.2 对数变换

    对数变换常用于图像的动态范围压缩,能扩展低端暗区域像素灰度值的动态范围、压缩高端亮区域像素灰度值的动态范围。常用于压缩动态范围过大而不能正常显示的图像,或增强暗背景中仅有若干亮点的图像。
    在这里插入图片描述
    常用于压缩动态范围过大而不能正常显示的图像,或增强暗背景中仅有若干亮点的图像。

    2.3.3 指数变换

    指数变换能增强图像中亮区域的细节(对比度提高),同时弱化图像中暗区域的细节(对比度降低)。指数变换对数变换。

    在这里插入图片描述

    式中,参数k用来选择灰度变换曲线的形状,一般在略大于1附近取值。c 是一个比例因子,若输出图像采用8位无符号整数时,c 可按给定式计算,其中,rmax为输入图像 f(x,y) 的最大灰度值。

    2.4 直方图

    灰度直方图反映了图像中各灰度值出现的频数,根据灰度值分布的范围和均匀程度,就可以判断出该图像曝光是否合适。
    频数分布表与直方图
    在这里插入图片描述
    图像直方图、动态范围、亮度、对比度
    在这里插入图片描述
    累积直方图,又称累计直方图(Cumulative histogram),用于统计图像中像素灰度值小于和等于某一灰度值r的所有像素的总和。
    imhist 函数调用语法
    在这里插入图片描述
    示例 计算灰度直方图

    % 2.4 灰度直方图的计算
    clear;
    clc;
    i = imread('lena.jpg');
    f = rgb2gray(i); % 获取灰度图像
    %获取图像高、宽
    [M,N]=size(f);
    %计算并显示灰度直方图
    imhist(f);
    [counts,binLocations]=imhist(f);
    CHist=cumsum(counts);%计算频数累积直方图
    Rcounts=counts./(M*N);%直方图归一化
    RCHist=cumsum(Rcounts);%计算相对频数累积直方图
    %显示处理结果
    figure;subplot(2,3,1);imshow(f);title('输入图像');
    subplot(2,3,2);stem(binLocations,counts,'Marker','none');title('频数直方图');
    subplot(2,3,3);stem(binLocations,CHist,'Marker','none');title('频数累积直方图');
    subplot(2,3,4);stem(binLocations,Rcounts,'Marker','none');title('相对频数直方图');
    subplot(2,3,5);stem(binLocations,RCHist,'Marker','none');title('相对频数累积直方图');
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    2.5 直方图均衡化

    图像直方图均衡化,是指寻找一个灰度变换函数,使变换后图像的像素值占有全部的灰度级并且分布均匀,从而得到一幅灰度级丰富且动态范围大的图像。

    2.5.1 直方图均衡化基本步骤

    1. 计算输入图像的归一化直方图: h(r) = nr/n, r=0,1,2,...,L-1
    2. 计算图像的相对频数累积分布函数H®,将其作为灰度变换函数:
      在这里插入图片描述
    3. 由于H®在[0,1]之间取值,因此,需将其重新量化为[0,L-1]之间的整数,得到输入r与输出s之间的映射关系,即:
      在这里插入图片描述
      Int() 表示取整
    4. 采用查表法对输入图像执行灰度变换。
      示例 灰度图像直方图均衡化
    % 2.5 灰度图像直方图均衡化
    clear;
    clc;
    i = imread('kid.jpg');
    f = rgb2gray(i); % 获取灰度图像
    [g,LUT]=histeq(f);%对图像进行直方图均衡化
    [histarray_old,binLocations1]=imhist(f);%计算原图像直方图
    [histarray_new,binLocations2]=imhist(g);%计算均衡化后的图像直方图
    %显示处理结果
    figure;subplot(2,2,1);imshow(f);title('原始图像');
    % 绘制原始灰度图像的直方图
    subplot(2,2,2);stem(binLocations1,histarray_old,'Marker','none');title('原图像直方图');
    
    subplot(2,2,3);imshow(g);title('处理后的图像');
    % 绘制直方图均衡化后灰度图像的直方图
    subplot(2,2,4);stem(binLocations2,histarray_new,'Marker','none');title('直方图均衡化后的直方图');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    灰度图像直方图均衡化函数 histeq()
    在这里插入图片描述

    2.5.2 对比度受限自适应直方图均衡化CLAHE

    实际应用中,常常需要增强图像中某些局部区域细节,为此提出了自适应直方图均衡化方法(AHE,AdaptiveHistogramEqualization),对每个像素基于其大小为 m×n 邻域图块的灰度直方图进行均衡化,或把图像被划分为若干个大小相等的矩形网格图块,并对图块分别进行直方图均衡化。

    % 2.5  对比度受限自适应直方图均衡化CLAHE
    clear;
    clc;
    i = imread('drops.jpg');
    f = rgb2gray(i); % 获取灰度图像
    [g,LUT]=histeq(f);%对图像进行直方图均衡化
    %对比度受限自适应直方图均衡化CLAHE
    G =adapthisteq(f,'clipLimit',0.03);
    [histarray_old,binLocations1]=imhist(f);%计算原图像直方图
    [histarray_new1,binLocations2]=imhist(g);%计算均衡化后的图像直方图
    [histarray_new2,binLocations3]=imhist(G);%计算均自适应直方图均衡化的图像直方图
    %显示处理结果
    figure;subplot(3,2,1);imshow(f);title('原始图像');
    % 绘制原始灰度图像的直方图
    subplot(3,2,2);stem(binLocations1,histarray_old,'Marker','none');title('原图像直方图');
    
    subplot(3,2,3);imshow(g);title('直方图均衡化');
    % 绘制直方图均衡化后灰度图像的直方图
    subplot(3,2,4);stem(binLocations2,histarray_new1,'Marker','none');title('直方图均衡化后的直方图');
    
    subplot(3,2,5);imshow(G);title('自适应直方图均衡化');
    % 绘制直方图均衡化后灰度图像的直方图
    subplot(3,2,6);stem(binLocations3,histarray_new2,'Marker','none');title('自适应直方图均衡化的直方图');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    2.6 直方图匹配

    直方图匹配,目的是寻找一个灰度变换函数,使得处理之后图像的直方图,与指定的灰度直方图相同(相匹配)。由于灰度直方图为离散量,这种匹配只是一种近似。
    灰度图像直方图匹配函数 imhistmatch()
    在这里插入图片描述
    在这里插入图片描述
    示例:直方图匹配 histeq()

    % 2.6   直方图匹配 histeq
    clear;
    clc;
    i = imread('man.jpg');
    f = rgb2gray(i); % 获取灰度图像
    
    i1 = imread('kid.jpg');
    ref = rgb2gray(i1); % 获取参考image灰度图像
    [hgram,binloc]=imhist(ref,64);
    g=histeq(f,hgram);
    
    %显示处理结果
    figure;
    subplot(2,3,1);imshow(f);title('待匹配图像');
    subplot(2,3,2);imshow(g);title('待匹配图像64分组匹配');
    subplot(2,3,3);imshow(ref);title('参考图像');
    
    subplot(2,3,4);imhist(f,64);title('待匹配图像的直方图');
    subplot(2,3,5);imhist(g,64);title('匹配结果图像直方图');
    subplot(2,3,6);imhist(ref,64);title('参考图像直方图');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    2.7 Matlab 常用的灰度变换函数

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    微信小程序——实现动画循环播放
    Linux进程管理之通过pid号找到struct task_struct
    电脑重装系统 win11 怎么关闭系统软件通知
    【Golang】int的取值范围
    DevOps与CI/CD常见面试问题汇总
    Oralce笔记-解决Oracle18c中ORA-28001: 口令已经失效
    C语言中的文件操作
    Django笔记三十七之多数据库操作(补充版)
    FPGA结构分析——ODDR,网口储备点2
    [面试直通版]操作系统之锁、同步与通信(下)
  • 原文地址:https://blog.csdn.net/weixin_41022048/article/details/127447893