【问题标题】:using convolution function in Matlab在 Matlab 中使用卷积函数
【发布时间】:2016-11-07 00:36:41
【问题描述】:

我有一张灰度图像。我想为图像的每个像素计算 Del,其中

del =  sum(absoluteValue(anypixelInensity - it's 8 neighbors Pixel Intensity) 

I = imread('crop.bmp');


%KERNEL
windowSize = 3;
kernel = -1 * ones(3,3);
del = abs(conv2(double(I), double(kernel), 'same'));
disp(I)
disp(del)

我想用 matlab conv2 函数来实现它。这将从其邻居中减去当前像素强度并给出绝对和。

例如:

10 2 3
12 15 7
4 5 6

del(1,1) = abs(10-2)+abs(10-12)+abs(10-15)
or del(2,2) = abs(15-10)+abs(15-2)+abs(15-3)+abs(15-12)+abs(15-7)+abs(15-4)+abs(15-5)+abs(15-6)

【问题讨论】:

  • 我认为您不能将abs 合并到conv2 的过滤器中。我会做一些检查,看看是否有一些特殊的过滤器可以实现这一点。
  • 我认为这需要nlfilter 和一个自定义函数。让我试试看。

标签: matlab image-processing


【解决方案1】:

这个有点棘手,因为正如@AnderBiguri 所说,内核中的abs 使它成为非线性的,所以conv2 不起作用。

但是,您可以将nlfilter 与自定义函数一起使用。 (这个实现使用nansum,它在Statistics Toolbox中。如果你不能使用这个函数,我可以给你一个备用函数,用nansum会更容易。)

另一个困难是我们必须以不弄乱总和的方式处理图像边框。这意味着我们已经自己处理了图像填充。我选择使用nan 值来填充。我也很懒惰,对windowSize 假设了一个奇怪的值。如果情况并非总是如此,我们将不得不调整填充。

% windowSize assumed to be odd; window assumed to be square
windowSize = 3;

% pad the input image
% padsize is how far the window extends beyond anchor
padsize = floor(windowSize/2);
A = padarray(I, [padsize, padsize], nan);

% create an anonymous function for nlfilter to use
% calculate row/column number of anchor within its neighborhood
anchor = ceil(windowSize/2);
% subtract the anchor element from its neighbors
%   then sum the neighbors *not* equal to NaN
%   (value at anchor position will be 0)
f = @(x) sum(nansum(abs(x-x(anchor,anchor))));

% filter padded image, and then crop off the padding
del = nlfilter(A, [windowSize, windowSize], f);
del = del(1+padsize:end-padsize, 1+padsize:end-padsize);

【讨论】:

  • 太棒了!但是大图像的烧杯需要一段时间来处理。有没有可能让它更快?
  • 这似乎需要很长时间。我去看看。
  • 我没有看到明显的方法来加快这个速度。双 for 循环实际上要快一点,但并不显着。
  • 我明白了。我使用了一张耗时 21 秒甚至更长时间的图像!
【解决方案2】:

是的,conv2 函数自己进行卷积。

给定一个图像A 和一个内核k

imout=conv2(A,k);

会给你内核在图像上的卷积。

Read the documentation

但是,您可能希望使用imfilter,因为它支持更好的不同类型的图像。

【讨论】:

  • 我已经编辑了这个问题。请发表您的意见。
  • @Nektar 如果您使用conv2,那么您不需要循环,conv2 可以完成这项工作。如果你想用循环来做,那么你需要自己写。当然,我们不会为你做,因为如果你需要自己写,那就意味着这是功课。
  • 我已经用循环完成了(见编辑过的问题)。但我想用 conv2 来实现更快的执行。我坚持的是定义内核。我尝试了一个小的 4*4 矩阵,但我不明白如果我使用 conv2 应该如何定义内核。
  • 如果你正在做一个平均内核,那么如果你乘以特定像素中的图像,内核将是这样的东西,它会给你周围的平均值。例如。 3x3 平均内核如下所示:kernel=[1 1 1; 1 1 1; 1 1 1]*1/9
  • 我想从它的 8 个邻居中减去任何像素强度,然后想取减法结果的绝对和。那么我应该如何为 may 程序定义 3*3 内核。我正在尝试: kernel = -1 * one(3,3);中点 = ceil(windowSize / 2); % 41. kernel(midPoint, midPoint) = windowSize^2 -1;但没有结果。
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2013-10-28
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多