đây là bài tập của chúng tôi trong bài tập về nhà xử lý hình ảnh. mã của tôi đang hoạt động tốt. tôi muốn được trợ giúp về tối ưu hóa mã.Chuyển đổi 2D trong MATLAB - tối ưu hóa mã
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).
Đây là giải pháp của chúng tôi
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
kể từ khi tôi mới để xử lý hình ảnh và Matlab. bạn có thể vui lòng giúp tôi với tối ưu hóa mã, cụ thể với các hoạt động dựa trên ma trận. là nó có thể không sử dụng vòng?
được bạn cho phép sử dụng fft2 và ifft2 chức năng theo bất kỳ cách nào? Nếu đó là một cách để có được một giải pháp khá nhanh. – MarkV
Không, xin lỗi không có fft, khái niệm chính là chúng tôi thực hiện một convolution để tìm hiểu cách thức hoạt động. nó hoạt động tốt! bây giờ tôi muốn xem nếu có một cách để làm điều đó tốt hơn. – Gilad