引言:
边框是图像处理中的一项基本操作,在很多场景下需要为图像添加不同类型的边框,例如图像卷积操作时需要对图像进行扩展边界,又如在机器学习中将不同的图片统一成同一尺寸时,常会为图像添加边框。OpenCV的copyMakeBorder函数提供了一种方便快捷的方法,可以为图像增加不同类型的边框。本文将介绍如何使用copyMakeBorder函数来为图像添加不同类型的边框,以及各种边框类型的特点。
copyMakeBorder函数是OpenCV中用于为图像添加边框的函数。该函数的语法如下:
cv::copyMakeBorder(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
int top, int bottom, // 左侧和右侧边框的大小
int left, int right, // 上方和下方边框的大小
int borderType, // 边框类型
cv::Scalar value = cv::Scalar() // 边框的颜色值,对于特定的borderType可以不用设置
);
具体说明:
- `src`:表示输入图像,可以是Mat、UMat或NDArray类型。
- `dst`:表示输出图像,其类型必须与输入图像相同。
- `top`、`bottom`、`left`和`right`:表示需要添加的上、下、左和右的像素行数或列数。
- `borderType`:表示需要添加的边框的类型,可以设置为以下内容之一:
- `cv::BORDER_CONSTANT`:表示用常数填充边界,常数由value参数指定。
- `cv::BORDER_REFLECT`:表示用边界像素的镜像填充边界。
- `cv::BORDER_REFLECT101`:表示用边界像素的反向镜像填充边界。
- `cv::BORDER_REPLICATE`:表示用边界像素的复制填充边界。
- `cv::BORDER_WRAP`:表示用边界像素的环绕方式填充边界。
- `value`:表示用于填充边界的颜色值,如果不指定,则默认为黑色。
copyMakeBorder函数可用于为输入图像添加边框,其可以用于卷积运算等场景。它可以实现各种边框类型,从而满足不同场景的需求。
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
// Declare the variables
Mat src, dst;
int top, bottom, left, right;
int borderType = BORDER_CONSTANT;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);
int main( int argc, char** argv )
{
const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
// Loads an image
src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
// Check if image is loaded fine
if( src.empty()) {
printf(" Error opening image\n");
printf(" Program Arguments: [image_name -- default lena.jpg] \n");
return -1;
}
// Brief how-to for this program
printf( "\n \t copyMakeBorder Demo: \n" );
printf( "\t -------------------- \n" );
printf( " ** Press 'c' to set the border to a random constant value \n");
printf( " ** Press 'r' to set the border to be replicated \n");
printf( " ** Press 'ESC' to exit the program \n");
namedWindow( window_name, WINDOW_AUTOSIZE );
// Initialize arguments for the filter
top = (int) (0.05*src.rows); bottom = top;
left = (int) (0.05*src.cols); right = left;
for(;;)
{
Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );
copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );
imshow( window_name, dst );
char c = (char)waitKey(500); if( c == 27 )
{ break; }
else if( c == 'c' )
{ borderType = BORDER_CONSTANT; }
else if( c == 'r' )
{ borderType = BORDER_REPLICATE; }
}
return 0;
}
以上例子就是一个简单图像添加边框的copyMakeBorder函数应用。