自动聚焦需要评判图像的模糊或者清晰程度。
当然,真正聚焦还需要配合硬件,我现在已经不搞硬件了,所以也就不去关心那一方面了。
主要有三种评判方法:
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