Advertisement

灰度图像增强算法代码_【图像处理三】图像增强算法

阅读量:

引言

由于受环境及光照条件等因素的影响,在实际拍摄过程中所获得的照片往往会在清晰度与对比度方面显不足,并难以凸显图像中的关键要素。基于此需求建立的图像增强技术旨在提升图像的空间对比度使其便于后续分析处理工作开展。本章将深入探讨几种经典的图像增强算法并附上相应的Matlab实现代码示例以便实验者进一步理解不同方法的特点随后还将介绍当前深度学习在该领域取得的重要进展

01

直方图均衡

在直方图分析中发现,在高亮度区域占据主导的亮度梯度会导致低亮度细节难以辨识;反之,在低亮度区域密集的情况下则会削弱高亮度细节的表现。为了实现高低亮度层次的清晰呈现与区分能力提升的关键在于通过适当的空间变换手段使图像的空间频率特性得到合理优化这也是直方图均衡算法的主要目标为此我们可以采用特定的空间转换方法使得各个空间频率分量的比例达到最优配置这也就实现了图像的空间信息最大提取从而达到了增强图像对比效果的目的

97fa282abae94b547a9ab22e75a318b8.png

其中L为灰度级。我们的目的是使得灰度级概率分布相等:

4c894691212b24a26fcd18bd8e458079.png

变换前灰度级分布和变换后灰度级分布关系为:

49ccba09514b8511e55cc4eedeaf8dfc.png

因此有:

ede2c8bc1e2899257681075379cca9f2.png

积分有:

bb6eb92a1c105c49ade5d610ae25f34f.png

用离散化表示:

daa402935a213da1ce467df0057fb73d.png

Matlab代码如下:

复制代码
    function histogramEqual        imgData=imread('../data/img0.jpg');    gray=rgb2gray(imgData);    imshow(gray);    imwrite(gray, '../data/gray0.jpg');    %calculate histogram    histgramData=linspace(0, 0, 256);    [grayRow, grayColumn]=size(gray);    grayPixelNumber=grayRow*grayColumn;    for i=1:grayRow        for j=1:grayColumn            histgramData(gray(i, j)+1)=histgramData(gray(i, j)+1)+1;        end    end    %histogram equalization    histogramIntegral=linspace(0, 0, 256);    for i=1:256        for j=1:i            histogramIntegral(i)=histogramIntegral(i)+histgramData(j);        end    end        for i=1:grayRow        for j=1:grayColumn            gray(i, j)=round(255*histogramIntegral(gray(i, j)+1)/grayPixelNumber);        end    end        imshow(gray);    imwrite(gray, '../output/histogramEqual.jpg');end
    
    AI写代码

处理结果:

160fdd2c075ad77f58847c74dfa46c5d.png
e0846f81d08da6b8e4c0cd5d90b9e0a1.png

图1.1 直方图均衡化结果(左)原图像(右)结果

02

Gamma变换

Gamma变换主要应用于图像修正以调整亮度失真程度并提升对比度其基本原理是通过对图像中的每个像素应用特定的数学运算来进行处理具体而言该方法通过逐像素应用幂函数来实现对图像质量的改善例如对于那些亮度不足或过于明亮的照片 Gamma 变换能够有效恢复其视觉效果同时保持细节完整性这使得该技术在数字图像处理领域具有广泛的应用价值

170704c0da2bfd189d07337eeec45933.png

从下图的gamma曲线中可以看出其变换原理:

90ef7e585d2ab8aa69a0ec9a813d8554.png

图2.1 图像gamma变换

通过观察图像可知当参数r超过1时会导致图像中亮度较高的区域被扩展并同时会使亮度较低的区域被收缩;而当参数r低于1时则会导致亮度较低的区域被扩展并同时会使亮度较高的区域被收缩这种调整方式有助于改善图像对比度

Matlab代码:

复制代码
    function imageGamma(r)    imgData=imread('../data/img0.jpg');    gray=rgb2gray(imgData);    [grayRow, grayColumn]=size(gray);        gray=double(gray);        for i=1:grayRow        for j=1:grayColumn            gray(i, j)=255*((gray(i, j)/255)^r);            gray(i, j)=round(gray(i, j));        end    end        gray=uint8(gray);        fileName='../output/gamma';    fileSuf='.jpg';    gammaStr=num2str(r);    file=[fileName, gammaStr, fileSuf];    imshow(gray);    imwrite(gray, file);            end
    
    AI写代码

结果如下:

8869bb19adaae75aeb7be5bd534c1b90.png
5dacd1cd7f3f616af627c8bdf1766168.png

图2.2 gamma变换(左)r=0.5(右)r=1.5

03

Laplace变换

通过二阶微分操作可以突出图像边缘并增强细节。在处理图像时会期望构造一个各向异性滤波器,并且这一过程对于不同方向的变化具有一定的鲁棒性。例如,在这一领域中使用最简单的各向异性滤波器即拉普拉斯算子(Laplace operator),其数学表达式为:

4223dab88dde1273d2d3e38188756777.png

表示为离散形式为:

20e238921cb29f6b081b07e3653eaff4.png

实现上式的模板为:

378f16ccadeedefb6a04c8fcbf5f1682.png

将laplace变换的结果按照一定比例加入到原灰度图像中:

efa078dd75fab0a47fb7691b7f814d3d.png

既可以来突出对比度。

Matlab代码为:

复制代码
    % g(x, y)=f(x, y)+c*delta2 f(x, y)function laplace(c)    imgData=imread('../data/img0.jpg');    gray=rgb2gray(imgData);    [grayRow, grayColumn]=size(gray);        gray=double(gray);        %laplace        laplacePlate=[0, 1, 0; 1, -4, 1; 0, 1, 0];    laplaceResult=zeros(grayRow, grayColumn);    laplaceGray=zeros(grayRow, grayColumn);    laplaceGray=double(laplaceGray);    for i=1:grayRow        for j=1:grayColumn            for k=-1:1                for n=-1:1                    if (i+k>=1) && (i+k<=grayRow) && (j+n>=1) && (j+n<=grayColumn)                        grayValue=gray(i+k, j+n);                    else                        grayValue=0;                    end                    laplaceResult(i, j)=laplaceResult(i, j)+laplacePlate(k+2, n+2)*grayValue;                end            end            laplaceGray(i, j)=round(gray(i, j)+c*laplaceResult(i, j));        end    end    maxLaplaceGray=max(max(laplaceGray));    minLaplaceGray=min(min(laplaceGray));    laplaceGray=((laplaceGray-minLaplaceGray) .* 255) ./(maxLaplaceGray-minLaplaceGray);    laplaceGray=uint8(laplaceGray);    fileName='../output/laplace';    fileSuf='.jpg';    gammaStr=num2str(c);    file=[fileName, gammaStr, fileSuf];    figure('name', 'gray');    imshow(laplaceGray);    figure('name', 'laplace');    imshow(laplaceResult);    imwrite(laplaceGray, file);      imwrite(laplaceResult, '../output/laplaceResult.jpg');  end
    
    AI写代码

结果为:

bfb8f1e89eef522576c12e933b8a31ca.png
a0b4aa9d7afffd76df283965880a3374.png
0b3781d6762aa987fe32d74ed10bc25e.png

图3.1 laplace算子增强(上左)laplace变换结果(上右)C=0.5(下)C=0.8

04

Retix算法

该算法命名为Retix,并基于光学物理特性设计。假设入射光L(x,y)照射到物体表面。经反射得到R(x,y),进入人眼的光线变为:

d14eb6ff155080ecea7c7614fcae5524.png

一般而言,在物体属性的研究中R(x,y)代表了其内部结构信息含量丰富且具有重要价值的部分。基于Retix理论的研究发现L(x,y)可通过应用高斯模糊算法获得较为精确的结果。为了使计算过程更加简便高效,则需对上式进行对数处理以减少复杂度:

L(x,y)=\log R(x,y)

fe8e8722e327f8e147db97df9bc41ad9.png

L(x, y)是通过高斯函数G(x, y)和观察图像S(x, y)卷积得到的。高斯函数为:

bc718527e025149de17eb2b329c95c05.png

为了降低卷积运算的的运算量,我们取了7x7的高斯卷积模板。

Matlab代码为:

复制代码
    function singleRetix(c)       imgData=imread('../data/img0.jpg');    gray=rgb2gray(imgData);    [grayRow, grayColumn]=size(gray);        gray=double(gray);        gaussConv=zeros(grayRow, grayColumn);    for i=1:grayRow        for j=1:grayColumn            for k=-3:3                for n=-3:3                    gaussValue=two_d_gauss(k, n, c);                    if (i+k>=1) && (i+k<=grayRow) && (j+n>=1) && (j+n<=grayColumn)                        grayValue=gray(i+k, j+n);                    else                        grayValue=0;                    end                                        gaussConv(i, j)=gaussConv(i, j)+grayValue*gaussValue;                end            end        end    end    gray=log(gray);    gaussConv=log(gaussConv);    reflectGray=exp(gray-gaussConv);    maxReflectGray=max(max(reflectGray));    minReflectGray=min(min(reflectGray));    reflectGray=((reflectGray-minReflectGray) .* 255) ./ (maxReflectGray-minReflectGray);    reflectGray=uint8(reflectGray);        fileName='../output/retix';    fileSuf='.jpg';    gammaStr=num2str(c);    file=[fileName, gammaStr, fileSuf];    figure('name', 'processed');    imshow(reflectGray);    imwrite(reflectGray, file);        endfunction res=two_d_gauss(x, y, c)    res=(1/sqrt(2*pi*c))*(-(x^2+y^2)/c^2);end
    
    AI写代码

结果:

2caec221d5c47f016f8566a3b6735cbb.png
2caec221d5c47f016f8566a3b6735cbb.png

图4.1 Retix结果(左)sigma=90(右)sigma=150

05

基于深度学习的图像增强

LL-NET是首个应用深度学习技术于图像增强领域的方案。在论文中采用了基于表示学习的自动编码器以解决低光图像增强问题。经过训练后能够识别并提取低光环境下图像的基础信号特征,并通过自适应机制实现增亮与降噪效果。LL-NET借鉴了SSDA网络所具有的稀疏特性,并利用其泛化能力生成适用于低光照条件下的测试样本。让网络来学习到图片的特征从而降低噪声并提高图像对比度

网络结构如下:

8b88ea204ca4a5202b1fb0c2c2297ef4.png

图5.1 LL-NET网络结构

结果为:

1338451d4d2fb4b7aa0b06fdc8e7a95b.png

图5.2 结果

结论

本文介绍了四种传统的图像增强算法,以及一种基于深度学习的方法。

往期回顾

1 【图像处理一】直方图

2 【图像处理一】加速直方图统计

3 【图像处理二】HDMI显示1

4 【图像处理二】HDMI显示2

bf16b6244351e7bd2d8476bbad7fc06a.png
d2eda501e2f94fdb9343c1de1a25f844.png
53f17523acefa4118905e98b4e52659d.png
d2d1aabf28731ab8561bf87c614090ba.png
2930817f80c1fcc3728bc45ac8f709a2.png

公众号

AI加速

1e4569cd341914aff1f7f0fd749814c6.png

用FPGA做有趣的事

f97dd7a5a833baf7a76dfb3885c2879a.png
98f48b1221d14d62853e15f50d496151.png

全部评论 (0)

还没有任何评论哟~