在对图片进行卷积处理的时候,如果卷积模版(卷积内核)过大,且不对原图的边界进行扩充,会导致处理之后得到的图片尺寸变的很小,也就是严重失真。
而扩充边界有多种方法,本文就介绍一下这些填充方法。
这是原始图像。
- 根据图像的边界的像素值,向外扩充图片,每个方向扩充50个像素。
a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REPLICATE)
- 把靠近边界的50个像素翻折出去(轴对称):
a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REFLECT)
- 这是另一种折射:
a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REFLECT_101)
不知道有什么区别。
- 常数填充:
a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_CONSTANT,value=[0,255,0])
- a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_WRAP)
假设src为以下矩阵
我们首先只在一个方向上,讨论,例如 top方向:
top =5 或者 10, bottom =0,left 0,right =0;注意我们这里故意让top的值,大于 src的rows,即行数。查看结果
borderType = BORDER_REFLECT:反射
解释:当按BORDER_REFLECT,向上给src加边界时,是按照src的反射机制来加的。
borderType = BORDER_REPLICATE:复制
解释:当BORDER_REPLICATE时,代表只复制边界。
当left=5,bottom =5时,
BORDER_TYPE = BORDER_REFLECT_101:
解释: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)
原文链接:https://jingyan.baidu.com/article/e73e26c096074e24adb6a736.html
原文链接:https://blog.csdn.net/zhangping1987/article/details/51141658