2012-11-11 52 views
1

對MATLAB中的圖像應用滑動窗口操作(如stdfilt(i, ones(5, 5)))之後,我想將邊界像素(使用填充計算的像素)設置爲NaN以將它們標記爲無意義。在這個例子中,我將最外面的兩行和列設置爲NaN。給定一個M * M窗口,我怎樣才能將這個(M-1)/ 2像素寬的邊界設置爲特定值?如何在應用滑動窗口操作後設置邊界像素的值?

回答

0

首先找到NaN在您的矩陣中。假設你的圖片名稱是A.

a = isnan(A); 

這將是數字的位置,並創造1基質a 0那是NaN位置。然後找到Nan元件的位置:

for i=1:length(x) 
    A(x(i),y(i)) = V; 
end 
+0

我不問如何用某些東西替換NaN,我問如何用特定的值替換圖像的邊界(從假像素值計算stdfilt的像素)。 –

3

假設,r是矩陣(的stdfilt結果):

[x,y]=find(a==1); 

然後用值V作爲替換它們。以下是如何將NaN分配給邊界的示例。 一般來說,您需要指定正確的索引。

>> r = rand(4) 

r = 

    0.8147 0.6324 0.9575 0.9572 
    0.9058 0.0975 0.9649 0.4854 
    0.1270 0.2785 0.1576 0.8003 
    0.9134 0.5469 0.9706 0.1419 

>> r([1, end], :) = nan 

r = 

     NaN  NaN  NaN  NaN 
    0.9058 0.0975 0.9649 0.4854 
    0.1270 0.2785 0.1576 0.8003 
     NaN  NaN  NaN  NaN 

>> r(:, [1, end]) = nan 

r = 

     NaN  NaN  NaN  NaN 
     NaN 0.0975 0.9649  NaN 
     NaN 0.2785 0.1576  NaN 
     NaN  NaN  NaN  NaN 

更新:在一般情況下,由於圖像是一個矩陣,你的問題是「如何設置某些矩陣值?」。答案是:「使用矩陣的索引」。有很多方法可以實現它(例如,通過構建索引矩陣,邏輯掩碼或使用行/列座標)。決定使用哪種方法通常取決於該特定任務的操作速度。例如,如果您需要用NaN替換零,則使用邏輯掩碼的速度會更快:r(r == 0) = nan,依此類推。

0

這將完成這項工作,但這似乎是圖像處理工具箱中的一種功能。

mask = logical(ones(size(i))); 
width = (m - 1)/2; 
mask(width + 1:size(i, 1) - width, width + 1:size(i, 2) - width) = 0; 
i(mask) = NaN;