自動聚焦需要評判圖像的模糊或者清晰程度。
當然,真正聚焦還需要配合硬件,我現在已經不搞硬件了,所以也就不去關心那一方面了。
主要有三種評判方法:
1.灰度方差法
評判圖像灰度的變化程度,我先使用了全局灰度方差,不過效果不好。又實驗了局部灰度方差,不過由於運算量的問題,也沒做出什么結果。
2.邊緣評判法
這個很簡單了,通過對圖像進行邊緣檢測,比如sobel,prewitt,roberts等等各種邊緣檢測吧,然后找出邊緣最豐富的那一張圖片。
3.能量法
圖像細節越豐富,傅里葉分解后的頻率肯定越多,所以能量也能作為一種評判標准。
我這里的實驗圖像序列在這里可以下到。
實驗結果,圖中紅色是sobel評判,綠色是二階拉普拉斯評判,藍色是能量評判,最后結果是一樣的。
代碼如下:
clear all; close all; clc; re=[]; ws=fspecial('sobel'); wl=[1 -2 1]; %這里為二階的,wl=[1 -1]一階的也行 for i=1:92 s=[]; filename=strcat(num2str(i),'.jpg'); img=imread(filename); img=mat2gray(rgb2gray(img)); [m n]=size(img); img1=imfilter(img,ws,'replicate'); %sobel方法聚焦 img2=imfilter(img,ws','replicate'); imgn=sqrt(img1.^2+img2.^2); s=[s sum(imgn(:))]; img1=imfilter(img,wl,'replicate'); %二階拉普拉斯方法聚焦 img2=imfilter(img,wl','replicate'); imgn=sqrt(img1.^2+img2.^2); s=[s sum(imgn(:))]; %{ %灰度方差聚焦,全局方差好像不行,局部的在這里,運行時間太長了沒試 imgn=zeros(m,n); for p=2:m-1 for q=2:n-1 u=mean(mean(img(p-1:p+1,q-1:q+1))); imgn(p,q)=mean(mean((u-img(p-1:p+1,q-1:q+1)).^2)); end end s=[s sum(imgn(:))]; %} f=fft2(img); %能量方法聚焦 s=[s sum(sum(sqrt(imag(f).^2+real(f).^2)))]; re=[re;s]; end col=['r','g','b']; for i=1:3 [junk index]=max(re(:,i)); index plot(mat2gray(re(:,i)),col(i)); %為了合理顯示,全部數據壓縮到0-1之間 hold on; end