Tạo ma trận kết hợp của hạt nhân 2D cho hình dạng kết hợp của `same`


10

Tôi muốn tìm một ma trận tích chập cho một hạt nhân 2D H .
Ví dụ: đối với hình ảnh Imgcó kích thước m×n , tôi muốn (trong MATALB):

T * Img = reshape(conv2(Img, H, 'same'), [], 1);

Trong trường hợp Tlà ma trận chập và samephương tiện các Convolution Shape (Output Size) phù hợp kích thước đầu vào.

Về mặt lý thuyết, H nên được chuyển đổi thành ma trận toeplitz, tôi đang sử dụng hàm MATLAB convmtx2():

T = convmtx2(H, m, n);

Tuy nhiên, Tcó kích thước (m+2)(n+2)×(mn) khi MATLAB convmtx2tạo ra ma trận tích chập phù hợp với Hình dạng kết hợp của full.

Có cách nào để tạo Ma trận kết hợp khớp conv2()với sametham số hình dạng tích chập không?


Bạn đang tìm kiếm đơn giản để có được kết quả tương tự T * Img hoặc bạn muốn sử dụng T cho mục đích khác?
Charna

Tôi đã chỉnh sửa mã và toán học của bạn để nó trông hấp dẫn hơn. Bạn có thể tự làm điều này cho các câu hỏi trong tương lai. Để chỉnh sửa latex, hãy sử dụng $$.
Jav_Rock

Câu hỏi liên quan - dsp.stackexchange.com/questions/17418 .
Royi

Câu trả lời:


5

Tôi không thể kiểm tra điều này trên máy tính của mình vì tôi không có chức năng convtmx2, đây là những gì trợ giúp MATLAB nói:

http://www.mathworks.com/help/toolbox/images/ref/convmtx2.html

T = convmtx2(H,m,n)trả về ma trận chập Tcho ma trận H. Nếu Xlà một ma trận m-by-n, thì reshape(T*X(:),size(H)+[m n]-1)giống như conv2(X,H).

Điều này sẽ nhận được kết quả tương tự của kết quả conv2(X,H)nhưng sau đó bạn vẫn phải rút ra phần chính xác của tích chập.


Chào mừng bạn đến với DSP.SE, và đây là một câu trả lời tuyệt vời!
Phonon

Tôi nghĩ rằng đôi khi người ta cần ma trận thực tế để phân tích nó (Toán tử điều chỉnh, nghịch đảo, v.v ...). Do đó phương pháp này sẽ không hoạt động (Trừ khi bạn bắt đầu loại bỏ các hàng tạo thành ma trận sẽ chậm vì nó thưa thớt).
Royi

1

Tôi đã viết một hàm giải quyết điều này trong Kho lưu trữ GitHub của StackOverflow Q2080835 của tôi (Hãy xem CreateImageConvMtx()).
Trên thực tế các chức năng có thể hỗ trợ bất kỳ hình dạng chập bạn muốn - full, samevalid.

Mã như sau:

function [ mK ] = CreateImageConvMtx( mH, numRows, numCols, convShape )

CONVOLUTION_SHAPE_FULL  = 1;
CONVOLUTION_SHAPE_SAME  = 2;
CONVOLUTION_SHAPE_VALID = 3;

switch(convShape)
    case(CONVOLUTION_SHAPE_FULL)
        % Code for the 'full' case
        convShapeString = 'full';
    case(CONVOLUTION_SHAPE_SAME)
        % Code for the 'same' case
        convShapeString = 'same';
    case(CONVOLUTION_SHAPE_VALID)
        % Code for the 'valid' case
        convShapeString = 'valid';
end

mImpulse = zeros(numRows, numCols);

for ii = numel(mImpulse):-1:1
    mImpulse(ii)    = 1; %<! Create impulse image corresponding to i-th output matrix column
    mTmp            = sparse(conv2(mImpulse, mH, convShapeString)); %<! The impulse response
    cColumn{ii}     = mTmp(:);
    mImpulse(ii)    = 0;
end

mK = cell2mat(cColumn);


end

Thưởng thức...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.