我正在尝试创建一个使用向量作为系数的过滤器。
imfilter
中使用的典型内核如下:
0 1 0
1 -4 1
0 1 0
如果每个元素都是标量,并且滤波基本上采用图像的3x3的所有窗口(MxN),则将像素值乘以匹配系数,并将所有乘积相加以放置输出像素。
我想扩展它,以便内核中的每个元素都不是标量,而实际上是一个向量(Px1)。这使得内核类似于3x3xP。其余功能应该相同:将系数(矢量)乘以图像像素(标量*矢量),求和所有乘积(相同维度的矢量之和),输出矩阵的尺寸应为(MxNxP)
我知道imfilter
不支持它并产生(MxN)的结果。
是否有其他Matlab函数可以执行此操作,还是需要从头开始实现?
一些评论:图像通常是逻辑的(0或1),一些滤镜元素可以为零,而不是总和。
答案 0 :(得分:0)
如果没有其他解决方案,我会蛮力。如果3x3过滤器中的每个向量都有P个元素,我将独立应用每个元素并对结果求和。
%load my image
im = imread(fname);
%define my kernel
h = zeros(3,3,P); % P elements deep
h(:,:,1) = [0 1 0; 1 -4 1; 0 1 0]; %first element my kernel
h(:,:,2) = [0.2 1.5 0.2; 1.5 -6 1.5; 0.2 1.5 0.2]; %second element
%keep adding elements until you get your P elements
%loop over each element in your kernel
output = zeros(size(im))
for I=1:size(h,3)
output = output + imfilter(im,h(:,:,I)); %apply filter and accumulate
end