边界填充
涉及到的函数:
copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)
其中,填充类型borderType主要的有一下四种类型:
BORDER_CONSTANT :可以用指定的像素去填充图像边界,value可以是一个值,也可以是表示RGB的一个元组(value = (0,255,255))
具体填充方式如下:
BORDER_REPLICATE :就是用图像最边缘的像素进行填充
效果如下:
具体填充方式如下:
BORDER_WRAP:比如最下面的边界要用图像最上面的像素去填充,最左边的边界要用图像最右边的像素进行填充,同理,其他边界一样,比如下方这个图,仔细观察就可以明白这种填充方式。
具体填充方式:
BORDER_REFLECT:就是以图像边界为轴以镜像的方式(图像的边界像素也会被用来填充)将像素填充到需要填充的范围内。如下图所示:
具体方式如下图实验:
代码:
img_original = np.array([[0,0 ,0 ,0 ,0 ,0],
[1,69 ,52 , 32 ,44 ,3],
[1,63 ,83 , 38 ,63 ,3],
[1 ,36 ,37 , 36 ,37, 3],
[1,37 ,37 , 41 ,45 ,3],
[1,37 ,38 , 38 ,44 ,3],
[1, 42, 42, 36, 40, 3],
[1, 69, 52, 32, 44, 3],
[1, 63, 83, 38, 63, 3],
[1, 36, 37, 36, 37, 3],
[1, 37, 37, 41, 45, 3],
[2, 2, 2, 2, 2, 2]],dtype=np.uint8)
print("原来的图像img_original:",img_original)
#cv2.imshow("原来的图像img_original:",img_original)
#cv2.waitKey(0)
top,bottom,left,right = (3,3,3,3)
reflect = cv2.copyMakeBorder(img_original,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
img_reflect = np.asarray(reflect)
print("用reflect填充后的图像:",img_reflect)
实验结果:
原来的图像img_original:
用reflect填充后的图像:
BORDER_REFLECT_101:和BORDER_REFLECT其实是一样的,只不过是在填充的时候,不用图像的边界像素去镜像填充。具体填充方式如下图所示:
2、图像数值计算
图像的算术运算特别多,比如两张图片可以做加减乘除,也可以做位运算、平方根、对数、绝对值等。以下是图片的加法运算。
2.1 图片的加法
可以直接加一个数值,也可以两张图片进行加法运算。可以使用CV2中的加法,也可以使用numpy中的加法。但是二者有区别。具体区别如下:
方法一:numpy加法:
img=cv2.imread("vue.jpg")
print("img",img)
print("_______________")
img_1 = img+200
print("img_1",img_1)
结果:
分析:使用numpy对图像进行加法的时候
1.若图像+图像 或 图像 + 数值 < = 255,则最后的结果就是相加的结果
2.若图像+图像 或 图像 + 数值 > 255,则最后的结果 = 图像+数值(图像+图像)% 256
方法二、使用cv2.add()进行相加运算
img = cv2.imread("vue.jpg")
print("img",img)
print("_______________")
img_1 = cv2.add(img,200)
cv2.imshow("img_1",img_1)
print("img_1",img_1)
结果:
分析:使用cv2.add()对图像进行加法的时候
1.若图像+图像 或 图像 + 数值 < = 255,则最后的结果就是相加的结果
2.若图像+图像 或 图像 + 数值 > 255,则最后的结果 = 255
注意:两张图片相加的时候一定要shape相同。
2.2 图像融合
现在想要把这两张图片融合在一起。那么直接进行以下相加的操作。
报错了:
所以正确的方式应该先将两张图片的shape值保持一样(其中一张图片进行resize()操作就可以了。在进行加法的时候也不是简单的相加,要调用cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None):,其中alpha、Beta是两张图片分别占最后混合图片的权重。(dst = src1alpha + src2beta + gamma;)
img = cv2.imread("vue.jpg")
img_dog = cv2.imread("dog.jpg")
img_dog_resize = cv2.resize(img_dog,(820,544))
print(img_dog_resize.shape)
img_mix = cv2.addWeighted(img,0.5,img_dog_resize,0.5,0)
cv2.imshow("img_mix",img_mix)
print("img_mix",img_mix)
cv2.waitKey(100000)
具体效果如下: