2017-10-20 7 views
3

나는 일종의 컨볼 루션을 수행하는 최선의 방법을 찾아 내려고 노력합니다.각 이미지에 대해 새 벡터로 컨볼 루션을 수행하는 가장 좋은 방법은 무엇입니까?

저는 3D 매트릭스 I = [N x M x P]와 2D 매트릭스 S = [1 x 1 x K x P]를가집니다. 내 3D 행렬의 각 p 번째 프레임 (3 차원)에 대해 I (:, :, P-K/2 : p + K/2)와 S (1, 1, :, p) 사이의 유효한 컨벌루션을 반환하고 싶습니다. 이것을 할 방법이 보이십니까? 실제로 계산 표준 콘볼 루션 아주 가까이에서의 동작의 개수의 관점에서의 차이점은 I 프레임마다 제 행렬을 변경할 필요가있다

...

는 I 현재 방법 사용

% I = 3D matrix [N x M x P] 
% S = Filter [1 x 1 x K x P] (K is an odd number) 
% OUT = Result 

[N, M, P] = size(I); % Data size 
K = size(S, 3); % Filter length 
win = (K-1)/2 ; % Window 
OUT = zeros(size(I)); % Pre-allocation 

for p = win+1:P-win 
    OUT(:, :, p) = convn(I(:, :, p-win:p+win), S(1, 1, :, p), 'valid'); % Perform convolution 
end 

를 우리가 표준 회선에 비해 작업의 같은 수의 끝에서, 유일한 차이점은 ... 필터가 각 프레임에 대해 서로 다른 것을

어떤 생각인가?

감사)

답변

0

그래서 당신은 1x1xKx1 커널와 NxMxK ​​서브 이미지를 컨 볼브하려면, 다음 만 N × M 개의 영상이다 유효한 부분을 가져 가라.

단일 (x, y) 위치에 대해이 작업을 살펴 ​​보겠습니다. 서브를 재편하여

OUT(x,y,p) = squeeze(I(x,y,p-win:p+win))' * squeeze(S(1,1,:,p)) 

이 모든 (x, y)를 통해 벡터화 할 수 있습니다 : 당신은 단지 하나의 값을 유지하는의이 1D 컨볼 루션은, 도트 서브 이미지의 제품 및 커널에 해당 I의 (N * M) xK 행렬로의 이미지 (K는 수평, S는 열 벡터).

모든 p에서 반복하는 것은 지금처럼 루프로 구현하는 것이 가장 쉽습니다. 다른 방법은 각 열이 1만큼 씩 이동하는 더 큰 S를 작성하는 것입니다. 따라서 두 행렬간에 단일 점을 생성 할 수 있습니다. 그러나 S는 또한 생성하기 쉽고 아마도 너무 루프를 필요로합니다. 나는 루프를 피하는 것이 MATLAB에서 더 이상 강요하지 않는다고 생각합니다. (수년에 걸쳐 훨씬 빨라졌습니다.) 제품 자체는 어쨌든 알고리즘에서 가장 비싼 부분 일 것입니다.