matlab中的插值函式為interp1,其呼叫格式為:yi= interp1(x,y,xi,'method')
matlab中插值函式彙總和使用說明
說明:x, y為原始資料點,yi為在xi點處的插值結果;x, y為向量,method最鄰近插值,』linear』線性插值,『spine』三次樣條插值,『cubic』立方插值。預設為線性插值。
所有的插值方法都要求x是單調的,並且xi不能夠超過x的範圍。
%只有光瞳,不含像差時的情況
xw = -1:2/511:1;
yw = -1:2/511:1;%[-1,1]分為511個間隔,即512個畫素點
fori = 1:length(xw)
forj = 1:length(yw)
p(i,j) = (sqrt(xw(i)^2 + yw(j)^2) <= 0.5);%光瞳的直徑佔影象的一半 居中
endend
imshow(p); title('無像差光瞳')
psf = fftshift(fft2(p));%使得頻譜居中
psf = abs(psf) .^ 2;%因為otf是光強,為幅度的平方
psf = psf ./ sum(psf(:));%能量歸一化
x = 1:1:512;
[psfmax, ind] = max(psf(:));%psf換成一列,找到最大值的索引
[i, j] = ind2sub(size(psf), ind);%把這個索引換成二維索引 約為257*257
%計算半高全寬是幾個畫素
hm = max(max(psf(257,x)))/2;%psf是對稱的,找257行/列的最大值(也就是上面的psfmax)
x1 = 1:0.1:512;
y1 = interp1(x, psf(257,:), x1);%原始資料是psf=f(x),x=1:1:512,但是要
%計算x1=1:0.1:512每隔0.1的值,因此要插值(預設線性插值)
count = 0;
for k = 1:length(x1)
if(y1(k) >= hm)
count = count +0.1;%因為步長是0.1,所以count也是0.1的增量
說明:光瞳如圖所示,這是無像差下的光瞳。計算出的fwhm也就是衍射極限下的半高寬,而根據衍射理論、傅利葉變換理論、取樣等推導,衍射極限的半高寬 = m/d。m為畫素大小(m*m),d為光瞳直徑。
假設m*m的影象,取樣點之間的間隔為dx。其fft變換後仍為m×
m 大小,頻域中間隔設為dw。
(1)根據取樣理論,fft變換頻域是空域的解析度關係為:dw
=1dx
×m(2)根據傅利葉光學衍射成像理論,otf是psf的傅利葉變換,psf是光瞳p在焦面上的弗朗禾費衍射,也即傅利葉變換,公式表達為:h(
fx,f
y)=f
ft(p
sf)=
fft(
fft(
p))=
p(−λ
fxzi
,−λf
yzi)
=p(λ
fxzi
,λfy
zi) psf弗朗禾費衍射圖樣不是標準的傅利葉變換,而是ps
f=uf
(u,v
)=k∫
∫ta(
x,y)
exp[
−j2π
λf(x
u+yv
)]所以,圖中dw就是uλ
f=dw
的間隔,也就是直接fft得到的影象的間隔。真實的psf的間隔不是fft的間隔,而是fft的間隔*lamada f。
(3)半高寬fw
hm=λ
fd。而要計算是幾個畫素,則要看半高寬與整個影象解析度的比例。fw
hmdv
=λfd
dv
可得fwhm = m/d.
我們有了衍射極限的半高寬。m/d。也可以通過如上述**計算得到。
我們的降質影象和復原影象,可以通過計算二者的psf,然後計算其半高寬,看是否達到衍射極限。
為什麼師兄的**中,直接看影象的截面即可算其半高寬?
因為他用的是點源影象,這樣得到的影象就是psf。而用lena作為輸入影象,得到的頻譜不是對稱的,無法去計算半高寬等東西。
同時,評價演算法質量的指標有很多,可以自己去看看。
下面是自己做的圖,無像差psf和含像差psf**,半高寬和截面對比。
無像差半高寬:fwhm1=2.1
有像差半高寬:fwhm2 = 8.3
%%半高寬作為評價演算法質量的例子
%材料準備:
%1.如上所示的光瞳 衍射極限fwhm=2
%2.加像差(加像差後的psf的fwhm=)
%3.復原影象得到的psf的半高寬
%只有光瞳,不含像差時的情況
xw = -1:2/511:1;
yw = -1:2/511:1;%[-1,1]分為511個間隔,即512個畫素點
fori = 1:length(xw)
forj = 1:length(yw)
p(i,j) = (sqrt(xw(i)^2 + yw(j)^2) <= 0.5);%光瞳的直徑佔影象的一半 居中
endend
imshow(p); title('無像差光瞳')
psf = fftshift(fft2(p));%使得頻譜居中
psf = abs(psf) .^ 2;%因為otf是光強,為幅度的平方
psf = psf ./ sum(psf(:));%能量歸一化
[psfmax, ind] = max(psf(:));%psf換成一列,找到最大值的索引
[i, j] = ind2sub(size(psf), ind);%把這個索引換成二維索引 約為257*257
%計算半高全寬是幾個畫素
x = 1:1:512;
hm = max(max(psf(257,x)))/2;%psf是對稱的,找257行/列的最大值(也就是上面的psfmax)
x1 = 1:0.1:512;
y1 = interp1(x, psf(257,:), x1);%原始資料是psf=f(x),x=1:1:512,但是要
%計算x1=1:0.1:512每隔0.1的值,因此要插值(預設線性插值)
count = 0;
for k = 1:length(x1)
if(y1(k) >= hm)
count = count +0.1;%因為步長是0.1,所以count也是0.1的增量
endend
fwhm = count
%加像差的psf.
a = rand(65,1)/10;
psf2 = psfotf_fun(a,65);
hm2 = max(max(psf2(257,:)))/2;%psf是對稱的,找257行/列的最大值(也就是上面的psfmax)
x1 = 1:0.1:512;
y1 = interp1(x, psf2(257,:), x1);%原始資料是psf=f(x),x=1:1:512,但是要
%計算x1=1:0.1:512每隔0.1的值,因此要插值(預設線性插值)
count2 = 0;
for k = 1:length(x1)
if(y1(k) >= hm2)
count2 = count2 +0.1;%因為步長是0.1,所以count也是0.1的增量
endend
fwhm2 = count2
%%畫圖分析
%無像差時的psf mesh看不出效果 還是要看截面
figure;plot(x, psf(257,:),'b', x, psf2(257,:),'r');
legend('無像差psf','有像差psf2');
css已知寬高和未知寬高的居中定位
1 已知寬高 上圖中我們想要對已知寬度的 服務範圍 進行左右居中定位,我們可以先選擇left或者right樣式,這裡我們選擇的是left,這裡的50 指的是這個盒子的最左側位於水平的百分之五十的地方,也就是中間位置,因為我們知道整體的寬度,所以我們可以直接採用在向左移動寬度的一半,也就是margin...
四 View 的測量寬高和最終寬高的區別
這個問題可以具體為getmeasuredheight 和getheight 有什麼區別。view public final intgetheight 再看看 mbottom mtop 是怎麼來的 view protected boolean setframe int left,int top,int...
獲取控制項的寬高
很多時候,在oncreate方法裡面我們需要獲取控制項的寬高,但是常用的方法只能在onresume方法之後才能呼叫 在此,有三種方法可以在oncreate方法裡面獲取到空間的寬高 方法一 int w view.measurespec.makemeasurespec 0 view.measurespe...