conv2
Perform two-dimensional convolution
Syntax
C = conv2(A,B)
C = conv2(hcol,hrow,A)
C = conv2(...,shape)
Description
C = conv2(A,B) performs the two-dimensional convolution of matrices A and B, returning the result in the output matrix C. The size in each dimension of C is equal to the sum of the corresponding dimensions of the input matrices minus one. That is, if the size of A is [ma,mb] and the size of B is [mb,nb], then the size of C is [ma+mb-1,na+nb-1].
C = conv2(hcol,hrow,A) convolves A separably with hcol in the column
direction and hrow in the row direction. hcol and hrow are both vectors.
C = conv2(...,shape) returns a subsection of the two-dimensional convolution, as specified by the shape parameter. shape is a string with one of these values:
'full' (the default) returns the full two-dimensional convolution.'same' returns the central part of the convolution of the same size as A. 'valid' returns only those parts of the convolution that are computed without the zero-padded edges. Using this option, size(C) = [ma-mb+1,
na-nb+1] when size(A) > size(B).For image filtering, A should be the image matrix and B should be the filter (convolution kernel) if the shape parameter is 'same' or 'valid'. If the shape parameter is 'full', the order does not matter, because full convolution is commutative.
Class Support
All vector and matrix inputs to conv2 can be of class double or of any integer class. The output matrix C is of class double.
Remarks
conv2 is a function in MATLAB.
>> A=magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> B=[1 3 1; 0 5 0; 2 1 2]
B =
1 3 1
0 5 0
2 1 2
>> C1 = conv2(A,B,'full')
C1 =
17 75 90 35 40 53 15
23 159 165 45 105 137 16
38 198 120 165 205 197 52
56 95 160 200 245 184 35
19 117 190 255 235 106 53
20 89 160 210 75 90 6
22 47 90 65 70 13 18
>> C2 = conv2(A,B,'same')
C2 =
159 165 45 105 137
198 120 165 205 197
95 160 200 245 184
117 190 255 235 106
89 160 210 75 90
>> C3 = conv2(A,B,'valid')
C3 =
120 165 205
160 200 245
190 255 235
Since convolution is a neigborhood operation, the question arises of how to handle pixels that have no neighbors, namely those near the edge or borders of the image. There is no absolutely right way to handle this problem. Following are some suggestions based on common practices.
Make the image big enough so that there is a guard ring around the region of interest. That is, use only the valid portion of the convolution. The resulting image will be smaller by the width of the convolution operator, as suggested by the outlined region below:
Assume the image is embedded in a sea of zeros, as shown below. This
is the assumption made by the full and same methods
of conv2.
Assume that the pixels just outside the image are the same as their
nearest neighbor inside the image. This is the situation portrayed
below (obtained with add_border(rgb,'dup',width))
Consider the extended image to be a tiled version of the original, and then convolve the central image using portions of the adjacent tiles at the borders.
The following matlab code constructs a tiled image:
>> out = repmat(srgb,3,3);
A cyclic border can also be constructed from add_border(rgb,'circ',width).
One could contemplate using a fancy extrapolation scheme, perhaps based on cubic splines, to obtain pixels outside the original image. This really has no more justifcation than the other methods described above, and is no substitute for making the original image much larger than the region of interest.
function out = add_border(inp,type,width)
%
% add border of given type and width to
% an image
if (nargin<3)
width = 10;
end
if (nargin<2)
type = 'zero';
end
s = size(inp);
switch type(1)
case 'z',
s(2)=width;
z = zeros(s);
tmp = [z, inp, z];
s = size(tmp);
s(1)=width;
z = zeros(s);
out = [z;tmp;z];
case 'd',
c = inp(:,1,:);
left = repmat(c,1,width);
c = inp(:,s(2),:);
right = repmat(c,1,width);
tmp = [left, inp, right];
s = size(tmp);
r = tmp(1,:,:);
top = repmat(r,width,1);
r = tmp(s(1),:,:);
bot = repmat(r,width,1);
out = [top;tmp;bot];
case 'c',
left = inp(:,1:width,:);
right = inp(:,(s(2)-width+1):s(2),:);
tmp = [right,inp,left];
s = size(tmp);
top = tmp(1:width,:,:);
bot = tmp((s(1)-width+1):s(1),:,:);
out = [bot;tmp;top];
otherwise,
error('Invalid input arguments.');
end
Maintained by John Loomis, last updated 14 Feb 2001