您的位置:首页 > 运维架构

opencv学习(三十一)之图像边缘像素填充估计copyMakeBorder()

2017-02-15 17:55 621 查看
前面讲到图像卷积运算的时候涉及到对图像边缘像素的估计,这里讲介绍图像边缘像素进行卷积运算。大部分opencv中的函数是将原图像复制到一个比原图像尺寸更大的图像中然后实现边缘的自动填充。这种方式得到的像素点可以执行卷积操作。下面介绍两种方式:

- 1.BORDER_CONSTANT:使用一个常数填充像素边缘

- 2.BORDER_REPLICATE:将图像中边缘的行和列像素值直接填充像素边缘

opencv提供了copyMakeBorder()函数实现对图像边缘像素填充的功能,其函数原型如下:

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


参数解释:

InputArray: 输入图像

OutputArray: 输出图像

int top/bottom/left/right四个参数指定原图像由每个方向上向外插入的像素个数,例如:top=1, bottom=1, left=1, right=1意味着图像向外扩充一个像素。

int borderType: 边缘类型,可以通过borderInterpolate()查看详细信息。

const Scalar & value = Scalar():当像素填充类型为BORDER_CONSTANT时填充的像素值。

其示例代码如下:

/*程序说明
*当按下按键‘c’代表使用BORDER_CONSTANT
*RNG生成的随机数作为像素值进行填充
*当按下按键‘r’代表使用BORDER_REPLICATE
*图像扩充的边框由原图像边缘像素的值进行填充
*/

#include <opencv2/imgproc.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;

//声明全局变量
Mat srcImage, dstImage;
int g_top, g_bottom, g_left, g_right;
int borderType;
Scalar value;
String windowName = "copyMakeBorder Demo";
RNG rng(12345);

int main()
{
int c;

srcImage = imread("dog.jpg");

//判断图像是否加载成功
if(srcImage.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
else
cout << "图像记载成功" << endl << endl;
imshow("原图像", srcImage);

//程序使用说明
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(windowName, WINDOW_AUTOSIZE);

//初始化边框参数
g_top = (int)(0.05*srcImage.rows);
g_bottom = (int)(0.05*srcImage.rows);
g_left = (int)(0.05*srcImage.cols);
g_right = (int)(0.05*srcImage.cols);

//显示初始图像
dstImage = srcImage;
imshow(windowName, dstImage);

while(true)
{
c = waitKey(500);

if((char)c == 27)   //c为ESC程序退出
{break;}
else if((char)c == 'c')
{borderType = BORDER_CONSTANT;}
else if((char)c == 'r')
{borderType = BORDER_REPLICATE;}

value = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copyMakeBorder(srcImage, dstImage, g_top, g_bottom, g_left, g_right, borderType, value);

imshow(windowName, dstImage);
}

return 0;
}


运行结果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息