积分图像的应用(一):局部标准差

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

局部标准差:

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

其中

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

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

,故:

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

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

时间复杂度:

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

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;<span style="font-family: Arial, Helvetica, sans-serif;">%局部像素点个数</span>
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);%标准差公式
    end
end
Std=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);
    end
end
Std=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
    end
end

main.m:

clear all;
close all;
clc;
Img=double(imread('lena.tif'));
d=1;
tic
J1=Localstd(Img,d);
toc
tic
J2=fastLocalstd(Img,d);
toc
figure;
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。

时间: 2024-10-10 18:03:46

积分图像的应用(一):局部标准差的相关文章

积分图像的应用(二):非局部均值去噪(NL-means)

非局部均值去噪(NL-means)一文介绍了NL-means基本算法,同时指出了该算法效率低的问题,本文将使用积分图像技术对该算法进行加速. 假设图像共像个素点,搜索窗口大小,领域窗口大小, 计算两个矩形邻域间相似度的时间为,对于每个像素点需要计算它与搜索窗口内个像素间的相似度,故NL-means复杂度为 . 经过分析可以发现,该算法可以提高之处只有邻域间相似度的计算,即耗时的操作.基本算法中,每次计算邻域间距离时都需要遍历两个邻域,逐对像素点求差值. 如果我们先构造一个关于像素差值的积分图像:

[blogs 算法原理 ]局部标准差实现对比度增强

基于“局部标准差”的图像增强(原理.算法.代码) 一.理论 图像增强算法的基本原则是“降低低频区域,突出高频区域”,以此强化边缘,达到增强的目的.最简单的例子就是通过原始图像减去高斯模糊处理后的图像,就能够将边缘强化出来. 直方图均衡化也是一种非常常见的增强方法.但是为了避免背景的干扰,更倾向于采用“局部”方法进行处理.我们这里着重研究自适应对比度增强(ACE)的相关内容. ACE的定义和原理(TODO) ACE算法的相关内容: 计算低频成分: 对于具体的像素,一般可以通过计算以该像素为中心的局

【练习6.14】积分图像cvIntegral及使用积分图的性质找横向和纵向边,IplImage结构中widthStep细节

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 加载一副灰度图,得到它的积分图.利用积分图的性质找到图像里的横向和纵向边缘. 利用细长的矩形,在适当的位置减去或加上它们. 备注:边缘查找尚未加入代码 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6

积分图像 Integral

实现子区域的快速求和,在人脸识别及相关算法中应用的Haar小波中很有用 原理: 计算一个简单矩形区域((x1,y1),(x2,y2))中像素的和: 核心函数: cvIntegral 程序: 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> int integral(int argc,char** argv) { CvMat

OpenCV2:等间隔采样和局部均值的图像缩小

图像的缩小从物理意义上来说,就是将图像的每个像素的大小缩小相应的倍数.但是,改变像素的物理尺寸显然不是那么容易的,从数字图像处理的角度来看,图像的缩小实际就是通过减少像素个数来实现的.显而易见的,减少图像的像素会造成图像信息丢失.为了在缩小图像的同时,保持原图的概貌特征不丢失,从原图中选择的像素方法是非常重要的.本文主要介绍基于等间隔采样的图像缩小和基于局部均值的图像缩小以及其在OpenCV2的实现. 基于等间隔采样的图像缩小 这种图像缩小算法,通过对原图像像素进行均匀采样来保持所选择到的像素仍

机器视觉中的图像积分图及其实现

计算机视觉中,人脸检测(Face Detection)是一项常见的任务.Paul Viola和Michael Jones在<Rapid object detection using a Boosted cascade ofsimple features>一文中提出的快速对象识别算法将人脸检测推向了一个新的高度,这种将Adaboost 和Cascade 算法综合运用的实时人脸检测系统,使人脸检测这项工作具有了更为实际的意义和价值.其中,为了加速Haar特征的计算,他们提出了积分图的概念. 坐标点

机器视觉中的图像积分图及事实上现

计算机视觉中,人脸检測(Face Detection)是一项常见的任务. Paul Viola和Michael Jones在<Rapid object detection using a Boosted cascade ofsimple features>一文中提出的高速对象识别算法将人脸检測推向了一个新的高度,这样的将Adaboost 和Cascade 算法综合运用的实时人脸检測系统,使人脸检測这项工作具有了更为实际的意义和价值. 当中.为了加速Haar特征的计算,他们提出了积分图的概念.

python库skimage 实现图像直方图全局均衡化、局部均衡化

函数 from skimage import exposure from skimage.morphology import disk from skimage.filters import rank # Global equalize img_rescale = exposure.equalize_hist(img) # Local Equalization selem = disk(30) img_eq = rank.equalize(img, selem=selem) 实验:低对比度图像全

图像局部特征点检测算法综述与应用举例

研究图像特征检测已经有一段时间了,图像特征检测的方法很多,又加上各种算法的变形,所以难以在短时间内全面的了解,只是对主流的特征检测算法的原理进行了学习.总体来说,图像特征可以包括颜色特征.纹理特等.形状特征以及局部特征点等.其中局部特点具有很好的稳定性,不容易受外界环境的干扰,本篇文章也是对这方面知识的一个总结. 本篇文章现在(2015/1/30)只是以初稿的形式,列出了主体的框架,后面还有许多地方需要增加与修改,例如2013年新出现的基于非线性尺度空间的KAZE特征提取方法以及它的改进AKAT