我尝试使用colfilt功能通过图像运行自定义过滤器。该滤波器基本上在图像中运行窗口nxn,并将中心像素替换为其最小和最大总和的一半。这就是代码的样子:
colfilt(image, 3, "sliding", @(x) (min(x(:))+max(x(:)))/2)
但是,我收到此错误:
error: col2im: can't resize B in matrix sized (A_SIZE - BLOCK_SIZE +1)
error: called from:
error: /usr/share/octave/packages/image-2.2.1/col2im.m at line 143, column 9
error: /usr/share/octave/packages/image-2.2.1/colfilt.m at line 152, column 9
如果我用nfilter替换该函数,如下所示
nlfilter(image, [n n], @(x) (min(x(:))+max(x(:)))/2)
它工作正常,但速度太慢,所以我认为第一个选项必须更好。
有谁知道如何让它发挥作用?
提前致谢。
答案 0 :(得分:2)
您需要更仔细地阅读colfilt
的文档。以下是关于sliding
选项的说法:
B = colfilt(A,[M N],'sliding',FUN) rearranges each M-by-N sliding
neighborhood of A into a column in a temporary matrix, and then applies
the function FUN to this matrix. FUN must return a row vector containing
a single value for each column in the temporary matrix. (Column
compression functions such as SUM return the appropriate type of
output.) colfilt then rearranges the vector returned by FUN into a
matrix of the same size as A.
关键句是: FUN
必须返回一个行向量,其中包含临时矩阵中每列的单个值。 colfilt
的作用是转换每个像素邻域到一个列并连接所有这些列以放入临时矩阵。因此,每列代表单个像素邻域。因此,您需要编写匿名函数,使得输出将是单行向量,其中此行向量中的每个元素是如果将函数应用于每个像素邻域中将会发生的输出结果。这个临时矩阵的列。因此,您只需修改匿名函数即可:
out = colfilt(image, [3 3], 'sliding', @(x) ((min(x)+max(x))/2));
请注意,您需要将第二个输入指定为[3 3]
,而不是仅在帖子的评论中注明的单个数字3。现在应该独立地找到每列的最小值,用每列的最大值添加它,然后除以2.此行向量现在应输出您已处理的每个像素邻域的结果。