Opencv1:图像的边界扩充

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像素扩充:

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值