函数原型
void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar() );
参数说明
- InputArray类型的src,输入图像,如Mat类型。
- OutputArray类型的dst,输出图像。
- int类型的top,表示向上扩展多少像素。
- int类型的bottom,表示向下扩展多少像素。
- int类型的left,表示向左扩展多少像素。
- int类型的right,表示向右扩展多少像素。
- int类型的borderType,推断图像边缘像素的边界模式。
- const Scalar&类型的value,有默认值Scalar(),即0。
测试代码
#include<iostream> #include<opencv2/opencv.hpp> #include<ctime> using namespace std; using namespace cv; cv::Mat image_make_border(cv::Mat &src); int main(void) { Mat test = imread("liu.jpg", 0); cv::Mat result=image_make_border(test); imshow("original", test); imshow("result", result/255); waitKey(0); system("pause"); return 0; } // 图像边界处理 cv::Mat image_make_border(cv::Mat &src) { int w = cv::getOptimalDFTSize(src.cols); // 获取DFT变换的最佳宽度 int h = cv::getOptimalDFTSize(src.rows); // 获取DFT变换的最佳高度 cv::Mat padded; // 常量法扩充图像边界,常量 = 0 cv::copyMakeBorder(src, padded, 0, h - src.rows, 0, w - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0)); padded.convertTo(padded, CV_32FC1); return padded; }
测试效果
图1 REPLICATE扩充效果
图2 WRAP扩充效果
图3 REFLECT扩充效果
图4 REFLECT101扩充效果
上图展示了4种不同的图像扩展方案:CONSTANT就不多说了,常数扩展,第八个参数设置为255,那就扩展的数据全是255;图1是REPLICATE扩展,最边缘的数据是什么,那么下面那一列或者行都是这个数据,图中看出来就是一条条竖线;图2是WRAP扩展,把另一头的数据拿到下面来补上,有点类似于周期性的感觉;图3是REFLECT扩展,将图像下方数据镜像反转,对称式填充,从图中可以看出来;图4是REFLECT101,顾名思义,0不动,只对称1,和图3不一样的地方在于,它把最边缘的那一行数据作为轴线,不参与翻转,也就是从次边缘开始对称填充~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!