我正在做图像去噪工作,试图在我的矩阵中保持连续的线条(以一些宽松的方式),并删除随机的非零元素,这些元素并不是真正连接到我想要的线条。我遇到的问题详述如下:
我曾尝试编写一个滑动窗口函数,它将搜索我的2-D矩阵的行r,并查找非零数字。
对于每个非零数位,该函数应在行r和行r+1的2x2邻域(非零元素的两边各有2个数字)内查找是否存在非零元素(如果存在,还应查找r-1 )。
如果邻域为空,则应将行r中的原始元素置零,否则应保留窗口内的所有非零元素。
让事情更复杂的是,我还试图使滑动窗口成为圆形,这样当它到达行尾时,它不会被压缩,而是包括来自邻近行开始的数字。
对于所有行,我也只能保留一个“连接的”元素,如果它以某种方式连接到第1行,那么沿着我的矩阵的连续行不能从第2行开始。
这是我用Matlab语言中的for-loops编写的,在尝试操作窗口中的值时遇到了问题。除此之外,我的函数真的很慢。有没有一种方法可以不使用for-loops,也不需要任何预安装的工具箱就能在Matlab或Python中做到这一点呢?
示例Matlab代码:"test“是一个二进制矩阵(但并不是我要看的所有矩阵都是二进制的)。它包含5行。这是我为第1行编写的虚拟代码。窗口操作(代码的第4行)不起作用,但希望这能让您对我想要做的事情有所了解。这段代码还省略了矩阵的边,因为我不确定制作这个循环的最好方法。
n=2 % size of neighborhood to look at
p=size(test,2) % length of row
for ii=1+n:p-n;
if test(1,ii)==1;
if sum(test(2,(ii-2:ii+2))+test(1,(ii-2:ii+2)))>=2;
test(2,(ii-2:ii+2))=test(2,(ii-2:ii+2))*2;
else;
test(1,ii)=0;
end;
end;
end
var=test(2,:);
var(var==1)=0;
var(var>=2)=1;
test(2,:)=var;
Example matrix ("test"): (zeros replaced with '.' for better visualization)
. . . 1 . . 1 . . . . 1 1 1 . . . . . . .
1 . . . 1 . 1 . . . 1 . . . . . . . . 1 .
. . . . . 1 1 1 . . . 1 . . . . . . 1 . .
. . 1 . . . . . 1 . . . . . . . . . . 1 .
. . . . . . . . . 1 . . . . . 1 . . . . .
Desired output: (zeros replaced with '.' for better visualization)
. . . 1 . . 1 . . . . 1 1 1 . . . . . . .
. . . . 1 . 1 . . . 1 . . . . . . . . . .
. . . . . 1 1 1 . . . 1 . . . . . . . . .
. . . . . . . . 1 . . . . . . . . . . . .
. . . . . . . . . 1 . . . . . . . . . . .发布于 2013-06-29 01:32:35
下面是我认为你正在尝试做的事情的提纲:
步骤1:
通过对邻居的值求和,找出在其3x5邻域中具有非零元素的所有矩阵位置。我们还不想包含当前元素,因此中间是零。输入矩阵为test。
fil = [1 1 1 1 1; 1 1 0 1 1; 1 1 1 1 1];
A = conv2(test, fil, 'same');
第2步:
A现在包含大于1的值,因此将它们全部更改为1,而不使用零值。
A(A > 0) = 1;
第3步:
既然您已经标识了所有具有有效邻域的元素,那么就通过逐个元素的乘法将test与A结合起来,只留下那些在testand中都是非零的元素具有非零的邻居。
result = test .* A;
第0步:
填充-上面应该按原样工作,但行和列都用零填充。据我所知,您的填充要求是希望圆形行和列用零填充。
nCols = size(test, 2);
paddedTest = [zeros(1,nCols);...
test(:, nCols-1:nCols), test, test(:,1:2);...
zeros(1,nCols)];这显然会通过自己的填充来改变您正在处理的矩阵的大小,所以您需要更改卷积参数,以便返回一个与test大小相同的矩阵。
A = conv2(paddedTest, fil, 'valid');我现在没有可用的Matlab来测试这一点,但希望其他人能纠正我犯下的任何严重错误。
https://stackoverflow.com/questions/17324980
复制相似问题