Ⅰ MATLAB中訓練LM演算法的BP神經網路
1.初始權值不一樣,如果一樣,每次訓練結果是相同的
2.是
3.在train之前修改權值,IW,LW,b,使之相同
4.取多次實驗的均值
一點淺見,僅供參考
訓練誤差是否降到一定范圍內,比如1e-3,
將訓練樣本回代結果如何,
訓練樣本進行了預處理,比如歸一化,而測試樣本未進行同樣的處理
這樣的歸一化似有問題,我也認為「測試數據的歸一化也用訓練數據歸一化時得出的min和max值」,
請參考這個帖子http://www.ilovematlab.cn/thread-27021-1-1.html
測試數據帶入訓練好的神經網路誤差當然不會達到1e-5,這是預測啊。
但將訓練數據帶入誤差必然是1e-5,演算法終止就是因為達到這個誤差才終止,這個誤差是由訓練數據的輸入、輸出以及神經網路的權值、激活函數共同決定的,神經網路訓練完後,權值、激活函數定了,同樣的數據再代入神經網路,誤差會不等於1e-5?
第二個問題:不可能每個值都達到1e-5,1e-5是MSE(mean square error),它們的平方和除以總數再開方,mse(E)必為1e-5
另外,LM演算法雖然訓練最快,但是預測精度一般不好,不如gdm,gdx
Ⅱ MATLAB 中 LM演算法的函數是什麼
http://www.mathworks.com/matlabcentral/fileexchange/16063-lmfsolve-m-levenberg-marquardt-fletcher-algorithm-for-nonlinear-least-squares-problems
Calling of the function is rather simple:
[x,ssq,cnt] = LMFsolve(Equations,X0); % or
[x,ssq,cnt] = LMFsolve(Equations,X0,'Name',Value,...); % or
[x,ssq,cnt] = LMFsolve(Equations,X0,Options) % .
去看吧
好像沒有二維的.
你最好看看這個函數,根據LM演算法的意義修改一下
Ⅲ matlab解非線性方程組
1. fsolve
求解非線性方程組
方程:
F(x)=0
x是一個向量,F(x)是該向量的函數向量,返迴向量值
2. 語法
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
[x,fval] = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
3. 描述
fsolve用於尋找非線性系統方程組的零點。
x = fsolve(fun,x0)以x0為初始值,努力尋找在fun中描述的方程組。
x = fsolve(fun,x0,options) 以x0為初始值,按照指定的優化設置「options」努力尋找在fun中描述的方程組。使用optimset設置這些選項。
[x,fval] = fsolve(fun,x0)返回在解x處的目標函數fun的值
[x,fval,exitflag] = fsolve(...)返回exitflag表示退出條件。
[x,fval,exitflag,output] = fsolve(...)返回output結構,該結構包含了優化信息。
[x,fval,exitflag,output,jacobian] = fsolve(...)返回在解x處的Jacobian函數。
4. 輸入參數
4.1. fun
非線性系統方程。它是一個函數,以x作為輸入,返迴向量F。函數fun可以被指定為一個M文件函數的函數句柄。
x = fsolve(@myfun,x0)
這里的myfun是一個matlab函數,形如:
function F = myfun(x)
F = ... % Compute function values at x
fun也可以是一個非同步函數的函數句柄:
x = fsolve(@(x)sin(x.*x),x0);
若用戶定義的值為矩陣,則會被自動轉換為向量。
若Jacobian能被計算出來且通過options = optimset('Jacobian','on')設置Jacobian選項為」on」,則函數fun必須在第2個輸出參數中返回x處的Jacobian值J(它是一個矩陣)。注意:通過檢查nargout的值,當fun被只帶一個輸出參數調用的情況下,該函數可避免計算J,僅只有一個輸出參數。(這種情況下,優化演算法僅需要知道F而不需J)。
function [F,J] = myfun(x)
F = ... % objective function values at x
if nargout > 1 % two output arguments
J = ... % Jacobian of the function evaluated at x
end
4.2. options
提供該函數有關的特定信息。
5. 輸出參數
5.1. exitflag
一個用來表示演算法終止原因的整數。
1:函數收斂到x
2:x的變化已經處在容許范圍內
3:殘差變化已經處在容許范圍內
4:搜索方向飛幅度比指定的誤差小
5:迭代次數超過options.MaxIter或函數估值的次數超過options.FunEvals
-1:演算法被輸出函數終止
-2:演算法似乎收斂到一個非根點。
-3:可信半徑變得太小
-4:沿當前方向的線性搜索不能足夠地減小殘差
5.2. output
包含關於優化信息的一個結構,其具有如下欄位:
iterations:已經迭代的次數
funcCount:函數估值的次數
algorithm:所使用的演算法
cgiterations:PCG迭代次數(僅適用於大規模演算法)
stepsize:最終採取的步長(僅適用於中等規模演算法)
firstorderopt:第1階優化的觀測值 。
5.3. options
優化設置。一些選項設置用於所有演算法,部分與大規模演算法(large-scale algrithm)。相關,部分與中等規模演算法相關。可以使用optimset改變其中的設置。LargeScale選項指定使用哪種演算法。
設為『on』使用大規模演算法,設為『off』使用中等規模演算法。
5.3.1. Medium-Scale and Large-Scale Algorithms
如下選項用於大規模和中等規模演算法:
DerivativeCheck:將用戶提供導數與有限差分導數相比較
Diagnostics:顯示被解函數的診斷信息
DiffMaxChange:有限差分變數中的最大變化
DiffMinChange:有限差分變數中的最小變化
Display:顯示的級別,『off『不顯示輸出,』iter『顯示每一步迭代的輸出,』final『顯示最終的輸出(默認)
FunValCheck:檢查目標函數值是否有效。設為『on』,當函數返回值為復數、inf或NaN將返回一個錯誤,設為『off』將不顯示錯誤。
Jacobian:設為『ON』,fsolve將使用用戶定義的Jacobian或Jacobian信息來估值目標函數,若設為『off』,則使用有限差分逼近Jacobian。
MaxFunEvals:最大允許估值次數
MaxIter:最大迭代次數
OutputFcn:指定一個或多個輸出函數,優化函數在每一個迭代過程中將調用這些函數。
PlotFcns:演算法執行時顯示進度條。從預定義中選擇或自定義進度條。指定@optimplotx顯示當前的點,@optimplotfunccount列印出函數的計數,@optimplotfval列印出函數值,@optimplotresnorm列印出殘差范數,@optimplotstepsize列印出步長,@optimplotfirstorderopt列印優化參數的第1階。
TolFun:函數值的終止誤差。
TolX:x的終止誤差
5.3.2. 僅適用於Large-Scale Algorithm
JacobMult:Jacobian乘法函數的函數句柄
JacobPattern
MaxPCGIter
PrecondBandWidth
TolPCG
5.3.3. 僅適用於Medium-Scale Algorithm
NonlEqnAlgorithm:
'dogleg' — Trust-region dogleg algorithm
(default)
'lm' — Levenberg-Marquardt
'gn' — Gauss-Newton
LineSearchType:'lm' (Levenberg-Marquardt)
'gn' (Gauss-Netwton) algorithms.
6. 使用優化工具箱完成以上函數操作
命令:optimtool
Ⅳ matlab中trainlm演算法和trainbr中mu值是什麼意思
變數mu確定了學習是根據牛頓法還是梯度法來完成,下式為更新參數的L-M規則:
% jj = jX * jX
% je = jX * E
% dX = -(jj+I*mu) \ je
隨著mu的增大,LM的項jj可以忽略。因此學習過程主要根據梯度下降即mu/je項,只要迭代使誤差增加,mu也就會增加,直到誤差不再增加為止,但是,如果mu太大,則會使學習停止,當已經找到最小誤差時,就會出現這種情況,這就是為什麼當mu達到最大值時要停止學習的原因。
Ⅳ 基於MATLAB的神經網路BP演算法改進LM演算法的交通流量的源代碼!
給你推薦一本書《神經網路理論與MATLAB7實現》,上面有LM演算法以及N多的代碼
Ⅵ 怎麼用matlab從含有水印的圖像中提取出水印
3 視頻水印的嵌入和檢測方案
3.1水印的預處理
採用二值圖像作為待嵌入的水印數據,本文針對的研究對象因為是二維圖像故採用的是二維Arnold變換。
二維Arnold變換定義為:
(3-1)
其中,(x,y)是原圖像的像素點,(x』,y』)是變換後新圖像的像素點,N是圖像階數,即圖像的尺寸大小,一般多為正方形圖像。由於Arnold變換具有周期性,因此可利用其周期性Period來對圖像進行反變換。即在水印嵌入過程中可將水印置亂次數作為密鑰times,再進行水印嵌入,當水印提取出來時,再將其繼續: (Period-times)次即可使其恢復至原圖。這就是利用Arnold的正變換來進行的置亂恢復方案。Arnold變換次數由版權所有者保管。
對水印進行置亂有以下優點:
(1) 採用置亂技術的合法者可以自由控制演算法的選擇,參數的選擇以及使用隨機數技術,從而使非法使用者難以破譯圖像內容,可以提高水印信息的安全性;
(2) 置亂技術可以分散錯誤比特的分布,提高數字水印的視覺效果,從而增強其魯棒性。
3.2 視頻水印的嵌入
水印嵌入演算法關鍵在於以下三點:
(1) 水印的結構;
(2) 水印的嵌入區域;
(3) 嵌入技巧;
本文選取二值圖像作為水印。為了提高水印的魯棒性,大多數的DCT域水印演算法把水印信號嵌入到DCT系數的低頻部分。但低頻區域是圖像的能量集中部分,嵌入到低頻會降低透明性。而嵌入在高頻雖然透明性比較好,但對大多數的圖像處理對高頻成分影響較大,從而降低水印的魯棒性.於是大多數的水印演算法將水印信號嵌入在載體圖像DCT系數的中頻部分,以達到透明性和魯棒性的最佳折衷。各種嵌入技巧的最終目的還是為了盡量地提高水印的魯棒性和透明性。
用於版權保護的數字水印在盡量提高魯棒性的同時還要滿足人類的視覺極限,因此必須根據HVS找到嵌入位置。
本文將HVS歸納為運動敏感性、紋理敏感性和亮度敏感性。在接下來的嵌入過程中,充分利用了這些特性。如圖3-1中間分支所示。
嵌入過程如圖3-1所示。
圖3-1 水印嵌入過程
從視頻中讀取亮度分量Y,因為它是最有效的數據,根據NEC演算法,嵌入到它裡面的水印才具有最強的魯棒性。根據式(3-2)所示的運動敏感性閾值計算公式,尋找32幀滿足敏感性比較大的視頻幀Yi (i=1,2,…32)。
(3-2)
其中 (t代表當前幀的編號)
接下來,將Y32中的數據按照64*64的尺寸切分成20塊BYij (j=1,2,…20),於是我們可得到20塊尺寸為64*64*32的三維數據塊BYk (k=1,2,…20),如圖2-3所示。
圖3-2 亮度分量的分塊
根據式(3-3)、式(3-4)所示的亮度敏感性Lk和紋理敏感性Dk計算公式,通過計算,我們選擇計算值都比較高的20塊數據中的一塊 ( )作為水印的嵌入塊。
(3-3)
(3-4)
其中, 是BYk中的亮度數據, 。
最後,折衷考慮復雜度和性能,我們對選定的一塊數據塊 實施了2階三維DCT變換。根據NEC演算法的思想,且為了抵抗濾波和壓縮攻擊,我們將置亂後的水印序列嵌入到了第一幀DCT系數c(u,v)中,詳見式(3-5)。
(3-5)
其中,w(u,v)是水印序列中的數據,c(u,v)是DCT變換後第一幀中的系數,c』( u,v)是嵌入水印後的系數,S是非負整數(且滿足T1=S/4, T2=3*T1)。
嵌入完成後,對c』(u,v)實施反2階三維DCT變換就得到了嵌入水印後的視頻數據,再將它們放回原來的位置即可。
需要說明的是,在整個嵌入過程中,所有用到的參數都應作為密鑰保留。
具體方案如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足敏感性的32幀視頻 (355*288*32)。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,共從32幀中取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
第三步:根據公式計算數據塊BY的亮度敏感性L和紋理敏感性D
第四步:選取L和D都比較大的一塊嵌入水印
(1) 判斷最大的L,存入變數Lm;
(2) 去掉這個最大的塊再比較;
(4) 賦第一塊的L的權重為20;
(5) 計算第2塊到第20塊的L的權重;
(6) 同理對D進行處理;
(7) 計算每塊BY的權重;
(8) 對所有的20塊BY的權重qz按由小到大的順序進行排序,並保持原來的位置索引index,則index[20]就是所要選取的塊;
第五步:三維DCT變換
由於視頻是由圖像數據流組成的,所以可以把視頻的每一幀看作是一幅靜止的圖像。對運動圖像序列進行3D-DCT,可以視為先對視頻的每一幀進行2D-DCT,再對幀間方向進行1D-DCT。
第六步:嵌入水印數據
將置亂的水印序列嵌入所選的DCT系數中,即嵌入經過3D-DCT變換後的數據塊中的第一幀數據中。然後把這些數據進行反3D-DCT變換後放回原位置。
第七步:將所選的數據放回原位置
最後一步:寫視頻文件
3.3視頻水印的檢測
水印提取是嵌入的逆過程,本演算法的一大優勢是,水印提取時無需原始視頻數據的參與,但依然需要一些參數。它們是:
(1) 嵌入過程第四步產生的塊BY的排序結果,由此我們可以得知水印的大致嵌入位置;
(2) 嵌入時指定的參數S;
(3) 需要Arnold變換的次數和周期;
獲得了上面的各項參數,水印的提取就十分簡單,具體過程如圖3-3所示。
圖3-3 水印盲提取過程
方案如下:
從待提取水印的視頻數據 (可能是被攻擊過後的視頻)中抽取出亮度分量Y』,根據密鑰,抽出32幀中的四幀亮度分量 ,然後分別從這組數據中提取水印。
在圖3-3中,首先將 分隔成20塊 ,並找到和 對應的 。然後,對 做二階三維DCT變換,根據式(3-6)提取出水印數據 。
(3-6)
其中, 是DCT系數。
最後,我們將 進行Arnold變換,得到水印圖像,作為最終提取出的水印。
具體步驟如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取嵌入水印圖像的視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足運動敏感性的32幀視頻,Y32是一個355*288*32的三維數組。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,從32幀中共取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
經過計算其亮度敏感性和紋理敏感性並排序,index[20]就是本文演算法中嵌入水印的塊;
第三步:三維DCT變換
第四步:Arnold變換
由於本演算法中水印圖像是二值圖像,其Arnold變換是二維變換,周期是Period,嵌入水印時變換了times次,所以此處只需變換(Period-times)次就可得到結果。
第五步:寫圖像文件
提取水印圖像數據並寫成圖像文件
第六步:檢測水印圖像存在與否,並與原水印圖像比較。
最後一步:進行實驗,驗證本文演算法的可見性和魯棒性。
經過以上步驟就是水印圖像信息嵌入視頻中的方法,具體實現過程見第四章。
4 用MATLAB實現視頻水印的嵌入和檢測
Matlab是近年來在國內外廣泛流行的一種可視化科學計算軟體。它的特點是結構簡單、數值計算高效、圖形功能完備、圖像處理方便,是國際公認的最優秀的科學計算與數學應用軟體之一。利用Matlab實現數字水印圖像演算法便捷、高效,省去了繁瑣的程序代碼,避免了科研人員在編程上浪費精力。
其內容已涉及矩陣代數、微積分、應用數學、信號與系統、神經網路、小波分析及應用、數字圖像處理、計算機圖形學、自動控制與通信技術等諸多方面,是科學計算、系統模擬、信號與圖像處理的主流軟體,受到了各方科研人員的青睞,在數字水印技術中得到了廣泛的應用。將Matlab應用於數字水印技術,其優點主要有以下幾個方面:
(1) 強大的數值計算功能
視頻水印技術是針對圖像進行研究的,而圖像是由矩陣表達的,將水印嵌入視頻中及從視頻中將水印提取出來都意味著大量的矩陣運算,而矩陣運算更是Matlab語言的核心,表達自然、直接。因此,利用Matlab強大的矩陣運算功能來實現圖像水印技術非常合適。
(2) 方便的圖像讀取和顯示功能
視頻水印首先要將數據從視頻中讀取出來,嵌入水印後還要將嵌入水印後的數據還原為視頻。Matlab為用戶提供了專門的圖像處理函數,用於讀寫顯示圖像數據。這種方法不像其他編程語言那樣,需要編寫復雜的代碼,只需要簡單地調用Matlab提供的函數即可,相關的函數及其功能主要有下列一些:
imread 將圖像讀入工作空間;
imwrite 將圖像寫入磁碟;
image 提供最原始的圖像顯示函數;
imshow 是最常用的顯示各種圖像的函數;
load將文件讀入工作空間;
(3) 高效的圖像變換功能
數字水印嵌入演算法一般分空域方法和頻域方法。空域方法指通過改變象素的亮度值來加入數字水印:頻域方法指圖像通過某種變換後再嵌入數字水印。與空域法相比,頻域法具有如下優點:在變換域中嵌入的水印信號可以分布到空域的所有象素上,有利於保證水印的不可見性。在變換域中,視覺系統的某些特性(如視頻特性)可以更方便地結合到水印編碼過程中。變換域的方法可以與國際數據壓縮標准兼容,從而實現壓縮域內的水印編碼。因此,變換域的方法應是水印演算法未來趨勢的主流。但是變換域的演算法一般來講計算量都比較大,需要復雜的編程運算,Matlab則改變了這種現狀。在Matlab圖像處理工具箱中,提供了常用的圖像變換函數,復雜的變換域演算法在Matlab中只需簡單地調用函數即可實現,充分體現了使用Matlab的簡便性和高效性。
主要圖像變換函數如下:
dct是一維離散餘弦變換;
idct是一維離散餘弦逆變換;
dct2是二維離散餘弦變換;
idct2是二維離散餘弦逆變換;
(4) 豐富的圖像處理函數
水印技術要求嵌入的水印不可見且有較強的魯棒性。不可見性可通過視覺效果和計算圖像的峰值信噪比來比較優劣,而魯棒性則要對水印後圖像進行各種攻擊,通過比較攻擊後圖像提取出的水印情況來說明問題。Matlab有各種圖像處理函數,可實現對圖像的各種攻擊。
綜上所述,Matlab具有語言簡潔、函數豐富、使用方便、數值計算高效等特點,將功能強大的Matlab軟體應用於數字水印技術是有效的選擇,因此,本文採用Matlab對圖像水印進行研究。
4.1水印的嵌入過程
(1) 基於Arnold變換的圖像置亂
Matlab實現如下:
Arnold變換由function r=Arnold(w0,row,colum,times) 實現,其中w0為讀取的圖像數據,row是行數,colum是列數,times是Arnold變換次數。
function r=Arnold(w0,row,colum,times)
for k=1:times
for i=1:row
for j=1:colum
i1=i+j;
j1=i+2*j;
if i1>row
i1=mod(i1,row);
end
if j1>colum
j1=mod(j1,colum);
end
if i1= =0
i1=row;
end
if j1= =0
j1=colum;
end
w1(i1,j1)=w0(i,j);
end
end
w0=w1;
end
r=w0;
用imwrite(w0,'Arnold.bmp', 'bmp')寫置亂後的圖像文件;在MATLAB中用imshow('Arnold.bmp')顯示此圖像。
本文採用二維的二值水印圖像watermark.bmp,我們將圖像數據(64*64)掃描到二維的矩陣中並實施Arnold變換,從而得到置亂後的二維矩陣。隨著迭代次數的增加,圖像逐漸趨於混亂,不過到一定次數時,又將回到原圖。因為watermark.bmp大小為64*64,故經過試驗圖像迭代48次後將回到原圖,即周期性Period=48。
本演算法選擇置亂8次,因為8次Arnold變換後原水印圖像已經成為無形狀的圖像。實驗結果表明,該方法能較好地刻劃圖像的置亂程度,與人的視覺基本相符。但需要指出的是不一定圖像的置亂次數越多其置亂度就越高。所以,在水印嵌入時,為了提高其魯棒性而增加置亂次數的方法是不科學的,合理的做法是計算置亂後圖像的置亂度,達到較為滿意的置亂度後就可停止置亂,避免盲目的提高置亂次數。
置亂次數作為密鑰有視頻版權所有者保管,如果非法所有者不知道置亂次數就很難恢復出原水印圖像。
原水印圖像如圖4-1所示,本演算法實現置亂8次後效果如圖4-2所示:
圖4-1 水印原圖像 圖4-2 置亂8次後
(2)Matlab實現嵌入過程:
本文中選取352×288×142的yuv格式視頻流進行測試。YUV顏色模型是一種常用的顏色模型,其基本特徵是將亮度信號與顏色信號分離,由於人眼對亮度的變化比對顏色的變化敏感,因此,YUV模型中Y分量的值所佔帶寬大於等於彩色分量所佔帶寬。YUV色彩空間模型可以在一定程度上避免RGB模型的高分散性和高相關性所帶來的閉值劃分問題,計算也較為簡單。這種色彩空間模型中Y和UV分量是相互獨立的,反映了人眼觀察彩色的視覺規律,在實際中應用較多。其中「Y」表示明亮度(Luminance或Luma),也就是灰階值;而「U」和「V」表示的則是色度(Chrominan「或Chroma),作用是描述影像色彩及飽和度,用於指定像素顏色。因此選擇YUV顏色空間更加穩定,易於分析。
本文選擇測試視頻中的第39幀如圖4-3所示。YUV格式的視頻中Y:U:V=4:2:2,但通俗叫「420」格式。
圖4-3 未嵌入水印的視頻
第一步:讀取文件;
讀取視頻文件由[yuv,Y,u,v,num_f]=loadyuv(filename)實現,filename是所選取得視頻文件名稱。yuv是一個四維數組,它返回的是視頻的yuv分量,Y是亮度分量,u和v是色彩分量,num_f是視頻文件中所有幀的數目。
讀取一幀數據的YUV分量在Matlab中由以下源代碼實現:
function [YUV,Y,U,V] = loadFileYUV(width,heigth,Frame,fileName,format)
[Teil_h,Teil_b]=YUVFormat(format);
fileId = fopen(fileName,'r');
其中width:每一幀的寬度;heigth:每一幀的高度;Frame:當前load的那一幀;filename:視頻文件名;Teil_h:垂直比例參數;Teil_b:水平比例參數;YUV:返回值,返回YUV分量,是一個三維變數,本文演算法中將U、V分量的寬度和高度設成與Y一樣的了,因此U、V分量中有重復的。YUV(:,:,1)存放Y分量;YUV(:,:,2)存放U分量;YUV(:,:,3)存放V分量;Y,U,V是三個分量的實際值,二維矩陣,沒有重復,他們的長度可能不一樣。
Y_delt(j)=delt(Y(:,:,w(i)),Y(:,:,4*(i-1)+j));
其中Y_delt是當前幀與下一組各幀的Y的差,m(i)=max(Y_delt(j));判斷每組中最大的Y_deltmax,存入變數m,以此來得到每組中最運動敏感的視頻幀。w(i+1)=4*(i-1)+k定位最大的Y_deltmax,存入變數w。
最後得到Y32=double(Y(:,:,w)), Y32是視頻幀中Y分量滿足敏感性的32幀視頻是一個355*288*32的三維數組。
第二步:分塊;
分塊時因為需要塊標號,由此造成維數不同,所以只能逐個象素賦值,在Matlab中由BY(t1,t2,t3,j*5+k+1)= double(Y32((64*j+t1),(64*k+t2),i))實現,切成20塊,每塊為64*64*4的數據塊BY ,其中t1是塊的杭坐標,t2是塊的列坐標,t3幀標號,j*5+k+1是快標號。
第三步:三維DCT變換;
運動圖像序列的每一幀可以看作是靜止圖像 對運動圖像序列進行3D DCT,可以視為先對每幀進行2D DCT,再對幀間方向進行1D DCT。
%對每一塊的幀間方向進行1D DCT變換
for i=1:64
for j=1:64
dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20)));
end
end
%對每一塊的每一幀進行2D DCT
for i=1:4
dct3a(:,:,i,index(20))=dct2(dcta(:,:,i,index(20)));
end
第四步:嵌入水印過程;
讀入二值水印圖像由message=double(imread('watermark.bmp'))實現 ,message是一個由0和1組成的二維數組。
將置亂的水印序列嵌入所選的dct系數中,源代碼如下所示:
其中dct3a是DCT系數,index[20]是紋理敏感性和亮度敏感性都比較好的一塊,S作為密鑰由版權所有者保管。
S=60;
T1=S/4;
T2=3*T1;
for i=1:64
for j=1:64
if (w2(i,j)==1)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T1;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T1;
end
end
if (w2(i,j,:)==0)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T2;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T2;
end
end
end
end
第五步:三維DCT反變換;
先對塊的第一幀進行二維DCT反變換,然後在對其它三幀進行二維反變換,最後對幀間方向進行一維DCT反變換。此過程由Matlab實現如下:
二維DCT反變換:
idcta(:,:,1,index(20))=idct2(dipin);
for i=2:4
idcta(:,:,i,index(20))=idct2(dct3a(:,:,i,index(20)));
end
對每一塊的幀間方向進行一維DCT反變換
for i=1:64
for j=1:64
idct3a(i,j,1:4,index(20))=idct(idcta(i,j,1:4,index(20)));
end
end
第六步:把這些數據放入原位置;
第七步:寫視頻文件;
寫視頻文件由以下程序實現,其中fileId為寫入視頻文件的位置。
fileId = fopen('vectra_w.yuv','wb')
fwrite(fileId,Y(:,:,i)' , 'uchar');
fwrite(fileId,u(:,:,i)' , 'uchar');
fwrite(fileId,v(:,:,i)' , 'uchar');
效果如圖4-4所示:
圖4-4 嵌入水印的視頻
4.2水印的檢測過程
水印的檢測過程就是嵌入水印的逆過程,其Matlab實現如下所示:
filename='vectra_w.yuv';此文件是對含有水印的視頻(可能是被攻擊過後的視頻)文件。
[yuv,Y,u,v,num_f]=loadyuv(filename);
讀取視頻文件和三維DCT正變換其原理和嵌入過程相同,此處不再贅述。
提取水印數據在Matlab中由以下程序實現,其中S、T1、T2等都是嵌入時的密鑰,版權所有者擁有它。
for i=1:64
for j=1:64
if (mod(abs(dct3b(i,j,1,index(20))),S)<((T1+T2)/2))
shuiyin(i,j)=1;
end
if (mod(abs(dct3b(i,j,1,index(20))),S)>=((T1+T2)/2))
shuiyin(i,j)=0;
end
end
end
Arnold反變換如下所示:
w0=shuiyin;
w2=Arnold(w0,Hm,Wm,40);
w0是檢測到的水印數據,Hm和Wm是水印數據的行和列,變換次數為40。
寫水印文件,檢測水印圖像存在與否,並且和原水印圖像有無差異。
imwrite(w2,'恢復.bmp', 'bmp');
imshow('恢復.bmp');
綜上,水印的嵌入主要經過將視頻和水印分別進行預處理,然後根據嵌入演算法選擇水印的合適嵌入位置以及合理嵌入策略,從而得到含水印的視頻數據。在各個環節中採用HVS特性來提高視頻水印的魯棒性.最後用相應的視頻水印檢測策略提取出水印從而實現視頻的保護。結果顯示本文演算法能成功提取出水印圖像
Ⅶ matlab中lsqnonlin函數出錯
這個不能算lsqnonlin函數出錯吧?
前面一個是兼容性警告,告訴你在將來的版本中可能不再支持LevenbergMarquardt 和LargeScale這兩個選項,並且,如果不想看到該警告信息,可以設置Algorithm為 'levenberg-marquardt',也就是把原代碼中的
options=optimset('LargeScale','off','LevenbergMarquardt','on','Display','iter','MaxFunEvals',20000,'MaxIter',1000);
改為
options=optimset('Algorithm','levenberg-marquardt','Display','iter','MaxFunEvals',20000,'MaxIter',1000);
第二個是告訴你演算法終止的原因是,步長已小於給定值。由於優化是一個按照某些規則反復進行迭代的過程,到最後收斂時通常是一個漸進的過程,所以設定一個步長限制,一旦相鄰兩次迭代的步長很小,以至於可以認為沒有區別了,那麼演算法就會終止。至於所求出來的是不是最優解,會取決於多種條件,例如問題本身、演算法以及初值等因素。當然,你可以用optimset函數把TolX設置更小一些,但由於原因並不在此,一般不會有什麼作用,還不如考慮試一試其它初值。
函數wucha中cmat並沒有定義,你這段代碼不能運行,所以,我也無法對優化的結果是否合理做進一步分析。
Ⅷ matlab如何編寫共享參數擬合程序
你在matlab下的commend window里輸入cftool,然後在x data下選擇t在y data下選擇y。接著在右邊的下拉框里選擇custom equation,在custom equation下面輸入c0+c1*exp(-x/a1)+c2*exp(-x/a2),然後它就輸出結果了(cftool的左下邊會出來結果)。我算的結果是a1=0.03832;a2=1.194;c0=250.6;c1=-0.928;c2=6.035;R方是0.9653. (你還可以在fit option里選擇演算法,推薦LM演算法)。希望採納哦!
Ⅸ 請問如何用Matlab的人工神經網路工具箱來實現地質災害預測
matlab程序嗎?這個不難得,你搜一下能搜到很多的。
採用bp神經網路的LM演算法
先構建訓練集和測試集
然後創建神經網路,設定相應得參數
然後訓練網路(利用訓練集)
最後利用sim函數和測試集進行模擬
建議去圖書館找本matlab的書 一般都有神經網路介紹的
Ⅹ Matlab如何做空間計量回歸模型LM檢驗
x=[143 145 146 147 149 150 153 154 155 156 157 158 159 160 162 164]';
X=[ones(16,1) x]; 增加一個常數項
Y=[88 85 88 91 92 93 93 95 96 98 97 96 98 99 100 102]';
[b,bint,r,rint,stats]=regress(Y,X)
得結果:b = bint =
-16.0730 -33.7071 1.5612
0.7194 0.6047 0.8340
stats = 0.9282 180.9531 0.0000
即對應於b的置信區間分別為[-33.7017,1.5612]、[0.6047,0.834]; r2=0.9282, F=180.9531, p=0.0000
p<0.05, 可知回歸模型 y=-16.073+0.7194x 成立.
這個是一元的,如果是多元就增加X的行數!