opencv4_C++_cv::copyMakeBorder()边界填充

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):复制指定的常量扩展边界cv::Scalar(0,255,0)

(2)replicate(自我复制),将边缘的像素延申,复制边缘的像素扩展边界
在这里插入图片描述

(3)reflect,通过镜像复制扩展边界(以当前边界为轴对称,复制相距边界为n的像素用来填充,n是我们指定的扩展尺寸)
在这里插入图片描述

(4)与方式(3)相反,将对边的像素复制来扩展边界(将距离对边指定距离n的像素复制到边界,n是我们指定的扩展尺寸)
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值