opencv图像边界填充
api函数:cv::copyMakeBorder()
CV_EXPORTS_W void copyMakeBorder(InputArray src, OutputArray dst,
int top, int bottom, int left, int right,
int borderType, const Scalar& value = Scalar() );
在opencv进行图像处理时,会面临对边界的处理问题。因为opencv中的滤波操作(如, cv::blur(),cv::erode(),cv::dilate()等),得到的输出图像与源图像的形状的一样的。为保证输入输出尺寸相同,opencv会进行一个padding操作,在源图像周围添加虚拟像素。事实上,为保证卷积前后图像大小保持一致,保证图像边缘的信息充分利用,padding在卷积神经网络中是常用操作。
关于padding操作:https://blog.csdn.net/weicao1990/article/details/80282341
自定义边框
在处理图像时,只要告诉要调用的函数添加虚拟像素的规则,库函数就会自动创建虚拟像素。当然我们需要注意函数创建虚拟像素所采用的方法。
/*形参解析*/
CV_EXPORTS_W void copyMakeBorder(InputArray src, //输入源图像
OutputArray dst, //输出边框填充后的图像
int top, //top,bottom,left,right,表示在上下左右四个方向,需填充的边框尺寸
int bottom, //四个int型尺寸表示(pixels)像素值
int left, //left = 50,表示源图像左边界需要填充50pixel宽度的边框
int right,
int borderType, //填充方法
const Scalar& value = Scalar() //当 borderType==BORDER_CONSTANT时,用来填充的像素值常量
);
/*关于第七个参数int borderType:*/
enum cv::BorderTypes {
cv::BORDER_CONSTANT = 0, //复制指定的常量扩展边界
cv::BORDER_REPLICATE = 1, //replicate(自我复制),将边缘的像素延申,复制边缘的像素扩展边界
cv::BORDER_REFLECT = 2, //reflect,通过镜像复制扩展边界(复制以边界为轴对称的像素)
cv::BORDER_WRAP = 3, //复制对边的像素扩展边界(将距离对边指定距离的像素复制到边界)
cv::BORDER_REFLECT_101 = 4, //同2,去除在边界上的像素
cv::BORDER_TRANSPARENT = 5,
cv::BORDER_DEFAULT = BORDER_REFLECT_101, //默认是BORDER_REFLECT_101的别名
cv::BORDER_ISOLATED = 16 //do not look outside of ROI,字面意思是不在意ROI之外的,
//不是很理解,但测试发现是默认用0填充
}
int main()
{
cv::Mat cat = cv::imread("D://images//cat_01.jpg");
cv::Mat cat_dst;
cv::resize(cat, cat, cv::Size(600, 400));
/*
BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`
*/
cv::copyMakeBorder(cat, cat_dst, 50, 50, 50, 50, cv::BorderTypes::BORDER_CONSTANT, cv::Scalar(0, 255, 0));//指定常量像素填充
cv::namedWindow("cat", cv::WINDOW_AUTOSIZE);
cv::namedWindow("BORDER_CONSTANT", cv::WINDOW_AUTOSIZE);
cv::imshow("cat", cat);
cv::imshow("BORDER_CONSTANT", cat_dst);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
(1)复制指定的常量扩展边界cv::Scalar(0,255,0):
(2)replicate(自我复制),将边缘的像素延申,复制边缘的像素扩展边界
(3)reflect,通过镜像复制扩展边界(以当前边界为轴对称,复制相距边界为n的像素用来填充,n是我们指定的扩展尺寸)
(4)与方式(3)相反,将对边的像素复制来扩展边界(将距离对边指定距离n的像素复制到边界,n是我们指定的扩展尺寸)