1 圖像增強圖像增強是對圖像的某些特徵,如邊緣、輪廓、對比度等進行強調或銳化,以便於顯示、觀察或進一步分析與處理。通過對圖像的特定加工,將被處理的圖像轉化為對具體應用來說視覺質量和效果更「好」或更「有用」的圖像。圖像增強是最基本最常用的圖像處理技術,常用於其他圖像處理的預處理階段。
(1)高通平滑、低通銳化;平滑模糊、銳化突出圖像細節(2)濾波器還有帶通、帶阻等形式(3)根據噪聲(椒鹽噪聲、高斯噪聲....)的不同,選用不同的濾波(4)鄰域有4-鄰域、對角鄰域、8-鄰域,相對應的有鄰接,即空間上相鄰、像素灰度相似(5)圖像邊緣處理:忽略不處理、補充、循環使用(6)目前尚未圖像處理大多基於灰度圖像
2 直方圖均衡化直方圖均衡化主要用於增強灰度值動態範圍偏小的圖像的對比度。該方法的基本思想是把原始圖像的灰度統計直方圖變換為均勻分布的形式,這樣就增加了像素灰度值的動態範圍,從而達到增強圖像整體對比度的效果。數字圖像是離散化的數值矩陣,其直方圖可以被視為一個離散函數,它表示數字圖像中每一灰度級與其出現概率間的統計關係。假設一幅數字圖像f(x,y)的像素總數為N,ra表示第k個灰度級對應的灰度,nk表示灰度為r的像素個數即頻數,用橫坐標表示灰度級,用縱坐標表示頻數,則直方圖可定義為(r)=,其中,P(n)表示灰度ry出現的相對頻數即概率。直方圖在一定程度上能夠反映數字圖像的概貌性描述,包括圖像的灰度範圍、灰度分布、整幅圖像的亮度均值和陰暗對比度等,並可以此為基礎進行分析來得出對圖像進一步處理的重要依據。直方圖均衡化也叫作直方圖均勻化,就是把給定圖像的直方圖分布變換成均勻分布的直方圖,是一種較為常用的灰度增強算法(2。直方圖均衡化概括起來包括以下三個主要步驟。(1)預處理。輸入圖像,計算該圖像直方圖。(2)灰度變換表。根據輸入圖像的直方圖計算灰度值變換表。(3)查表變換。執行變換x'=H(x),表示對步驟1中得到的直方圖使用步驟2得到的灰度值變換表進行查表變換操作,通過遍歷整幅圖像的每一個像元,將原始圖像灰度值x放入變換表H(x)中,可得到變換後的新灰度值x'。根據資訊理論的相關理論,我們可以知道圖像經直方圖均衡化後,將會包含更多的信息量,進而能突出某些圖像特徵。假設圖像具有n級灰度,其第i級灰度出現的概率為pi,則該級灰度所含的信息量為:整張圖片的信息量為資訊理論已經證明,具有均勻分布直方圖的圖像,其信息量H最大。即當Po=Pi=…=pn-i=1/n時,(1.2)式有最大值。
2.1 全局直方圖處理全局直方圖處理通過對RGB圖像的R、G、B三層通道分別進行直方圖均衡化, 再整合到新的圖像的方式來進行。一般來說,全局直方圖去霧算法可以實現含霧圖像的增強效果,處理前後的直方圖在分布上具有明顯變化,但在圖像整體上容易出現某些色彩失真的現象。
2.2 局部直方圖處理全局直方圖均衡化增強只是將原圖像的直方圖進行了均衡化,未能有效保持原始圖像的局部特徵,容易出現色彩失真問題。通過選擇固定尺寸的滑動窗口作用於原始圖像來進行局部直方圖處理,可以在一定程度上保持原始圖像的局部特徵,提高圖像增強的效果。因此, 局部直方圖處理通過對RGB圖像的R、G、B三層通道分別進行局部直方圖均衡化,再整合到新的圖像的方式來進行。
2.3 Retinex增強處理基於全局直方圖、局部直方圖的圖像去霧算法在理論及實現上比較簡單,能起到一定的去霧處理效果。為了進行對比, 實驗中採取了Retin ex圖像增強算法來進行對比, 該算法可以平衡圖像灰度動態範圍壓縮、圖像增強和圖像顏色恆常三個指標,能夠實現對含霧圖像的自適應性增強。因此, Retin ex增強處理通過對RGB圖像的R、G、B三層通道分別應用Retin ex算法進行處理, 再整合到新的圖像的方式來進行。
function varargout = one(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @one_OpeningFcn, ...
'gui_OutputFcn', @one_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before one is made visible.
function one_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to one (see VARARGIN)
% Choose default command line output for one
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes one wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = one_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes1);
[filename,pathname]=uigetfile({'*.jpg;*.png;*.jfif'},'Select RGB image','pick an image');
file=strcat(pathname,filename);
I=imread(file);
imshow(I);
handles.img=I;
guidata(hObject,handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% [filename,pathname] = uigetfile({'*.*';'*.jpg';'*.bmp';'*.gif';'*.png';'*.tif'},'Read Pic');
% str = [pathname,filename];
% global src_img;
% if ~isequal([pathname,filename],[0,0])
% src_img = imread(str);
guidata(hObject,handles);
axes(handles.axes2);
global In;
imshow(In);
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu1
var=get(handles.popupmenu1,'value');
axes(handles.axes2);
I=handles.img;
global In;
switch var
case 1
In = RemoveFogByGlobalHisteq(I, flag);
case 2
In = RemoveFogByLocalHisteq(I , flag);
case 3
In = RemoveFogByRetinex(I, flag);
guidata(hObject,handles);
end
function In = RemoveFogByRetinex(I, flag)
% 用Retinex的MSR實現圖像去霧
% 輸入參數:
% f——圖像矩陣
% flag——顯示標記
% 輸出參數:
% In——結果圖像
if nargin < 2
flag = 1;
end
%提取圖像的R、G、B分量
fr = I(:, :, 1);
fg = I(:, :, 2);
fb = I(:, :, 3);
%數據類型歸一化
mr = mat2gray(im2double(fr));
mg = mat2gray(im2double(fg));
mb = mat2gray(im2double(fb));
%定義alpha參數
alpha = 1200;
%定義模板大小
n = 128;
%計算中心
n1 = floor((n+1)/2);
for i = 1:n
for j = 1:n
%高斯函數
b(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(4*alpha))/(pi*alpha);
end
end
%卷積濾波
nr1 = imfilter(mr,b,'conv', 'replicate');
ng1 = imfilter(mg,b,'conv', 'replicate');
nb1 = imfilter(mb,b,'conv', 'replicate');
ur1 = log(nr1);
ug1 = log(ng1);
ub1 = log(nb1);
tr1 = log(mr);
tg1 = log(mg);
tb1 = log(mb);
yr1 = (tr1-ur1)/3;
yg1 = (tg1-ug1)/3;
yb1 = (tb1-ub1)/3;
%定義beta參數
beta = 55;
%定義模板大小
x = 32;
%計算中心
x1 = floor((n+1)/2);
for i = 1:n
for j = 1:n
%高斯函數
a(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(4*beta))/(6*pi*beta);
end
end
3 仿真結果4 參考文獻
基於Retinex增強算法的圖像去霧方法研究[J].黃麗韶.無線互聯科技. 2021,18(15)