边界填充¶
1. 边界填充简介¶
① 边界填充就是对图像进行一些变换,让原始图像进行扩大。
② 边界填充的入口参数:
- BORDER_REPLICATE:复制法,也就是复制最边缘像素。
- BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
- BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
- BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
- BORDER_CONSTANT:常量法,常数值填充。
In [1]:
import cv2 #opencv的缩写为cv2
import matplotlib.pyplot as plt # matplotlib库用于绘图展示
import numpy as np # numpy数值计算工具包
# 魔法指令,直接展示图,Jupyter notebook特有
%matplotlib inline
In [2]:
img = cv2.imread('01_Picture/01_cat.jpg')
top_size,bottom_size,left_size,right_size = (50,50,50,50) # 填充多少区域
# 最后一个入口参数为填充方式
# 方式一:复制法
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
# 方式二:反射法
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
# 方式三:反射法二(不要最边缘的像素)
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
# 方式四:外包装法
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
# 方式五:常量法
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
In [3]:
import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img,'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate,'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect,'gray'), plt.title('REPLECT')
plt.subplot(234), plt.imshow(wrap,'gray'),plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236), plt.imshow(constant,'gray'),plt.title('CONSTAVI')
plt.show()
2. 阈值越界处理¶
In [4]:
img_cat = cv2.imread('01_Picture/01_cat.jpg')
img_dog = cv2.imread('01_Picture/03_dog.jpg')
img_cat2 = img_cat + 10 # 将 img_cat 矩阵中每一个值都加 10
print(img_cat[:5,:,0])
print(img_cat2[:5,:,0])
print((img_cat+img_cat2)[:5,:,0]) # 0-255 若相加越界后 294 用 294%256 获得余数 38
[[142 146 151 ... 156 155 154] [107 112 117 ... 155 154 153] [108 112 118 ... 154 153 152] [139 143 148 ... 156 155 154] [153 158 163 ... 160 159 158]] [[152 156 161 ... 166 165 164] [117 122 127 ... 165 164 163] [118 122 128 ... 164 163 162] [149 153 158 ... 166 165 164] [163 168 173 ... 170 169 168]] [[ 38 46 56 ... 66 64 62] [224 234 244 ... 64 62 60] [226 234 246 ... 62 60 58] [ 32 40 50 ... 66 64 62] [ 60 70 80 ... 74 72 70]]
In [5]:
cv2.add(img_cat,img_cat2)[:5,0] # cv2.add 是越界后取最大值 255
Out[5]:
array([[255, 255, 255],
[224, 246, 255],
[226, 248, 255],
[255, 255, 255],
[255, 255, 255]], dtype=uint8)