函数的原型如下:
cv::copyMakeBorder(src, dst, top, bottom, left, right, borderType, value);
参数解释:
src:输入图像。
dst:输出图像,它应该具有与源图像相同的尺寸和类型。
top, bottom, left, right:表示在各个边界添加的像素数目。
borderType:定义了边界的类型。它可以是以下值之一:
cv::BORDER_CONSTANT:如果边界类型是常量,那么所有的像素都将被设置为常量值。这是通过 value 参数定义的。
cv::BORDER_REFLECT:对于这个类型,像素是通过对角线镜像复制的。例如,如果我们在顶部添加了2个像素,那么第一个和最后一个像素会镜像复制到新的边界中。
cv::BORDER_WRAP:在这种情况下,如果像素在源图像中越界,那么它们会被复制到另一侧。例如,如果我们在顶部添加了2个像素,那么第一个和最后一个像素会复制到下面。
cv::BORDER_REFLECT_101:这与 cv::BORDER_REFLECT 类似,但是强度较低(即像素强度只被复制到新边界的一个方向)。
cv::BORDER_DEFAULT:这是 cv::BORDER_REFLECT_101 的别名。
cv::BORDER_ISOLATED:这个选项要求源和目标图像是不同的,这样就避免了在目标图像中修改源图像的问题。
value:当 borderType 为 cv::BORDER_CONSTANT 时,这个值定义了边界的常数值。它是一个包含B、G、R、A四个通道的向量(对于彩色图像)。对于灰度图像,它只有一个通道。
下面以cv::BORDER_CONSTANT为例进行运行展示。
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include "opencv2/core.hpp"
#include <opencv2/highgui/highgui.hpp>
void Ceshi_Fun()
{
cv::Mat src = cv::imread("./10001_1.jpg"); // Load an image
cv::imshow("1", src);
cv::waitKey(0);
cv::Mat dst;
//上边界扩充40行,下边界扩充20行,左边扩充30列,右边扩充10列
int top = 40, bottom = 20, left = 30, right = 10;
//扩充部分用像素值(111,114,114)填充
cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(114, 114, 114));
cv::imshow("2", dst);
cv::waitKey(0);
std::cout<<" " << std::endl;
}
int()
{
Ceshi_Fun();
return 0;
}
图像处理前:
尺寸大小为1920*1080
图像处理后:
尺寸大小为1960*1140