gpt4 book ai didi

Matlab im2col 函数

转载 作者:行者123 更新时间:2023-12-02 21:59:10 39 4
gpt4 key购买 nike

这是一个比较笼统的问题,但是,无论我阅读多少遍 MATLAB 的 im2col 函数的描述,我都无法完全理解它。我需要它来提高计算效率,因为 MATLAB 的嵌套 for 循环非常糟糕。这是我尝试做的事情,但使用嵌套 for 循环:

 [TRIMMED]=TM_FILTER(IMAGE, FILTER_SIZE, PERCENT)
Takes a 2-D array and returns the array, filtered with a
square trimed mean filter with length/width equal to FILTER_SIZE and percent equal to PERCENT.

%}
function [trimmed]=tm_filter(image, filter_size, percent)
if rem(filter_size, 2)==0 %make sure filter has a center pixel
error('filter size must be odd numbered'); %error and return if number is odd
return
end
if percent > 100 || percent < 0
error('Percentage must be ? [0, 100]');
return
end

[rows, columns]=size(image); %figure out pixels needed
n=(filter_size-1)/2; %n is pixel distance from center pixel to boundaries
padded=(padarray(image, [n,n],128)); %padding on boundaries so center pixel always has neighborhood

for i=1+n:rows %rows from first non-padded entry to last nonpadded entry
for j=1+n:columns %colums from first non-padded entry to last nonpadded entry
subimage=padded(i-n:i+n,j-n:j+n); %neighborhood same size as filter
average=trimmean(trimmean(subimage, percent), percent); %computes trimmed mean of neighborhood as trimmed mean of vector of trimmed means
trimmed(i-n, j-n)=average; %stores averaged pixel in new array
end
end
trimmed=uint8(trimmed); %converts image to gray levels from 0-255

最佳答案

这是您想要的代码:请注意,整个嵌套循环已替换为单个语句。

 [TRIMMED]=TM_FILTER(IMAGE, FILTER_SIZE, PERCENT)
Takes a 2-D array and returns the array, filtered with a
square trimed mean filter with length/width equal to FILTER_SIZE and percent equal to PERCENT.

%}
function [trimmed]=tm_filter(image, filter_size, percent)
if rem(filter_size, 2)==0 %make sure filter has a center pixel
error('filter size must be odd numbered'); %error and return if number is odd
return
end
if percent > 100 || percent < 0
error('Percentage must be ? [0, 100]');
return
end

trimmed = (uint8)trimmean(im2col(image, filter_size), percent);

说明:

im2col 函数将 filter_size 的每个区域转换为一列。然后,您的 trimmean 函数可以在单个操作中对每个区域(列)进行操作 - 比依次提取每个形状要高效得多。另请注意,这仅需要一次 trimmean 应用程序 - 在您的原始版本中,您首先在列上执行此操作,然后再次在行上执行此操作,这实际上会导致比我认为您预期的更严重的修剪(不包括第一次 50%,然后再次 50% - 感觉就像排除 75%。不完全正确,但你明白我的意思)。此外,您还会发现更改操作顺序(行,然后列与列,然后行)会改变结果,因为过滤器是非线性的。

例如

im = reshape(1:9, [3 3]);
disp(im2col(im,[2 2])

结果

1  2  4  5
2 3 5 6
4 5 7 8
5 6 8 9

因为您从此矩阵中取出了 4 个可能的 2x2 block :

1  4  7
2 5 8
3 6 9

并将它们变成列

注意 - 使用此技术(应用于未填充的图像),您确实会丢失边缘上的一些像素;您的方法添加了一些填充,以便每个像素(即使是边缘上的像素)都有一个完整的邻域,因此过滤器返回与原始大小相同的图像(但不清楚填充/过滤的效果如何)靠近边缘,尤其是角落:几乎 75% 的像素固定在 128,这可能会主导角落的行为)。

关于Matlab im2col 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17220723/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com