前言
在系列1中已经初步了解图像的组成并通过OpenCV函数对图片的组成进行了验证,接下来将学习图像基本的操作函数,包括图像的叠加、填充和腐蚀。
一、图像的叠加
1.1 叠加原理
已知图像是由其像素点颜色通道的数据组成,而图像之所以不同,就是因为像素点内数据不同。因此,若要将两图像进行叠加,实际为将两张图像的像素点数据进行叠加。
1.2 叠加问题
在实际进行叠加时,可能会出现以下问题。
- 图像尺寸不同,对应像素点颜色通道数据尺寸不同,因此需要首先图像对应的像素点数据进行修剪。
- 相同尺寸的图像直接进行叠加时,会出现超出数据范围的现象,这会导致叠加后的图像失真。
1.3 问题解决
针对图像尺寸不同导致叠加时,图像像素点数据不匹配的问题,可通过cv2.resize() 函数进行修剪。
- 大尺寸配对小尺寸
#将像素点数据修剪为474*474*3
img_dog=cv2.resize(img_dog,(474,474))
img_dog 为通过cv2.imread() 读取的图像像素点数据。
(474,474) 为要输出图像的像素点颜色通道尺寸,可进行任意修改。
通过cv2.resize() 函数可将大尺寸图片进行修剪,以匹配小尺寸图像。
- 小尺寸匹配大尺寸
img_cat=cv2.resize(img_cat,(0,0),fx=4,fy=4)
img_cat 为通过cv2.imread() 读取的图像像素点数据。
(0,0) 表示不对图像进行改变
fx=a,fy=b 表示将图片的宽沿轴扩大a倍,图片的高延y沿扩大b倍,式中a,b为变量。
通过cv2.resize() 函数可将小尺寸图像按照比例进行放大,从而配对大尺寸。
针对相同尺寸像素点数据进行叠加可能会超出范围的问题,可通过将两图像像素点数据设置权重后,再进行相加解决,对应函数为 cv2.addWeighted()。
res = cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
此时设置 img_cat 权重为0.4,img_dog 权重为0.6,补偿量为0。补偿量的作用为亮度调节。
1.4 结果展示
通过cv2.imshow() 即可得到如图所示图像,即小猫像素点数据与小狗像素点的叠加的结果,其中小猫数据权重为0.4,小狗数据权重为0.6,补偿量为0。
二、图像的填充
cv2.resize() 函数可将图像进行比例放大,但若所各个方向要进行不同程度的放大,就无法满足要求。因此,此处引入图像填充函数进行解决。
2.1 填充方法介绍
图像填充,又称图像的拓展,通常其具有5中填充的方法,分别为:复制法、轴对称法、中心对称法、外包装法和常量法。
2.2 复制法
复制法:即采用初始图像最边缘的像素点进行拓展填充
实现代码如下:
top_size,bottom_size,left_size,right_size = (100,100,100,100) #设置填充尺寸
replicate = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
cv2.MakeBorder 函数参数包括以下5点:
img :要进行拓展图像的像素点数据
上下左右要拓展的尺寸
borderType=cv2.BORDER_REPLICATE :指定进行拓展的方法,此处指定为复制法
2.3 轴对称法
轴对称法:假设图像数据为123456,则经过轴对称拓展后为54321 | 123456 | 65432,两边数据长度与拓展尺寸有关。
实现代码如下:
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
与复制法代码类型基本相同,不过最后指定格式要改为 borderType=cv2.BORDER_REFLECT 。
可推断,后续实现代码仅修改指定类型即可。
2.4 中心对称法
中心对称法:假设图像数据为123456,则经过中心对称法拓展后为
5432 1 2345 6 5432。
实现代码如下:
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
仅修改指定格式即可
2.5 外包装法
外包装法:类似于图像数据循环,若图像数据为123456,则经过外包装法后为
23456 123456 23456。
实现代码如下
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
2.6 常量法
常量法:选用特定颜色通道数据对图像进行填充,如若选用颜色通道值为0进行填充,等价于用黑色填充要拓展部分
实现代码如下
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)
相较于前4种实现方式,需要最后将特定的颜色通道数据赋值。
2.7 结果展示
三、图像的腐蚀
3.1 腐蚀的介绍
“腐蚀”一般应用于图像颜色通道数据仅有两种数字的图像,如黑白图,其作用为“腐蚀被包围领域”,使目标图像进行收缩,消除小且无意义的物体,以便后续数据便于处理和使用。
3.2 腐蚀的原理
腐蚀实质是通过“与”运算进行收缩,即通过设定固定大小的数组,全赋值为二值中被包围一方的数值,依次与图像的每个像素点数据的进行整体的“与”运算,即在数组覆盖范围内,若全为被包围一方的数值,则保留不变,但若包含包围一方的数值,则图像内该范围数值全部替换为包围一方的数值。
如图所示,方框大小即为数组大小,假设被包围圆其数值为1,则数组内数值均为1,当位于圆中时,相“与”为保持不变;当处于边界时,包含非1数值,则全置为非1,即黑色。此时的数组大小仅作为参考,实际运用时应根据被包围区域范围和实际需求进行设置。
3.3 腐蚀操作实现
首先要实现数组的选取,此处的数组又可称卷积核,即被包围区域权重数值权重为1,包围区域数值权重为0;
实现代码如下所示:
kernel=np.ones((30,30),np.uint8)
np.ones() 函数参数一般有两个,即数组的大小和数据的类型,现在函数规定数组的大小为30×30,数据类型为无符号8为整数,即卷积核的大小已定义。
接着实现卷积核的移动和“与”操作,OpenCV 有专门的操作函数cv2.erode进行实现
实现代码如下所示:
erosion_1=cv2.erode(pie,kernel,iterations=1)
函数参数包含3个部分:要进行腐蚀操作的图像数据 ,即此时的 pie;卷积核的大小,即此时的 kernel;要进行迭代的次数,即此时的 iterations=1 ,进行一次迭代,若要改变次数改变常数即可。
3.4 腐蚀结果展示
- 腐蚀前图片如下所示
文章来源:https://www.toymoban.com/news/detail-449739.html
- 腐蚀3次后图片如下图所示
迭代效果与卷积核大小息息相关。
总结
以上就是今天要分享的所有内容了,包括图像的叠加、拓展和腐蚀操作。本文所有内容均为本人的理解和书写,可能会有部分错误和不准确,欢迎大家指出。最后,如果觉得对你有用的话,就点个免费赞吧。文章来源地址https://www.toymoban.com/news/detail-449739.html
到了这里,关于OpenCV入门系列2:图像叠加、填充和腐蚀的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!