cv2.split(img)
cv2中提供了split函数来帮助我们提取颜色通道,参数img为图像变量名,返回值有三个,分别为b通道,g通道,r通道。返回值会分别得到图像的bgr通道对应的图像数据。
例:
当我们对图像大小进行操作时,图像原来的规格可能与我们需求的规格有所差异,在调整时,对于规格差异部分我们就需要进行边界填充
cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
参数img为图像变量名,参数top_size, bottom_size, left_size, right_size分别为上,下,左,右四个边的长度大小,参数borderType为填充方式
具体的填充方式如下:
BORDER_REPLICATE: 复制法,也就是复制最边缘像素。
BORDER_REFLECT: 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101: 反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP: 外包装法 cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT: 常量法,常数值填充。
具体效果如下图:
(常数填充的常数为0)
图像的存储的底层为Ndarray的结构,所以我们可以通过对其底层结构进行数值上的操作从而来操作图像
加法运算
当图像直接加上一个常数值的时候,由于图像的ndarray结构,所以图像中的每个像素点都加上该常数(numpy的广播机制,每个元素同时进行运算,或者说一个矩阵加上一个常数则矩阵中的每个元素都加上这个元素)
Ndarray类型数据索引的格式不懂的可以参考 numpy基础知识二
当图像直接相加时,必须要保证两个图像规格相同,或者说两个矩阵相加的条件是必须是同型矩阵,图像相加时,对应ndarray中的数据相加,即矩阵相加时对应位置元素相加
数据继承上例
这里我们可以看到得到结果并不是对应位置相加。因为颜色通道范围前面提到过是0~255,不存在大于255或者小于0的亮度,所以当我们图像数据ndarray中的元素溢出时我们保留溢出部分,即当数越界时,我们保留这个数模上256(0~255,共计256)的值。
cv2中也为我们提供了加法运算的函数
cv2.add(img_cat,img_cat2)
cv2中提供的加法函数的运算与numpy中ndarray的运算不同
当图像数据中的元素溢出时将不在取模,而是直接取最大亮度255。
图像融合
上述介绍完加法后,我们可以尝试通过运算ndarray中的数据来操作图像
现有两图片
我们尝试利用ndarray中加法运算将其融合
在相加前要调整规格(大小)保持一致
规格不同不能进行运算
调整规格,一致后可进行相加
效果如下
溢出部分按取模保留数据。
接下来我们尝试用cv2中函数来进行融合
cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
addWeighted函数以权重的方式将图片进行相加,最后一个参数为偏置项。可理解为 : 结果=a图一+b图二+偏置项
继承上例,规格已经调好,效果如下



