深度学习之数据增强一(opencv图像填充)
·
本文目的:将所有图像等比例缩放到小于224x224x3,然后再对不足224x224x3部分填充黑边,达到所有图片都是224x224x3的规格。
本人才疏学浅,也不知道如何准确论证为何填充黑边是有效的行为,反正,亲测效果十分明显。
import cv2
f = open("img_path.txt") #读取存放图像文件的文本文件
i = 1
for name in f:
name = name.split("\n")[0] #根据自己txt文件格式来读取图像路径
img = cv2.imread(name) #opencv读取图片
heigth,width = img.shape[0],img.shape[1] #获取图片的长和宽
n = 1
while True:
#等比例缩小图片
new_heigth = heigth/n
new_width = width/n
#如果小于224x224,那么进行填充以及保存处理
if (new_heigth <=224) and (new_width <=224):
image = cv2.resize(img, (int(new_heigth), int(new_width)))
a = int((224 - new_width) / 2)
b = int((224 - new_heigth) / 2)
#进行黑边填充,关于该语句的详细解读看附录
image = cv2.copyMakeBorder(image, a, a, b, b, cv2.BORDER_CONSTANT, value=[0, 0, 0])
cv2.imwrite("saved_image_file\\"+str(i)+".jpg", image)
#打印保存成功
print("save {}.jpg successful !".format(i))
i += 1
break
#处理长宽不统一的情况
elif (new_heigth <=224) and (new_width > 224):
n += 1
new_width = width / n
elif (new_heigth > 224) and (new_width <= 224):
n += 1
new_heigth = heigth/n
n += 1
其实只是一些python语句和opencv的语句在运用而已,并无多少难度,但是有一句有必要详细说明。
image = cv2.copyMakeBorder(image, a, a, b, b, cv2.BORDER_CONSTANT, value=[0, 0, 0])
首先cv2.copyMakeBorder(),看到这个名字也能盲猜是填充边界。
而参数有以下这些

其中borderType则是图片填充方式:有如下几种
cv2.BORDER_CONSTANT:填充边界时使用常数填充
cv2.BORDER_REPLICATE:使用边界最接近的像素填充,也就是用边缘像素填充
cv2.BORDER_REFLECT:反射法,是指对图像的像素两边进行复制
cv2.BORDER_REFLECT101:反射法,把边缘的像素作为轴,对称的复制
cv2.BORDER_WRAP:用另一边的像素进行填充
而value=[ , , ]的三个值在0~255之间,分别过红绿蓝(RGB)。
eg:[0,225,0]则填充绿色。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)