首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滑动窗口函数内的操作(用于图像去噪)

滑动窗口函数内的操作(用于图像去噪)
EN

Stack Overflow用户
提问于 2013-06-26 23:59:53
回答 1查看 423关注 0票数 1

我正在做图像去噪工作,试图在我的矩阵中保持连续的线条(以一些宽松的方式),并删除随机的非零元素,这些元素并不是真正连接到我想要的线条。我遇到的问题详述如下:

我曾尝试编写一个滑动窗口函数,它将搜索我的2-D矩阵的行r,并查找非零数字。

对于每个非零数位,该函数应在行r和行r+12x2邻域(非零元素的两边各有2个数字)内查找是否存在非零元素(如果存在,还应查找r-1 )。

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

让事情更复杂的是,我还试图使滑动窗口成为圆形,这样当它到达行尾时,它不会被压缩,而是包括来自邻近行开始的数字。

对于所有行,我也只能保留一个“连接的”元素,如果它以某种方式连接到第1行,那么沿着我的矩阵的连续行不能从第2行开始。

这是我用Matlab语言中的for-loops编写的,在尝试操作窗口中的值时遇到了问题。除此之外,我的函数真的很慢。有没有一种方法可以不使用for-loops,也不需要任何预安装的工具箱就能在Matlab或Python中做到这一点呢?

示例Matlab代码:"test“是一个二进制矩阵(但并不是我要看的所有矩阵都是二进制的)。它包含5行。这是我为第1行编写的虚拟代码。窗口操作(代码的第4行)不起作用,但希望这能让您对我想要做的事情有所了解。这段代码还省略了矩阵的边,因为我不确定制作这个循环的最好方法。

代码语言:javascript
复制
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 . . . . . . . . . . .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-29 01:32:35

下面是我认为你正在尝试做的事情的提纲:

步骤1:

通过对邻居的值求和,找出在其3x5邻域中具有非零元素的所有矩阵位置。我们还不想包含当前元素,因此中间是零。输入矩阵为test

代码语言:javascript
复制
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,而不使用零值。

代码语言:javascript
复制
A(A > 0) = 1;

第3步:

既然您已经标识了所有具有有效邻域的元素,那么就通过逐个元素的乘法将testA结合起来,只留下那些在testand中都是非零的元素具有非零的邻居。

代码语言:javascript
复制
result = test .* A;

第0步:

填充-上面应该按原样工作,但行和列都用零填充。据我所知,您的填充要求是希望圆形行和列用零填充。

代码语言:javascript
复制
nCols = size(test, 2);
paddedTest = [zeros(1,nCols);...
              test(:, nCols-1:nCols), test, test(:,1:2);...
              zeros(1,nCols)];

这显然会通过自己的填充来改变您正在处理的矩阵的大小,所以您需要更改卷积参数,以便返回一个与test大小相同的矩阵。

代码语言:javascript
复制
A = conv2(paddedTest, fil, 'valid');

我现在没有可用的Matlab来测试这一点,但希望其他人能纠正我犯下的任何严重错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17324980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档