【OpenCv】为图像创建边框(cv::copyMakeBorder)

为图像创建边框:

1、cv::copyMakeBorder(

const Mat& src, Mat& dst,int top, int bottom, int left, int right,int borderType, const Scalar& value=Scalar()

top,bottom,left,right分别表示在原图四周扩充边缘的大小,
borderType:扩充边缘的类型,OpenCV中给出以下几种方式

边框类型效果
cv::BORDER_CONSTANT复制指定的常量扩展边界,iiiiii/abcdefgh/iiiiiii with some specified ‘i’
cv::BORDER_WRAP复制对边的像素扩展边界 ,cdefgh/abcdefgh/abcdefg
cv::BORDER_REPLICATE复制边缘的像素扩展边界,aaaaaa/abcdefgh/hhhhhhh
cv::BORDER_REFLECT通过镜像复制扩展边界,fedcba/abcdefgh/hgfedcb
cv::BORDER_REFLECT_101通过镜像复制扩展边界,边界像素除外,gfedcb/abcdefgh/gfedcba
cv::BORDER_DEFAULTcv::BORDER_REFLECT_101的别名

cv::BORDER_REPLICATE:
在这里插入图片描述

cv::BORDER_REFLECT:
在这里插入图片描述

cv::BORDER_CONSTANT:

	copyMakeBorder(dst, dst2, 20, 20, 20, 20, cv::BORDER_CONSTANT, Scalar(116, 73, 16));

注:(BORDER_ISOLATED )默认黑色进行填充。
在这里插入图片描述

cv::BORDER_REFLECT_101:
边界像素除外的好处是:
一方面,我们原图像边界的像素只使用了一次,不会出现两次;另一方面,我们图像的边缘拓展更加自然。

2、cv::borderInterpolate(

int p, int len, int borderType

)

功能:计算扩充的像素对应原图哪个坐标的像素
这个函数一般不会单独使用,一般都是上面的函数会默认调用该函数,来设置边缘。
其中

p:该扩充图像的像素在原图中某一坐标轴上的坐标(注意:是在原图中的坐标!)
len:扩充像素对应的原图像的坐标轴的长度

borderType:扩充类型

	for (int i = 0; i < left; ++i)
	{
		locationsOfSrcImage = borderInterpolate(i - left, srcImage.cols, borderType);
		printf("%d,", locationsOfSrcImage);
	}
	printf("\n"); // left:3,2,1,

这段代码中,我们要计算左边扩充的像素在原图x方向上的坐标,由于borderInterpolate的第一个参数是扩充像素在原图中某一坐标轴上的坐标,注意,这些坐标是相对于原图来说的,由于原图最左边像素的坐标为0,所以这些扩充像素相对于原图坐标就是为负数,而left大小为3,所以i-left依次为-3,-2,-1,也就是扩充的3个像素在原图中的坐标为-3,-2,-1。borderInterpolate的第二个参数是原图像的坐标轴的长度,由于计算的x方向的坐标,对应x方向的长度,所以是cols。扩充类型是BORDER_REFLECT_101,对称法,扩充的像素对应原图像素的坐标为3,2,1。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cv::copyMakeBorder函数是OpenCV中的一个函数,用于在图像的边缘添加边框。纯C++实现该函数需要以下步骤: 1. 定义一个新的图像,大小为原图像加上上、下、左、右四个方向的边框大小。 2. 将原图像复制到新图像中间的部分。 3. 对于上、下、左、右四个边框,分别使用cv::copyTo函数将原图像的一部分复制到新图像的对应位置。 以下是一个简单的实现示例: ```cpp void copyMakeBorder(const cv::Mat& src, cv::Mat& dst, int top, int bottom, int left, int right, int borderType, const cv::Scalar& value) { int srcRows = src.rows; int srcCols = src.cols; int dstRows = srcRows + top + bottom; int dstCols = srcCols + left + right; dst.create(dstRows, dstCols, src.type()); // 复制原图像到新图像中间 src.copyTo(dst(cv::Rect(left, top, srcCols, srcRows))); // 添加上下左右四个边框 if (top > 0) { cv::Mat roi = dst(cv::Rect(0, 0, dstCols, top)); cv::Mat srcRoi = src(cv::Rect(0, 0, srcCols, top)); cv::copyTo(srcRoi, roi); } if (bottom > 0) { cv::Mat roi = dst(cv::Rect(0, dstRows - bottom, dstCols, bottom)); cv::Mat srcRoi = src(cv::Rect(0, srcRows - bottom, srcCols, bottom)); cv::copyTo(srcRoi, roi); } if (left > 0) { cv::Mat roi = dst(cv::Rect(0, 0, left, dstRows)); cv::Mat srcRoi = src(cv::Rect(0, 0, left, srcRows)); cv::copyTo(srcRoi, roi); } if (right > 0) { cv::Mat roi = dst(cv::Rect(dstCols - right, 0, right, dstRows)); cv::Mat srcRoi = src(cv::Rect(srcCols - right, 0, right, srcRows)); cv::copyTo(srcRoi, roi); } } ``` 其中,参数说明如下: - src:原图像 - dst:目标图像,将原图像加上边框后的结果 - top、bottom、left、right:上、下、左、右四个方向的边框大小 - borderType:边框类型,可以选择BORDER_CONSTANT、BORDER_REPLICATE等 - value:当使用BORDER_CONSTANT边框类型时,填充的颜色值

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值