【圖像去霧】直方圖均衡化+Retinex理論圖像去霧含GUI matlab源碼

2022-01-09 天天Matlab
一、圖像增強及直方圖均衡化簡介

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算法進行處理, 再整合到新的圖像的方式來進行。


2 部分代碼
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)


相關焦點

  • MATLAB基於直方圖的圖像去霧
    直方圖均衡化也叫作直方圖均勻化,就是把給定圖像的直方圖分布變換成均勻分布的直方圖,是較為常用的灰度增強算法。直方圖均衡化概括起來包括以下三個主要步驟。●灰度變換表。根據輸入圖像的直方圖計算灰度值變換表。●查表變換。
  • 【圖像識別】基於顏色直方圖實現危險品識別matlab代碼
    matlab源碼 342個
  • 【學術論文】基於ZYNQ的Retinex實時圖像去霧
    因此,對霧霾天氣引起的降質圖像進行有效、快速的去霧處理顯得極為重要。:基於圖像復原的去霧方法和基於圖像增強的去霧方法[3]。前者是從圖像退化的原因出發,建立去霧圖像的物理模型,根據該模型來恢復出清晰的去霧圖像。該類方法去霧效果良好,但算法複雜度較大,不便於在硬體平臺上實現。基於圖像增強的去霧方法不考慮圖像霧化的原因和機理,而是有選擇性地增強需要的細節信息。屬於此類的去霧方法常用的是Retinex算法[4]。Retinex算法能較好地保留圖像的邊緣等細節信息,處理後的圖像具有亮度適中、對比度高等優點。
  • 【圖像基礎教程】直方圖均衡化
    一、直方圖均衡化概述  直方圖均衡化(Histogram Equalization
  • MATLAB實驗:圖像增強——灰度變換、直方圖均衡化
    實驗基本原理與設計術語『空間域』指的是圖像平面本身,在空間與內處理圖像的方法是直接對圖像的像素進行處理。空間域處理方法分為兩種:灰度級變換、空間濾波。空間域技術直接對像素進行操作其表達式為g(x,y)=T[f(x,y)]其中f(x,y)為輸入圖像,g(x,y)為輸出圖像,T是對圖像f進行處理的操作符,定義在點(x,y)的指定領域內。定義點(x,y)的空間鄰近區域的主要方法是,使用中心位於(x,y)的正方形或長方形區域,此區域的中心從原點(如左上角)開始逐像素點移動,在移動的同時,該區域會包含不同的領域。
  • 基於FPGA的直方圖均衡化
    哪一天,如果我能走的更穩更遠了,就去見你。基於FPGA的直方圖均衡化1 直方圖均衡直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。通過這種方法,亮度可以更好地在直方圖上分布。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。一個灰度圖像,讓ni表示灰度i出現的次數,這樣圖像中灰度為i 的像素的出現概率是L 是圖像中所有的灰度數,n 是圖像中所有的像素數, p 實際上是圖像的直方圖,歸一化到 0..1。
  • 【圖像處理】圖像直方圖、濾波、小波變換、分割處理系統matlab代碼
    matlab源碼 347個
  • Python 還能實現圖片去霧?FFA 去霧算法、暗通道去霧算法用起來!(附代碼)
    在過去的幾十年中,單圖像去霧作為基本的低級視覺任務已引起了計算機視覺社區和人工智慧公司的越來越多的關注。
  • 大賽創意階段一等獎作品賞析:面向智能成像載荷的圖像實時去霧APP軟體設計
    21 世紀,隨著光學技術和計算機技術等快速發展,圖像處理技術便很快進入人們的視線,在軍事領域和衛星對地遙感中得到廣泛的應用。而近幾年來,霧霾等惡劣天氣頻繁的出現,成像設備採集的圖像存在嚴重的細節信息丟失、顏色失真、圖像解析度較低等退化現象,嚴重影響衛星對地遙感和軍事目標的探測與識別,導致圖像的應用價值降低很多,如下圖1所示。因此,研究霧天圖像的清晰化具有重要的現實意義。
  • 28、 OpenCV直方圖均衡化
    然而,對於傳感器的可用動態範圍而言,特定圖像中的對比度範圍通常太大。因此,在捕獲需要較長曝光時間的暗區和需要較短曝光以避免飽和「泛白」的明亮區域之間進行權衡。在許多情況下,兩者都不能在相同的圖像中有效地完成。照片拍攝完成後,我們無法改變傳感器記錄的內容。但是,我們仍然可以採取措施並嘗試擴大圖像的動態範圍以增加其對比度。最常用的技術是直方圖均衡化。
  • 灰度直方圖均衡化
    ")plt.hist(o.ravel(),256)plt.figure("均衡化結果直方圖")plt.hist(equ.ravel(),256)cv2.waitKey()cv2.destroyAllWindows()
  • 代碼 | 直方圖均衡化
    /usr/bin/env python# encoding=gbkimport cv2import numpy as npfrom matplotlib import pyplot as plt'''equalizeHist—直方圖均衡化函數原型: equalizeHist(src, dst=None)src:圖像矩陣(
  • 【圖像識別】基於模板匹配實現手寫數字識別matlab源碼含GUI
    matlab源碼 411個
  • 掩模直方圖均衡化
    算法:掩模圖像,也稱掩膜圖像,借鑑於PCB製版過程,似一塊玻璃板,玻璃板上白色區域是透明的,黑色區域是不透明的。掩膜有方形掩膜和圓形掩膜等。掩模運算是將該玻璃板覆蓋在原始圖像透過玻璃板顯示出來的部分就是掩模運算的結果圖像。掩膜圖像應用在感興趣區、圖像屏蔽、圖像合成、結構特徵提取、特殊形狀圖像提取等領域。
  • OpenCV中圖像直方圖與應用
    最常見的圖像直方圖一般都是圖像像素值統計直方圖。通常我們把每個直方圖的單元叫做BIN,對RGB圖像來說像素的取值範圍為0~255之間,BIN的個數是對取值範圍的間隔區分,可以為32、64、128、256。OpenCV中提供了幾個非常有用的直方圖操作函數,實現了直方圖統計計算、到直方圖均衡化、直方圖反向投影等功能。
  • OpenCV-Python圖像像素直方圖
    直方圖的顯示方式是左暗右亮,左邊用於描述圖像的暗度,像素值比較小;右邊用於描述圖像的亮度,像素值比較大。按照維數去分類可以分為一維直方圖和二維直方圖。二維像素直方圖直方圖均衡化 直方圖均衡化[3]是通過拉伸像素強度分布範圍來增強圖像對比度的一種方法。如何做到?
  • 深入理解OpenCV+Python直方圖均衡化
    直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。
  • opencv教程-圖像直方圖
    mask:計算全圖用None,計算roi需要獲取對應的mast圖像。    histSize:直方圖bins。2:直方圖均衡化    其基本思想是將直方圖從局部聚集拉伸到全局範圍,可以用來處理過暗或者過亮的圖像,增強圖像對比度。
  • 【圖像識別】基於HSV和RGB模型水果分類matlab源碼含 GUI
    matlab源碼 354個
  • OpenCV系列之直方圖-2:直方圖均衡 | 二十七
    目標我們將學習直方圖均衡化的概念,並利用它來提高圖像的對比度。理論考慮這樣一個圖像,它的像素值僅局限於某個特定的值範圍。