1 半高寬的知識

2021-08-09 05:18:43 字數 4313 閱讀 4563

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...