我正在研究图像去噪,试图在我的矩阵中保持连续的线条(有一些宽大处理),并删除与我所追求的线条没有真正连接的随机非零元素。我遇到的问题详细如下:
我试图编写一个滑动窗口函数,它将搜索r
我的二维矩阵行并查找非零数字。
对于每个非零数字,该函数应在行和行(如果存在)的2x2
邻域内(非零元素两侧的 2 个数字)寻找非零元素的存在。
如果邻域为空,则行中的原始元素应为零,否则应保留窗口内的所有非零元素。
为了使事情复杂化,我还试图使滑动窗口成为圆形,这样当它到达行的末尾时,它不会被压缩,而是包含邻域中行开头的数字。r
r+1
r-1
r
对于所有行,我也只能保留一个“连接”元素,如果它以某种方式连接到第 1 行,那么我的矩阵中的连续线不能从第 2 行开始。
我for
在 Matlab 中用 -loops 编写了这个,并在尝试操作窗口内的值时遇到了问题。除此之外,我的功能真的很慢。有没有办法在 Matlab 或 Python 中做到这一点而不使用for
-loops,并且没有任何预安装的工具箱?
示例 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 . . . . . . . . . . .