现在的位置: 首页 > 综合 > 正文

matlab练习程序(图像自动聚焦)

2013年02月14日 ⁄ 综合 ⁄ 共 1145字 ⁄ 字号 评论关闭

自动聚焦需要评判图像的模糊或者清晰程度。

当然,真正聚焦还需要配合硬件,我现在已经不搞硬件了,所以也就不去关心那一方面了。

主要有三种评判方法:

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

 

抱歉!评论已关闭.