图像增广中,边缘填充颜色写元组还是写单一数值
一,写元组:
self.border_fill_value = 114, 114, 114 # 定义为元组
# 仿射变换的时候的写法:
merge_mosaic_image = cv2.warpAffine(merge_mosaic_image, M,
(self.image_size, self.image_size),
flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_CONSTANT,
borderValue=self.border_fill_value) # 本身定义的时候就是元组,直接传入就行
# 四周填充
image = cv2.copyMakeBorder(image, pad_top, pad_bottom, pad_left, pad_right,
borderType=cv2.BORDER_CONSTANT,
value=self.border_fill_value)
此时的加载速度为:
二、写数值的时候:
self.border_fill_value = 114 # 定义为数值形式
# (B, G, R)
# (114, 0, 0) 这里的borderValue需要写元组,底层是c++ 速度快
merge_mosaic_image = cv2.warpAffine(merge_mosaic_image, M,
(self.image_size, self.image_size),
flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_CONSTANT,
borderValue=(self.border_fill_value, self.border_fill_value, self.border_fill_value))
# 四周填充
image = cv2.copyMakeBorder(image, pad_top, pad_bottom, pad_left, pad_right,
borderType=cv2.BORDER_CONSTANT,
value=(self.border_fill_value, self.border_fill_value, self.border_fill_value))
此时的速度:
速度是原来的1.72倍。
所以: np.full 如果填充的是tuple,会造成性能严重影响,所以填充的值一定要给int
warpAffine中提供的borderValue必须是tuple,如果是数值,就等同于(114, 0, 0),这并不是预期的颜色,而提供tuple,会在C++层面被解析正确高效的处理,不存在np.full的问题。C++中memset -—> cpu直接提供的指令,是非常高效的。如果提供的是tuple,只能循环赋值,这里指的是np.full