1

我正在研究图像去噪,试图在我的矩阵中保持连续的线条(有一些宽大处理),并删除与我所追求的线条没有真正连接的随机非零元素。我遇到的问题详细如下:

我试图编写一个滑动窗口函数,它将搜索r我的二维矩阵行并查找非零数字。
对于每个非零数字,该函数应在行和行(如果存在)的2x2邻域内(非零元素两侧的 2 个数字)寻找非零元素的存在。 如果邻域为空,则行中的原始元素应为零,否则应保留窗口内的所有非零元素。 为了使事情复杂化,我还试图使滑动窗口成为圆形,这样当它到达行的末尾时,它不会被压缩,而是包含邻域中行开头的数字。rr+1r-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 . . . . . . . . . . .
4

1 回答 1

0

这是我认为您正在尝试做的事情的大纲:

第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 步:

现在您已经确定了所有具有有效邻域的元素,结合testA元素乘法,只留下那些既非零test 具有非零邻域的元素。

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 来测试这个,但希望其他人能纠正我犯的任何严重错误。

于 2013-06-28T17:32:35.167 回答