OpenCV-扩充图像边界cv::copyMakeBorder
Posted 翟大宝Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV-扩充图像边界cv::copyMakeBorder相关的知识,希望对你有一定的参考价值。
函数原型
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;
}
测试效果
上图展示了4种不同的图像扩展方案:CONSTANT就不多说了,常数扩展,第八个参数设置为255,那就扩展的数据全是255;图1是REPLICATE扩展,最边缘的数据是什么,那么下面那一列或者行都是这个数据,图中看出来就是一条条竖线;图2是WRAP扩展,把另一头的数据拿到下面来补上,有点类似于周期性的感觉;图3是REFLECT扩展,将图像下方数据镜像反转,对称式填充,从图中可以看出来;图4是REFLECT101,顾名思义,0不动,只对称1,和图3不一样的地方在于,它把最边缘的那一行数据作为轴线,不参与翻转,也就是从次边缘开始对称填充~
以上是关于OpenCV-扩充图像边界cv::copyMakeBorder的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-扩充图像边界cv::copyMakeBorder