2012-12-15 23 views
6

यह छवि प्रसंस्करण होमवर्क में हमारा अभ्यास है। मेरा कोड ठीक काम कर रहा है। मैं कोड अनुकूलन के साथ कुछ मदद प्राप्त करना चाहता हूं।matlab में 2 डी रूपांतरण - कोड अनुकूलन

function C = convolve_slow(A,B) 
(file name is accordingly convolve_slow.m) 
This routine performs convolution between an image A and a mask B. 
Input:  A - a grayscale image (values in [0,255]) 
      B - a grayscale image (values in [0,255]) serves as a mask in the convolution. 
Output:  C - a grayscale image (values in [0,255]) - the output of the convolution. 
         C is the same size as A. 

Method: Convolve A with mask B using zero padding. Assume the origin of B is at 
    floor(size(B)/2)+1. 
Do NOT use matlab convolution routines (conv,conv2,filter2 etc). 
Make the routine as efficient as possible: Restrict usage of for loops which are expensive (use matrix multiplications and matlab routines such as dot etc). 
To simplify and reduce ifs, you should pad the image with zeros before starting your convolution loop. 
Do not assume the size of A nor B (B might actually be larger than A sometimes). 

यहाँ हमारे समाधान

function [ C ] = convolve_slow(A,B) 
%This routine performs convolution between an image A and a mask B. 
% Input:  A - a grayscale image (values in [0,255]) 
%    B - a grayscale image (values in [0,255]) serves as a mask in the convolution. 
% Output:  C - a grayscale image (values in [0,255]) - the output of the convolution. 
%    C is the same size as A. 
% 
% Method: Convolve A with mask B using zero padding. Assume the origin of B is at floor(size(B)/2)+1. 
% init C to size A with zeros 
C = zeros(size(A)); 
% make b xy-reflection and vector 
vectB = reshape(flipdim(flipdim(B,1),2)' ,[] , 1); 
% padding A with zeros 
paddedA = padarray(A, [floor(size(B,1)/2) floor(size(B,2)/2)]); 
% Loop over A matrix: 
for i = 1:size(A,1) 
    for j = 1:size(A,2) 
     startAi = i; 
     finishAi = i + size(B,1) - 1; 
     startAj = j; 
     finishAj = j + size(B,2) - 1; 
     vectPaddedA = reshape(paddedA(startAi :finishAi,startAj:finishAj)',1,[]); 
     C(i,j) = vectPaddedA* vectB; 
    end 
end 
end 

के बाद से मैं इमेज प्रोसेसिंग और Matlab के लिए नया हूँ है। क्या आप कोड अनुकूलन के साथ विशेष रूप से मैट्रिक्स आधारित संचालन के साथ मेरी मदद कर सकते हैं। क्या लूप का उपयोग नहीं करना संभव है?

+1

आप fft2 और ifft2 उपयोग करने के लिए अनुमति दी जाती है किसी भी तरह से काम करता है? यदि ऐसा है तो यह एक बहुत तेज़ समाधान पाने का एक तरीका होगा। – MarkV

+0

नहीं, खेद नहीं है, मुख्य अवधारणा यह है कि हम यह सीखने के लिए एक दृढ़ संकल्प लागू करते हैं कि यह कैसे काम करता है। अच्छा यह काम करता है! अब मैं देखना चाहता हूं कि इसे बेहतर तरीके से करने का कोई तरीका है या नहीं। – Gilad

उत्तर

5

स्पष्ट रूप से कोड लिखने के बिना, मैं इसे एक मुख्य for लूप पर लाने के लिए एक तरीका देख सकता हूं। असल में, ए और बी के प्रत्येक कॉलम को एक वेक्टर में खोलकर कॉलम वैक्टर के रूप में मैट्रिक्स ए और बी के बारे में सोचें (इस तरह यह MATLAB में आंतरिक रूप से संग्रहीत किया जाता है)। फिर प्रत्येक (i,j)A का समन्वय रैखिक सूचकांक k (उदाहरण के लिए sub2ind फ़ंक्शन का उपयोग करके) में मैप किया जा सकता है। फिर, ए के शरीर के भीतर प्रत्येक रैखिक सूचकांक (पैडिंग को अनदेखा करना) के लिए, रैखिक सूचकांक की सूची की गणना करें जो इस रैखिक सूचकांक के आसपास एक सबमिट्रिक्स से संबंधित है (जो शायद यहां सबसे कठिन हिस्सा है)। फिर A(theseIndices) और B(:) के डॉट उत्पाद की गणना करें। इस विधि के साथ आप A के प्रत्येक रैखिक सूचकांक पर बस लूपिंग कर रहे हैं।

3

न पता है कि अगर यह तेजी से होता है, लेकिन कम से कम वहाँ छोरों के लिए नहीं कर रहे हैं (जो मतलब यह नहीं है कि हाल के matlab संस्करणों में अब और तेजी से हो गया है)

function A = tmpConv(A,B) 

    filterSize = size(B,1); 
    filterSize2 = floor(filterSize/2); 
    inputSize = size(A); 

    A = padarray(A,[filterSize2 filterSize2]); 

    f = repmat(B(:),[1 inputSize(1)*inputSize(2)]); 
    A = im2col(A,[filterSize filterSize]); 
    A = reshape(sum(A.*f),inputSize); 
+0

यह सहसंबंध की गणना करता है, संकल्प नहीं। इसके लिए आपको फ़िल्टर 180 डिग्री घुमाने के लिए होगा। साथ ही, 'एफ' मैट्रिक्स का निर्माण आवश्यक नहीं है, क्योंकि एक ही परिणाम' ए 'के मैट्रिक्स गुणा के साथ (उलट) फिल्टर वेक्टर के साथ पूरा किया जाता है। – Joost

संबंधित मुद्दे