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是我们指定的扩展尺寸)
在这里插入图片描述

<think>嗯,用户想了解如何在C++中使用OpenCV进行边界填充。首先,我需要回忆一下OpenCV中相关的函数。记得有一个copyMakeBorder函数,应该就是用来做边界填充的。需要确认一下它的参数和用法。 用户需要具体的示例和教程,所以应该给出一个代码示例,并且分步骤解释。可能需要说明不同的填充类型,比如常数填充、镜像填充等。同时,要确保代码正确,比如包含必要的头文件,使用正确的命名空间,还有加载图像是否成功。 另外,用户可能对边界填充的应用场景不太清楚,所以应该简要说明为什么需要边界填充,比如在卷积操作时保持图像尺寸,或者在图像处理前扩展边缘。还需要注意,用户提到的是C++,所以示例代码要是C++的,而不是Python的。 可能会遇到的问题,比如图像路径错误,或者未正确包含OpenCV库。不过用户可能已经配置好环境,所以示例中需要提醒用户替换正确的图像路径。此外,不同填充方式的区别和适用情况也需要解释清楚,帮助用户选择合适的方法。 还要检查是否有相关的引用资料,但根据用户提供的引用,可能没有直接关于边界填充的内容,但如果有的话需要标注。例如,用户提供的引用[^2]是关于putText函数的,可能不相关,所以可能不需要引用。 最后,生成相关问题时要围绕边界填充的应用、参数影响、性能比较,以及与其他操作结合使用的情况。确保问题有助于用户进一步学习和解决问题。</think>在OpenCV中使用C++实现边界填充主要通过$cv::copyMakeBorder$函数实现,该函数支持多种边界填充模式。以下是具体实现方法和示例: ### 一、边界填充核心函数 函数原型: ```cpp void copyMakeBorder( InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar() ) ``` - `borderType`支持: - $BORDER_CONSTANT$(常数填充) - $BORDER_REPLICATE$(边缘复制) - $BORDER_REFLECT$(镜像填充) - $BORDER_WRAP$(平铺填充) ### 二、完整代码示例 ```cpp #include <opencv2/opencv.hpp> int main() { // 1. 读取图像 cv::Mat src = cv::imread("input.jpg"); if(src.empty()) return -1; // 2. 定义填充参数 int borderSize = 20; cv::Scalar value(255,0,0); // 蓝色填充(仅BORDER_CONSTANT生效) // 3. 执行边界填充 cv::Mat dst; cv::copyMakeBorder(src, dst, borderSize, borderSize, // 上下 borderSize, borderSize, // 左右 cv::BORDER_CONSTANT, value); // 4. 显示结果 cv::imshow("Original", src); cv::imshow("Padded", dst); cv::waitKey(0); return 0; } ``` ### 三、不同填充模式效果对比 | 模式 | 常量值填充 | 边缘复制 | 镜像反射 | 平铺填充 | |------|------------|----------|----------|----------| | 代码标识 | $BORDER_CONSTANT$ | $BORDER_REPLICATE$ | $BORDER_REFLECT$ | $BORDER_WRAP$ | | 示意图 | 填充指定颜色 | 复制边缘像素 | 镜像边缘内容 | 平铺图像内容 | ### 四、应用场景 1. 卷积操作前保持图像尺寸 2. 创建图像边缘缓冲区 3. 图像拼接预处理 4. 深度学习中输入尺寸标准化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值