为了防止在处理图像时边界越界,通常将图像根据其边界的像素值扩大一定的大小区域,如图所示,在opencv中有copyMakeBorder函数进行处理,具体:
cv::copyMakeBorder(image, image, patch_h, patch_h, patch_w, patch_w, cv::BORDER_CONSTANT, cv::Scalar());
或者
int winLen = winSize.width / 2 ;
resizedImg8u = Mat::zeros( img8u.rows + winLen * 2, img8u.cols + winLen * 2, CV_8UC3 ) ;
Rect roi( winLen, winLen, img8u.cols, img8u.rows ) ;
img8u.copyTo( resizedImg8u( roi ) ) ;
Mat srcUpROI = img8u( Rect( 0, 0, img8u.cols, winLen ) ) ;
flip( srcUpROI, srcUpROI, 0 ) ;
srcUpROI.copyTo( resizedImg8u( Rect( winLen, 0, img8u.cols, winLen ) ) ) ;
Mat srcDownROI = img8u( Rect( 0, img8u.rows - winLen, img8u.cols, winLen ) ) ;
flip( srcDownROI, srcDownROI, 0 ) ;
srcDownROI.copyTo( resizedImg8u( Rect( winLen, resizedImg8u.rows - winLen, img8u.cols, winLen ) ) ) ;
Mat srcLeftROI = resizedImg8u( Rect( winLen, 0, winLen, resizedImg8u.rows ) ) ;
flip( srcLeftROI, srcLeftROI, 1 ) ;
srcLeftROI.copyTo( resizedImg8u( Rect( 0, 0, winLen, resizedImg8u.rows ) ) ) ;
Mat srcRightROI = resizedImg8u( Rect( resizedImg8u.cols - 2 * winLen, 0, winLen, resizedImg8u.rows ) ) ;
flip( srcRightROI, srcRightROI, 1 ) ;
srcRightROI.copyTo( resizedImg8u( Rect( resizedImg8u.cols - winLen, 0, winLen, resizedImg8u.rows ) ) ) ;
而在matlab中,可以采用代码:
function border_img=copyMakeBorder(img, patch_h, patch_w)
[h,w,channel]=size(img);
resized_h=h+2*patch_h;
resized_w=w+2*patch_w;
border_img=uint8(ones(resized_h,resized_w,channel));
border_img(patch_h+1:resized_h-patch_h,patch_w+1:resized_w-patch_w,:)=img;
%% top
top= img(1:patch_h,1:w,:);
top(:,:,1)=flipud(top(:,:,1));
top(:,:,2)=flipud(top(:,:,2));
top(:,:,3)=flipud(top(:,:,3));
border_img(1:patch_h,patch_w+1:resized_w-patch_w,:)=top;
%% down
down= img(h-patch_h+1:h,1:w,:);
down(:,:,1)=flipud(down(:,:,1));
down(:,:,2)=flipud(down(:,:,2));
down(:,:,3)=flipud(down(:,:,3));
border_img(resized_h-patch_h+1:resized_h,patch_w+1:resized_w-patch_w,:)=down;
%% left
left= border_img(1:resized_h,patch_w+1:patch_w+patch_w,:);
left(:,:,1)=fliplr(left(:,:,1));
left(:,:,2)=fliplr(left(:,:,2));
left(:,:,3)=fliplr(left(:,:,3));
border_img(1:resized_h,1:patch_w,:)=left;
%% right
right= border_img(1:resized_h,resized_w-2*patch_w+1:resized_w-patch_w,:);
right(:,:,1)=fliplr(right(:,:,1));
right(:,:,2)=fliplr(right(:,:,2));
right(:,:,3)=fliplr(right(:,:,3));
border_img(1:resized_h,resized_w-patch_w+1:resized_w,:)=right;
end