2016-05-06 37 views
0

我有一個圖像,我必須滑動81 * 81窗口,以找到中心像素和每個像素之間的強度距離(差異)在81 * 81窗口周圍,我還必須找出位置距離,即中心像素座標和周圍窗口中像素座標之間的差異。如果我使用for循環,那麼我將不得不使用4個嵌套for循環進行此操作,對於單個圖像幾乎需要一整天的時間。我想爲圖像中存在的每個像素存儲81 * 81的亮度差異,同樣對於位置距離也是如此,這往往會產生4D變量。任何人都可以建議我採取一些有效的方法。這裏是我寫這段代碼的方式:如何加快matlab中的滑動窗口函數的圖像

I = imread('House.tiff'); 
YCbCr = rgb2ycbcr(I); 
YCbCr = double(YCbCr); 
YCbCr = imresize(YCbCr,[200 200]); 
[m n v] = size(YCbCr); 
Y = YCbCr(:,:,1); Cb = YCbCr(:,:,2); Cr =YCbCr(:,:,3); 
Y1 = padarray(Y,[20,20]); 
Cb1 = padarray(Cb,[20,20]); 
Cr1 = padarray(Cr,[20,20]); 
window_size = 41; 
p = (window_size-1)/2; 
Dl = zeros(m,n,41,41); Df = zeros(m,n,41,41); 
for x = 1:1:m 
    for y = 1:1:n 
     for a = -p:1:p 
      for b = -p:1:p 
Df(x,y,a+p+1,b+p+1)= abs(Y(x,y)-Y1(x+a+p,y+b+p))+ abs(Cb(x,y)- Cb1(x+a+p,y+b+p))+ abs(Cr(x,y)- Cr1(x+a+p,y+b+p));%% intensity distance 
Dl(x,y,a+p+1,b+p+1) = max(abs((x+p)-(x+a+p)),abs((y+p)-(y+b+p)));%% location distance 
      end 
     end 
    end 
end 

回答

0

對於那個81 x 81的滑動窗口,你可能有一個X和Y「初始」點。 假設,創建一個新的臨時窗口,在80x80窗口中在這些質心之間裁剪初始圖像。

new_image = image(X-40:X+40,Y-40:Y+40); 

這會以快速的方式爲您創建新的臨時圖像。

要存儲的像素值一路

for i=1:length(images) 
currentImage=image(i,1); 
new_image(i)=currentImage(X-40:X+40,Y-40:Y+40); 
end 
+0

感謝您的建議......您的提示非常有幫助......您能否建議我以某種方式存儲每個像素的所有81 * 81值。因爲每次窗口滑動時都會顯示不同的值。 ..再次感謝... –

+0

非常感謝@ 16per9這實際上工作很好..... –

+0

@GauriDeshpande如果我的回答幫助你,請不要忘記標記爲正確:)謝謝,祝你好運 – 16per9

0

a)您的位置差矩陣爲都是一樣的 - 它不依賴於Y.只需創建它的一個81x81的實例。

b)爲什麼你需要存儲所有這些輸出?花費很長時間可能很容易,因爲這種大型矩陣的RAM使用意味着您正在從磁盤(頁面文件)讀取和寫入數據,而不是RAM,這會使速度降低很多。在這個算法的「下一個階段」進行優化可能會更好,從而減少了對這個矩陣實際進行的計算。根據你的下一個階段,使用imfilter可能是一條路。

+0

謝謝你的建議..實際上我必須使用所有的值來計算每個像素和周圍窗口中出現的像素的發生概率......也就是說,對於給定的像素,周圍像素的概率是多少出現在周圍的窗戶,這就是爲什麼我必須保留所有的價值。 –