在对图片进行卷积处理的时候,如果卷积模版(卷积内核)过大,且不对原图的边界进行扩充,会导致处理之后得到的图片尺寸变的很小,也就是严重失真。

而扩充边界有多种方法,本文就介绍一下这些填充方法。

  1. 这是原始图像。

    python填充z Python填充图像边缘_卷积

      
  2.  根据图像的边界的像素值,向外扩充图片,每个方向扩充50个像素。
    a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REPLICATE)

    python填充z Python填充图像边缘_opencv_02

      
  3.  把靠近边界的50个像素翻折出去(轴对称):
    a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REFLECT)

    python填充z Python填充图像边缘_opencv_03

      
  4.  这是另一种折射:
    a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REFLECT_101)
    不知道有什么区别。

    python填充z Python填充图像边缘_卷积_04

      
  5. 常数填充:
    a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_CONSTANT,value=[0,255,0])

    python填充z Python填充图像边缘_python_05

      
  6. a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_WRAP)

    python填充z Python填充图像边缘_模版_06

 

 

  假设src为以下矩阵

  

python填充z Python填充图像边缘_opencv_07

 

 

  我们首先只在一个方向上,讨论,例如 top方向:

  top =5 或者 10, bottom =0,left 0,right =0;注意我们这里故意让top的值,大于 src的rows,即行数。查看结果

  borderType = BORDER_REFLECT:反射

  

python填充z Python填充图像边缘_反射机制_08

 

 

 

  解释:当按BORDER_REFLECT,向上给src加边界时,是按照src的反射机制来加的。
  borderType = BORDER_REPLICATE:复制

  

python填充z Python填充图像边缘_python_09

 

 

   

  解释:当BORDER_REPLICATE时,代表只复制边界。

  当left=5,bottom =5时,

  

python填充z Python填充图像边缘_反射机制_10

 

 

 

  BORDER_TYPE = BORDER_REFLECT_101:

  

python填充z Python填充图像边缘_反射机制_11

 

  解释:101,已经表明 0不参加反射机制。也即是以第一行为镜面,做反射

 

  示例代码:

  

import cv2
pic_path = r'F:\temp\temp_0807\diff\coco_0717\JPEGImages\000000049901.jpg'
img = cv2.imread(pic_path)
tar_img = cv2.copyMakeBorder(img,0,50,0,50,cv2.BORDER_CONSTANT,value=[0,0,0])
cv2.imwrite(pic_path,tar_img)