OpenCV-扩充图像边界cv::copyMakeBorder

函数原型

void copyMakeBorder(InputArray src, OutputArray dst,
                    int top, int bottom, int left, int right,
                    int borderType, const Scalar& value = Scalar() );

 

参数说明

  1. InputArray类型的src,输入图像,如Mat类型。
  2. OutputArray类型的dst,输出图像。
  3. int类型的top,表示向上扩展多少像素。
  4. int类型的bottom,表示向下扩展多少像素。
  5. int类型的left,表示向左扩展多少像素。
  6. int类型的right,表示向右扩展多少像素。
  7. int类型的borderType,推断图像边缘像素的边界模式。
  8. const Scalar&类型的value,有默认值Scalar(),即0。

 

测试代码

#include
#include
#include
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;
}

 

测试效果

OpenCV-扩充图像边界cv::copyMakeBorder_第1张图片 图1 REPLICATE扩充效果
OpenCV-扩充图像边界cv::copyMakeBorder_第2张图片 图2 WRAP扩充效果
OpenCV-扩充图像边界cv::copyMakeBorder_第3张图片 图3 REFLECT扩充效果
OpenCV-扩充图像边界cv::copyMakeBorder_第4张图片 图4 REFLECT101扩充效果

上图展示了4种不同的图像扩展方案:CONSTANT就不多说了,常数扩展,第八个参数设置为255,那就扩展的数据全是255;图1是REPLICATE扩展,最边缘的数据是什么,那么下面那一列或者行都是这个数据,图中看出来就是一条条竖线;图2是WRAP扩展,把另一头的数据拿到下面来补上,有点类似于周期性的感觉;图3是REFLECT扩展,将图像下方数据镜像反转,对称式填充,从图中可以看出来;图4是REFLECT101,顾名思义,0不动,只对称1,和图3不一样的地方在于,它把最边缘的那一行数据作为轴线,不参与翻转,也就是从次边缘开始对称填充~

你可能感兴趣的:(OpenCV,opencv,c++)