猿问

滑动窗口功能内的操作(​​用于图像降噪)

我正在对图像进行降噪处理,试图在矩阵中保持连续的行(有一定的宽大度),并删除与我后面的行没有真正联系的随机非零元素。我的问题在下面详细介绍:


我尝试编写一个滑动窗口函数,该函数将搜索r我的二维矩阵的行并查找非零数字。

对于每个非零数字,该函数应2x2在rowr和row r+1(r-1如果存在)的邻域(非零元素的两侧有2个数字)中查找非零元素的存在。

如果邻域为空,r则应将行中的原始元素清零,否则应保留窗口中的所有非零元素。

为了使事情复杂化,我还尝试使滑动窗口变为圆形,以便当它到达行的末尾时,它不会被压缩,而是在邻域中从行的开始处包含数字。


对于所有行,如果以某种方式连接到第1行,我也只能保留一个“ connected”元素,因此矩阵下方的连续行不能从第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 . . . . . . . . . . .

谢谢你的帮助!


慕雪6442864
浏览 221回答 1
1回答

largeQ

以下是执行我认为您要执行的操作的概述:步骤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;第三步:现在,您已经确定了所有具有有效邻域的元素,test并A通过逐元素相乘相结合,仅保留在其中既非零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对此进行测试,但希望其他人可以纠正我犯的任何严重错误
随时随地看视频慕课网APP

相关分类

Python
我要回答