0001 function imgpadded = slpadimg(img, padsize, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 if nargin < 3
0038 raise_lackinput('slpadimg', 3);
0039 end
0040
0041
0042
0043 if ~isvector(padsize)
0044 error('sltoolbox:invalidarg', ...
0045 'The padsize should be a vector');
0046 end
0047
0048 if length(padsize) == 1
0049 padsize = padsize * ones(1, 4);
0050 elseif length(padsize) == 2
0051 padsize = [padsize(1), padsize(1), padsize(2), padsize(2)];
0052 elseif length(padsize) == 4
0053 padsize = padsize(:)';
0054 else
0055 error('sltoolbox:invalidarg', ...
0056 'The length of padsize is illegal');
0057 end
0058
0059
0060
0061 d = ndims(img);
0062 if d == 2
0063 k = 1;
0064 elseif d == 3
0065 k = size(img, 3);
0066 else
0067 imgsiz = size(img);
0068 k = prod(imgsiz(3:end));
0069 end
0070
0071 padparam = varargin{1};
0072 if isnumeric(padparam) || islogical(padparam)
0073 padtype = 'constant';
0074 padval = padparam;
0075 if numel(padval) == 1
0076 if k > 1
0077 padval = padval * ones(k, 1);
0078 end
0079 elseif numel(padval) == k
0080 padval = padval(:);
0081 else
0082 error('sltoolbox:sizmismatch', ...
0083 'The size of padval is illegal');
0084 end
0085 elseif ischar(padparam)
0086 padtype = padparam;
0087 if ~ismember(padtype, {'replicate', 'circular', 'symmetric'})
0088 error('sltoolbox:invalidarg', ...
0089 'Invalid padding type: %s', padtype);
0090 end
0091 else
0092 error('sltoolbox:invalidarg', 'The padding parameters is invalid');
0093 end
0094
0095
0096
0097 switch padtype
0098 case 'constant'
0099 imgpadded = pad_constant(img, padsize, padval);
0100 case 'replicate'
0101 imgpadded = pad_replicate(img, padsize);
0102 case 'circular'
0103 imgpadded = pad_circular(img, padsize);
0104 case 'symmetric'
0105 imgpadded = pad_symmetric(img, padsize);
0106 end
0107
0108
0109
0110 if d > 3
0111 imgsiz(1) = size(imgpadded, 1);
0112 imgsiz(2) = size(imgpadded, 2);
0113 imgpadded = reshape(imgpadded, imgsiz);
0114 end
0115
0116
0117
0118
0119 function imgdst = pad_constant(img, padsize, padval)
0120
0121 [h0, w0, k] = size(img);
0122 hd = h0 + padsize(1) + padsize(2);
0123 wd = w0 + padsize(3) + padsize(4);
0124
0125
0126 padval = reshape(padval, [1 1 k]);
0127 imgdst = padval(ones(hd,1), ones(wd,1), :);
0128
0129
0130 i0 = padsize(1) + 1; i1 = padsize(1) + h0;
0131 j0 = padsize(3) + 1; j1 = padsize(3) + w0;
0132
0133 imgdst(i0:i1, j0:j1, :) = img(:, :, :);
0134
0135
0136 function imgdst = pad_replicate(img, padsize)
0137
0138 [tm, bm, lm, rm] = sltakeval(padsize);
0139 h0 = size(img, 1);
0140 w0 = size(img, 2);
0141
0142 inds_i = [ones(1, tm), 1:h0, ones(1, bm) * h0];
0143 inds_j = [ones(1, lm), 1:w0, ones(1, rm) * w0];
0144
0145 imgdst = img(inds_i, inds_j, :);
0146
0147
0148 function imgdst = pad_circular(img, padsize)
0149
0150 [tm, bm, lm, rm] = sltakeval(padsize);
0151 h0 = size(img, 1);
0152 w0 = size(img, 2);
0153
0154 inds_i = mod(-tm:h0+bm-1, h0) + 1;
0155 inds_j = mod(-lm:w0+rm-1, w0) + 1;
0156
0157 imgdst = img(inds_i, inds_j, :);
0158
0159
0160 function imgdst = pad_symmetric(img, padsize)
0161
0162 [tm, bm, lm, rm] = sltakeval(padsize);
0163 h0 = size(img, 1);
0164 w0 = size(img, 2);
0165
0166 sni = [1:h0, h0:-1:1];
0167 snj = [1:w0, w0:-1:1];
0168
0169 inds_i = sni(mod(-tm:h0+bm-1, h0*2) + 1);
0170 inds_j = snj(mod(-lm:w0+rm-1, w0*2) + 1);
0171
0172 imgdst = img(inds_i, inds_j, :);
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186