簡體   English   中英

滑動窗口功能內的操作(​​用於圖像降噪)

[英]Manipulations within sliding window functions (for image denoising)

我正在對圖像進行降噪處理,試圖在矩陣中保持連續的行(有一定的寬容度),並刪除與我后面的行沒有真正聯系的隨機非零元素。 我的問題在下面詳述:

我嘗試編寫一個滑動窗口函數,該函數將搜索我的二維矩陣的r行並查找非零數字。
對於每個非零數字,函數應在行r和行r+1 (和r-1 )的2x2鄰域(非零元素的任一側為2個數字)中查找非零元素的存在。 (如果存在)。
如果鄰居為空,則應將第r行中的原始元素清零,否則應保留窗口中的所有非零元素。
為了使事情復雜化,我還嘗試使滑動窗口成為圓形,以便當它到達行的末尾時,它不會被壓縮,而是在鄰域中從行的開始處包含數字。

對於所有行,如果以某種方式連接到第1行,我也只能保留一個“ connected”元素,因此矩陣下方的連續行不能從第2行開始。

我已經在Matlab中使用for -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 . . . . . . . . . . .

謝謝你的幫助!

以下是執行我認為您要執行的操作的概述:

第1步:

通過求和鄰居的值,找出在其3x5鄰域中具有非零元素的所有矩陣位置。 我們現在還不想包括當前元素,因此中間不包含零。 輸入矩陣為test

A(A > 0) = 1;

第2步:

現在, A包含值> 1,因此將它們全部更改為1,僅保留零值。

 A(A > 0) = 1; 

第三步:

現在,您已經確定了所有具有有效鄰域的元素,將testA通過逐元素乘法相結合,僅保留那些在test既非零具有非零鄰居的元素。

nCols = size(test, 2);
paddedTest = [zeros(1,nCols);...
              test(:, nCols-1:nCols), test, test(:,1:2);...
              zeros(1,nCols)];

步驟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對此進行測試,但希望其他人可以糾正我犯的任何嚴重錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM