Opencv1:图像的边界扩充
(1)opencv自带函数实现:
①函数原型:
copyMakeBorder(输入图像, 填充后图像, sizeTop, sizeBottom, sizeLeft, sizeRight, 填充模式);
②填充模式参数:
1)BORDER_REPLICATE:对边界像素进行复制;
2)BORDER_REFLECT:以边缘为轴进行轴对称;
3)BORDER_REFLECT_101:以最边缘像素为轴进行轴对称;
4)BORDER_WRAP:根据对边像素填充;
5)BORDER_CONSTANT:常量复制。
(2)试对BORDER_REFLECT模式的边界扩充进行重写:
①代码:
void copyBorder(const Mat& image, Mat& imageResult , int sizeTop, int sizeBottom, int sizeLeft, int sizeRight)
{
int nr = image.rows;
int nc = image.cols;
imageResult.create(nr + sizeTop+ sizeBottom, nc+ sizeLeft + sizeRight,image.type());
for (int i = 0;i<nr + sizeTop + sizeBottom;i++)
{
for (int j = 0;j<nc + sizeLeft + sizeRight;j++)
{
if((i < sizeTop)|| (i > nr + sizeTop-1))
{
if (i < sizeTop) //[1]上部填充像素
{
if (j < sizeLeft)
{
imageResult.at<uchar>(i, j) = image.at<uchar>(sizeTop - i - 1, sizeLeft - j - 1);
}
else if(j > nc + sizeLeft - 1)
{
imageResult.at<uchar>(i, j) = image.at<uchar>(sizeTop - i - 1, nc * 2 - j + sizeLeft - 1);
}
else
{
imageResult.at<uchar>(i, j) = image.at<uchar>(sizeTop - i - 1, j - sizeLeft);
}
}
else //[2]下部填充像素
{
if (j < sizeLeft)
{
imageResult.at<uchar>(i, j) = image.at<uchar>(nr * 2 - i + sizeTop - 1, sizeLeft - j - 1);
}
else if (j > nc + sizeLeft - 1)
{
imageResult.at<uchar>(i, j) = image.at<uchar>(nr * 2 - i + sizeTop - 1, nc * 2 - j + sizeLeft - 1);
}
else
{
imageResult.at<uchar>(i, j) = image.at<uchar>(nr * 2 - i + sizeTop - 1, j - sizeLeft);
}
}
}
else if((j < sizeLeft) || (j > nc + sizeLeft - 1))
{
if (j < sizeLeft) //[3]左部填充像素
{
imageResult.at<uchar>(i, j) = image.at<uchar>(i - sizeTop, sizeLeft-j-1);
}
else //[4]右部填充像素
{
imageResult.at<uchar>(i, j) = image.at<uchar>(i - sizeTop, nc*2 - j+ sizeLeft - 1);
}
}
else
{
//非填充像素保持原值
imageResult.at<uchar>(i, j) = image.at<uchar>(i- sizeTop, j- sizeLeft);
}
}
}
}
②效果测试:
1)原图:
2)上下左右150像素扩充: