博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
积分图像的应用(一):局部标准差 分类: 图像处理 ...
阅读量:6293 次
发布时间:2019-06-22

本文共 2305 字,大约阅读时间需要 7 分钟。

局部标准差在图像处理邻域具有广泛的应用,但是直接计算非常耗时,本文利用积分图像对局部标准差的计算进行加速。

局部标准差:

标准差定义如下(采用统计学中的定义,分母为):

其中

为了计算图像的局部标准差,首先设定局部区域的大小为 ,则局部区域的像素点个数

对标准差的公式进行化简:

,故:

可以看出,局部标准差计算中需要对图像进行局部求和操作,即

我们可以先分别计算出图像的积分图像,这样就能在常量时间计算出上述的局部和。

时间复杂度:

图像中共个像素点,每个局部区域共有个像素点,直接计算局部标准差的时间复杂度 ,利用积分图像计算局部标准差的时间复杂度为。(计算积分图像的时间为 、计算一个像素点的局部标准差需要常量时间,共个像素点,故最后的计算复杂度仍为 

Matlab程序:

Localstd.m:直接计算图像的局部标准差

function Std=Localstd(Img,d)[m,n]=size(Img);Var=zeros(m,n);Img = padarray(Img,[d d],'symmetric');%边界填充N=(2*d+1)^2;for i=1:m    for j=1:n        i1=i+d;        j1=j+d;        B=Img(i1-d:i1+d,j1-d:j1+d);%取局部区域        Var(i,j)=sum(sum((B-mean(B(:))).^2))/(N-1);%标准差公式    endendStd=sqrt(Var);

fastLocalstd.m:利用积分图像进行快速计算

function Std=fastLocalstd(Img,d)[m,n]=size(Img);Img = padarray(Img,[d+1 d+1],'symmetric');%边界填充Img2=Img.^2;Int=integral(Img);%计算Img的积分图像Int2=integral(Img2);%计算Img^2的积分图像Var=zeros(m,n);N=(2*d+1)^2;%局部像素点个数for i=1:m    for j=1:n        i1=i+d+1;        j1=j+d+1;        %利用积分图像求局部和        sumi2=Int2(i1+d,j1+d)+Int2(i1-d-1,j1-d-1)-Int2(i1+d,j1-d-1)-Int2(i1-d-1,j1+d);        sumi=Int(i1+d,j1+d)+Int(i1-d-1,j1-d-1)-Int(i1+d,j1-d-1)-Int(i1-d-1,j1+d);        Var(i,j)=(sumi2-sumi^2/N)/(N-1);    endendStd=sqrt(Var);

function I=Integral(Img) Img=double(Img);[m,n]=size(Img);I=zeros(m,n);for i=1:m    for j=1:n        if i==1 && j==1             %积分图像左上角            I(i,j)=Img(i,j);        elseif i==1 && j~=1         %积分图像第一行            I(i,j)=I(i,j-1)+Img(i,j);        elseif i~=1 && j==1         %积分图像第一列            I(i,j)=I(i-1,j)+Img(i,j);        else                        %积分图像其它像素            I(i,j)=Img(i,j)+I(i-1,j)+I(i,j-1)-I(i-1,j-1);          end    endend

main.m:

clear all;close all;clc;Img=double(imread('lena.tif'));d=1;ticJ1=Localstd(Img,d);tocticJ2=fastLocalstd(Img,d);tocfigure;imshow([Img/max(Img(:)),J1/max(J1(:)),J2/max(J2(:))]);

lena.tif大小为256*256,Localstd运行时间为 0.984451s,而fastLocalstd运行时为0.025528s。

当然,对于局部标准差,Matlab本身提供了函数stdfilt,下面是它的核心代码:

function Std=Stdfilt(I,d)I=double(I);h=ones(2*d+1);n=(2*d+1)^2;conv1 = imfilter(I.^2,h,'symmetric') / (n-1); conv2 = imfilter(I,h,'symmetric').^2 / (n*(n-1));Std = sqrt(conv1-conv2);

可以看出,它按照化简后的公式直接对图像进行卷积操作,因为imfilter函数是使用c实现的,且内部应该进行了优化,故速度较快。对上面的lena.tif运行时间为:0.064522s。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/luo-peng/p/4646216.html

你可能感兴趣的文章
Nginx upstream的几种分配方式
查看>>
《互联网运营智慧》第7章“简单cdn”正式版下载
查看>>
如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!
查看>>
基于Xcode原型驱动的iOS应用设计
查看>>
SOA标准之----SCA架构思想
查看>>
9.VMware View 4.6安装与部署-connection server(View Replica Server)
查看>>
项目管理和产品管理绉议
查看>>
一步一步SharePoint 2007之三十七:在SharePoint中实现Workflow(3)——运行Workflow
查看>>
后端码农谈前端(CSS篇)第三课:选择器
查看>>
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
查看>>
编程之基础:数据类型(二)
查看>>
倒排索引PForDelta压缩算法——基本假设和霍夫曼压缩同
查看>>
java基础--相等
查看>>
记一次网站服务器搬迁实录
查看>>
Sql server restore script(还原数据库正确的步骤)
查看>>
探秘重编译(Recompilations)(1/2)
查看>>
Lucene.Net 的“System.IndexOutOfRangeException: 索引超出了数组界限”错误
查看>>
Android杂谈--layout的横竖屏处理
查看>>
升级Windows Phone Developer Tools Beta
查看>>
从四个数字中选出三个,一共有多少组合?不重复的
查看>>