2011-10-23 78 views
3

我正在寫一段代碼,必須從RGB圖像轉換爲rgb標準化空間。我已經爲格式使用了,但運行速度太慢,我需要評估大量圖像。爲了加快速度,我試圖對矢量化函數進行全面的處理。我對當下如下:RGB轉換爲rgb規範。向量化

 R = im(:,:,1); 
    G = im(:,:,2); 
    B = im(:,:,3); 

    r=reshape(R,[],1); 
    g=reshape(G,[],1); 
    b=reshape(B,[],1); 

    clear R G B; 

    VNormalizedRed = r(:)/(r(:)+g(:)+b(:)); 
    VNormalizedGreen = g(:)/(r(:)+g(:)+b(:)); 
    VNormalizedBlue = b(:)/(r(:)+g(:)+b(:)); 

    NormalizedRed = reshape(VNormalizedRed,height,width); 
    NormalizedGreen = reshape(VNormalizedGreen,height,width); 
    NormalizedBlue = reshape(VNormalizedBlue,height,width); 

的主要問題是,當它到達VNormalizedRed = r(:)/(r(:)+g(:)+b(:));它會顯示內存不足的錯誤(至極真的很奇怪,因爲我剛剛解放了相同大小的三個矢量)。是錯誤嗎? (已解決

它可能以更有效的方式執行相同的過程?

編輯:

使用馬丁sugestions後,我發現了重塑功能是沒有必要的,能夠做同樣的一個簡單的代碼:

 R = im(:,:,1); 
    G = im(:,:,2); 
    B = im(:,:,3); 

    NormalizedRed = R(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2); 
    NormalizedGreen = G(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2); 
    NormalizedBlue = B(:,:)./sqrt(R(:,:).^2+G(:,:).^2+B(:,:).^2); 

    norm(:,:,1) = NormalizedRed(:,:); 
    norm(:,:,2) = NormalizedGreen(:,:); 
    norm(:,:,3) = NormalizedBlue(:,:); 
+0

您的代碼的新版本的注意事項:'R(:,:)'應該簡單地等同於'R' - 讓你應該能夠進一步縮短你的代碼,例如'NormalizedRed = R./sqrt(R.^2 + G.^2 + B.^2);' –

回答

5

我相信你想

VNormalizedRed = r(:)./(r(:)+g(:)+b(:)); 

請注意/前面的點,它指定逐個元素的除法。沒有點,你正在解決一個方程組 - 這可能不是你想要做的。這也可能解釋了爲什麼你會看到高內存消耗。

1

你的整個第一代碼可以在一個矢量線被改寫:

im_normalized = bsxfun(@rdivide, im, sum(im,3,'native')); 

你的第二個略加修改爲:

im_normalized = bsxfun(@rdivide, im, sqrt(sum(im.^2,3,'native'))); 

BTW,你應該知道使用的數據類型圖像,否則可以得到意想不到的結果(例如由於整數除法)。因此,我將圖像轉換爲double進行標準化計算前:

im = im2double(im); 
+0

真的非常感謝,代碼快了50% – jsalvador