• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

OpenCV入门系列2图像叠加、填充和腐蚀

武飞扬头像
头秃的小梁
帮助1

前言

在系列1中已经初步了解图像的组成并通过OpenCV函数对图片的组成进行了验证,接下来将学习图像基本的操作函数,包括图像的叠加、填充和腐蚀。

一、图像的叠加

1.1 叠加原理

已知图像是由其像素点颜色通道的数据组成,而图像之所以不同,就是因为像素点内数据不同。因此,若要将两图像进行叠加,实际为将两张图像的像素点数据进行叠加。

1.2 叠加问题

在实际进行叠加时,可能会出现以下问题。

  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 腐蚀结果展示

  • 腐蚀前图片如下所示

学新通

  • 腐蚀3次后图片如下图所示
    学新通
    迭代效果与卷积核大小息息相关。

总结

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgccgag
系列文章
更多 icon
同类精品
更多 icon
继续加载