我有一个单位8的NxMx3矩阵,每个(x,y,:)是RGB值的矢量。我试图通过简单地将东和南相邻值复制一个像素来进行像素倍增插值。
eastNeighbors = [img(2:end,:,:)];
southNeighbors = [img(:,2:end,:)];
filtered = img + eastNeighbors + southNeighbors;
这个问题是我得到一个"数组维度必须匹配二进制数组op。"错误。
如何将[0,0,0]元素的行和列分别添加到eastNeighbors和southNeighbors?
修改:实际上,不应该有一种方法来实现filter2吗?这基本上是FIR滤波器输出(x,y)= in(x,y)+ in(x-1,y-1),对吗?
试过这个:
h = [[1 1] [1 1]];
filtered = filter2(h, img);
得到"没有足够的输入参数。"错误。
答案 0 :(得分:3)
这可能就是你所追求的 -
方法1:使用nlfilter
进行滑动邻域操作
fun1 = @(x) sum([x(2,2) x(3,2) x(2,3)]);
OUTPUT_IMG = nlfilter(INPUT_IMG, [3 3], fun1);%%// INPUT_IMG is a gray image
方法2 :使用padarray
填充零来使用直接求和来匹配矩阵大小
southNeighbors = padarray(INPUT_IMG(2:end,1:end),[1 0],'post');
eastNeighbors = padarray(INPUT_IMG(1:end,2:end),[0 1],'post');
OUTPUT_IMG = INPUT_IMG + eastNeighbors + southNeighbors;
一般说明:
如果您正在寻找interpolation
,也许您希望找到这三个像素的平均值,因此除以3
。请注意uint8
数据类型,因为它会在总结时剪切255
处的值。
此外,您可能希望保留最后一行和列与原始图像中的相同,因为它们没有东部和南部相邻像素,因此请使用此 -
OUTPUT_IMG(:,end) = INPUT_IMG(:,end);
OUTPUT_IMG(end,:) = INPUT_IMG(end,:);
答案 1 :(得分:1)
要填充您感兴趣的图像,可以使用cat()和0(如下)的组合:
eastNeighbors = cat(2, zeros(size(img,1), 1, size(img,3)), img(:,2:end,:));
southNeighbors = cat(1, zeros(1, size(img,2), size(img,3)), img(2:end,:,:));
filtered = img + eastNeighbors + southNeighbors;
答案 2 :(得分:1)
您可以使用convn执行此操作,如下所示:
filtered = convn(img, [0 1 0; 1 1 0; 0 0 0]);