用MATLAB进行图像处理

图像处理概念,算法和MATLAB

快速局部和,积分图象,和积分盒滤波

2006年5月,我写道 关于一种快速计算图像局部和的技术。今天,我想用图像处理工具箱中关于积分图像和积分框滤波功能的额外信息更新这篇文章。
首先,让我们回顾一下局部和的概念。
A =魔术(7)
一个= 7×7
30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20
的局部和 $3 \乘以3$ 元素(2,3)的邻域 一个 可以这样计算:
submatrix = A(1:3, 2:4)
子矩阵= 3×3
39 48 1 47 7 9 6 8 17
Local_sum_2_3 = sum(submatrix,“所有”
Local_sum_2_3 = 182
在图像处理应用中,我们通常对局部和除以邻域中元素的数量感兴趣,在本例中为9:
local_sum_2_3/9
Ans = 20.2222
计算矩阵的所有局部和,除以邻域大小,与使用局部均值滤波器执行2-D滤波相同,如下所示:
B = imfilter(A,ones(3,3)/9);
B(2、3)
Ans = 20.2222
这通常被称为 框过滤器 .计算一个 $N \乘以N$ 盒子过滤器为整个 P乘以Q 图像似乎需要近似 美元PQN ^ 2美元 操作。换句话说,对于一个固定的图像大小,我们可以期望盒滤波器的计算时间按比例增加 N ^ 2美元 ,在那里 N 本地和窗口大小。
让我们看看有多长时间 imfilter 对于变化的局部和邻域大小。
I =兰特(3000,4000);
Nn = 15:10:205;
Imfilter_times = 0 (size(nn));
K = 1:长度(nn)
N = nn(k);
f = @() imfilter(I,ones(n,n)/n²);
Imfilter_times (k) = timeit(f);
结束
imfilter_times情节(nn)
标题(“使用过滤器的盒子过滤器执行时间”
包含(“窗口大小”
ylabel (“时间(s)”
这个函数 imfilter 执行效果比预期的好,执行时间仅随窗口大小线性增加。(这是因为 imfilter 利用了过滤器的可分离性, 我之前写过的 .)
但是我们可以更快地计算局部和,通过使用an 积分图像 ,又称a 总计部分表 .让我们回到魔方的例子,使用这个函数 integralImage
Ai = integralImage(A)
Ai = 8×8
00 00 00 30 69 117 118 128 147 175 0 68 154 209 219 247 293 350 0 114 206 269 296 350 431 525 0 119 225 304 356 444 561 700 0 132 253 356 441 571 732 875 0 153 297 432 558 731 895 1050 0 175 350 525 700 875 1050 1225
的每个元素 人工智能 是A中所有在上面和左边的元素的累积和。 人工智能(4,3) ,也就是206,是所有元素的和 (1:2, 1:3)
(1:2, 1:3)
ans = 3×2
30 39 38 47 46 6
总和(ans,“所有”
Ans = 206
人工智能(4,3)
Ans = 206
用一般公式表示,积分像为 ai (m, n) =美元\ sum_ {p = 1} ^ {m - 1} \ sum_ {q = 1} ^ {n} (p, q)美元
关于积分像,真正有趣的是, 人工智能 它能让你计算的和 任何 的矩形子矩阵 一个 通过四个数字的加减法。具体来说,是所有元素的和 (m1, m2, n1: n2) 人工智能(m2 + 1, n2 + 1) - Ai (m1, n2 + 1) Ai (m2 + 1, n1) +人工智能(m1, n1) .考虑计算所有元素的和 (3:5, 2:6)
M1 = 3;
M2 = 5;
N1 = 2;
N2 = 6;
(m1, m2, n1: n2)
ans = 3×5
6 8 17 26 35 14 16 25 34 36 15 24 33 42 44
总和(ans,“所有”
Ans = 375
人工智能(m2 + 1, n2 + 1) - Ai (m1, n2 + 1) Ai (m2 + 1, n1) +人工智能(m1, n1)
Ans = 375
如果我们有一个积分图像,那么,我们可以通过将四个项相加来计算盒滤波器输出的每个元素。换句话说,盒子滤波的计算可以独立于盒子滤波窗口的大小!
图像处理工具箱功能 integralBoxFilter 为你做这个。你给它一个积分图像,它会返回应用于原始图像的盒子过滤器的结果。
让我们看看改变盒子过滤器窗口大小需要多长时间。
Integral_box_filter_times = 0(1,长度(nn));
K = 1:长度(nn)
N = nn(k);
h = @() integralBoxFilter(Ai,n);
Integral_box_filter_times (k) = timeit(h);
结束
情节(nn、integral_box_filter_times...
神经网络,imfilter_times)
传奇([“integralBoxFilter”“imfilter”],...
位置=“西北”
标题(“框过滤器执行时间”
包含(“窗口大小”
ylabel (“时间(s)”
看起来很棒!正如所料, integralBoxFilter 速度快,执行时间与窗口大小无关。为了公平起见,我们应该包括计算积分像所需的时间。
Integral_box_filter_total_times = 0(1,长度(nn));
K = 1:长度(nn)
N = nn(k);
r = @() integralBoxFilter(integralImage(I),n);
Integral_box_filter_total_times (k) = timeit(r);
结束
情节(nn、imfilter_times...
神经网络、integral_box_filter_times...
神经网络,integral_box_filter_total_times)
标题(“框过滤器执行时间”
包含(“窗口大小”
ylabel (“时间(s)”
传奇([“imfilter”“integralBoxFilter”“integralImage + integralBoxFilter”],...
位置=“西北”
从图中,我们可以看到使用积分图像进行框滤波是可行的,即使考虑到计算积分图像所需的时间。
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map