If a 2D $K_2$ filter kernel is of rank $0$ or $1$, it can be written as a separable product of $2$ 1D kernels $K_1^r$ and $K_1^c$ on rows and columns. As such, it can implemented by 1D convolutions, as long as one properly reshape the 2D matrices into 1D ones, and take care about "out-of-range" values, to avoid wrap-around. For instance, you can pad in every direction by the size of the filter, and make sure the convolution does not add unwanted information. Assuming that you know that you have a separable 2D filter, the following code does the job. A one-liner would be: xRowFull = reshape(conv(reshape(reshape( conv(x(:),s1,'same'),nRow,nCol)',nRow*nCol,1),s2,'same'),nRow,nCol)'; And the code is: % https://dsp.stackexchange.com/questions/62115/2d-convolution-of-image-with-filter-as-successive-1d-convolutions %% Initialization clear all nRow = 16; nCol = 16; HalfSizeCentralImageKernel = 1; x = zeros(nRow,nCol); x(nRow/2-HalfSizeCentralImageKernel:nRow/2+HalfSizeCentralImageKernel,nCol/2-HalfSizeCentralImageKernel:nCol/2+HalfSizeCentralImageKernel)=rand(2*HalfSizeCentralImageKernel+1); %% Original 2D version s1=[1,0,-1]'; s2=[1 2 1]; y = s1*s2; %% Step by step 2x1D version xRowFlat1 = x(:); xRowFlat1FiltCol = conv(xRowFlat1,s1,'same'); xRowFlat2 = (reshape(xRowFlat1FiltCol,nRow,nCol))'; xRowFlat2 = xRowFlat2(:); xRowFlat2FiltRowFlat = conv(xRowFlat2,s2,'same'); xRowFlatFilt2Row = reshape(xRowFlat2FiltRowFlat,nRow,nCol)'; %% Compact vectorized 1D version xRowFull = reshape(conv(reshape(reshape( conv(x(:),s1,'same'),nRow,nCol)',nRow*nCol,1),s2,'same'),nRow,nCol)'; %% Display figure(1); imagesc(x); figure(2); subplot(1,3,1) imagesc([conv2(x,y,'same')]); xlabel('Original') subplot(1,3,2) imagesc(xRowFlatFilt2Row); xlabel('Separable, step by step') subplot(1,3,3) imagesc(xRowFull); xlabel('Separable, one-liner') diff1=conv2(x,y,'same')-conv2(conv2(x,s1,'same'),s2,'same'); disp(['Max error 1: ',num2str(max(abs(diff1(:))))]); diff2=conv2(x,y,'same')-xRowFlatFilt2Row; disp(['Max error 2: ',num2str(max(abs(diff2(:))))]); **[First answer]** Here is a crude `Matlab` code. Can you test it, and if OK, i'll send a one-liner (if I can). nRow = 8; nCol = 8; HalfSizeCentralKernel = 1; x = zeros(nRow,nCol); x(nRow/2-HalfSizeCentralKernel:nRow/2+HalfSizeCentralKernel,nCol/2-HalfSizeCentralKernel:nCol/2+HalfSizeCentralKernel)=rand(2*HalfSizeCentralKernel+1); figure(1); imagesc(x); % 2D version s1=[1,0,-1]'; s2=[1 2 1]; y = s1*s2; diff1=conv2(x,y,'same')-conv2(conv2(x,s1,'same'),s2,'same'); disp(['Max error 1: ',num2str(max(abs(diff1(:))))]); % 1D version xRowFlat1 = x(:); xRowFlat1FiltCol = conv(xRowFlat1,s1,'same'); xRowFlat2 = (reshape(xRowFlat1FiltCol,nRow,nCol))'; xRowFlat2 = xRowFlat2(:); xRowFlat2FiltRow = conv(xRowFlat2,s2,'same'); xRowFlatFilt2Row = reshape(xRowFlat2FiltRow,nRow,nCol)'; figure(2); subplot(1,2,1) imagesc([conv2(x,y,'same')]) subplot(1,2,2) imagesc(xRowFlatFilt2Row)