前言

在C++中,cv::copyMakeBorder 函数是OpenCV库提供的一个非常实用的图像处理函数,它允许用户在图像的边界上添加额外的像素。这个功能在图像处理、计算机视觉等领域中非常重要,因为它可以帮助解决边缘效应问题,使得在边缘附近的像素也能被正常处理。

函数原理

cv::copyMakeBorder 函数的目的是创建一个新的图像,该图像在原始图像的边界上增加了指定的像素层。这些新增的像素层可以通过不同的方式填充,比如常数填充、边缘像素复制、边缘像素镜像等。
函数的原型如下:

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
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐