引言
由于受到環(huán)境,光線等的影響,拍攝的照片清晰度和對(duì)比度比較低,不能夠突出圖像中的重點(diǎn)。圖像增強(qiáng)就是通過一定手段來增強(qiáng)圖像的對(duì)比度,使得其中的人物或者事物更加明顯,有利于后邊的識(shí)別等處理。本章介紹幾個(gè)傳統(tǒng)的圖像增強(qiáng)算法,并給出matlab實(shí)現(xiàn)代碼,看一看不同算法的實(shí)現(xiàn)效果,最后再介紹一下深度學(xué)習(xí)在圖像增強(qiáng)上的應(yīng)用。
1. 直方圖均衡
在直方圖中,如果灰度級(jí)集中于高灰度區(qū)域,圖像低灰度就不容易分辨,如果灰度級(jí)集中于低灰度區(qū)域,那么高灰度就不容易分辨。為了能夠讓高低灰度都容易分辨,最好的辦法是將圖像進(jìn)行轉(zhuǎn)換,使得灰度級(jí)分布概率相同。這就是直方圖均衡的目的。假設(shè)圖像經(jīng)過如下變換:
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
處理結(jié)果:
圖1.1 直方圖均衡化結(jié)果(左)原圖像(右)結(jié)果
2. Gamma變換
Gamma變換主要用于圖像修正,將灰度過高或者過低的圖片進(jìn)行修正,增強(qiáng)對(duì)比度。變換公式是對(duì)每個(gè)像素進(jìn)行乘積運(yùn)算:
從下圖的gamma曲線中可以看出其變換原理:
圖2.1 圖像gamma變換
從圖中可以看出當(dāng)r值大于1,會(huì)拉伸圖像中灰度級(jí)較高的區(qū)域,壓縮灰度級(jí)較低部分;當(dāng)r值小于1時(shí),會(huì)拉伸灰度級(jí)較低部分,而壓縮灰度級(jí)較高部分。這樣來調(diào)整圖像對(duì)比度。
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
結(jié)果如下:
圖2.2 gamma變換(左)r=0.5(右)r=1.5
3. Laplace變換
對(duì)圖像進(jìn)行二階微分操作可以突出圖像邊緣,增強(qiáng)細(xì)節(jié)。通常希望構(gòu)造一個(gè)同性濾波器,其對(duì)圖像方向的變化不敏感。一個(gè)最簡單的同性濾波器就是laplace算子,定義為:
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=1) && (j+n 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
結(jié)果為:
圖3.1 laplace算子增強(qiáng)(上左)laplace變換結(jié)果(上右)C=0.5(下)C=0.8
4. Retix算法
Retix是一種建立在光學(xué)物理特性基礎(chǔ)上的算法,假設(shè)入射光L(x, y)入射到物體上,經(jīng)過反射R(x, y),進(jìn)入到人眼的光變?yōu)椋?/p>
為了降低卷積運(yùn)算的的運(yùn)算量,我們?nèi)×?x7的高斯卷積模板。
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=1) && (j+n 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);
end
function res=two_d_gauss(x, y, c)
res=(1/sqrt(2*pi*c))*(-(x^2+y^2)/c^2);
end
結(jié)果:
圖4.1 Retix結(jié)果(左)sigma=90(右)sigma=150
5. 基于深度學(xué)習(xí)的圖像增強(qiáng)
LL-NET是第一個(gè)用深度學(xué)習(xí)來增強(qiáng)圖像的方法。在其論文中使用自動(dòng)編碼器從表示學(xué)習(xí)的角度來解決低光圖像增強(qiáng)的問題,這些自動(dòng)編碼器經(jīng)過訓(xùn)練以學(xué)習(xí)低光圖像中的基礎(chǔ)信號(hào)特征并自適應(yīng)地增亮和去噪。LL-NET借鑒了SSDA網(wǎng)絡(luò)的稀疏特性,可以用來去除圖像中噪聲。運(yùn)用網(wǎng)絡(luò)的泛華能力來提供低照度下的測(cè)試圖片,讓網(wǎng)絡(luò)來學(xué)習(xí)到圖片的特征,從而降低噪聲,提高圖像對(duì)比度。
網(wǎng)絡(luò)結(jié)構(gòu)如下:
圖5.1 LL-NET網(wǎng)絡(luò)結(jié)構(gòu)
結(jié)果為:
圖5.2 結(jié)果
結(jié)論
本文介紹了四種傳統(tǒng)的圖像增強(qiáng)算法,以及一種基于深度學(xué)習(xí)的方法。
編輯:hfy
-
圖像增強(qiáng)算法
+關(guān)注
關(guān)注
0文章
4瀏覽量
5376 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5463瀏覽量
120890
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論