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

这篇具有很好参考价值的文章主要介绍了OpenCV入门系列2:图像叠加、填充和腐蚀。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在系列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 结果展示

OpenCV入门系列2:图像叠加、填充和腐蚀
通过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 结果展示

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

三、图像的腐蚀

3.1 腐蚀的介绍

“腐蚀”一般应用于图像颜色通道数据仅有两种数字的图像,如黑白图,其作用为“腐蚀被包围领域”,使目标图像进行收缩,消除小且无意义的物体,以便后续数据便于处理和使用。

3.2 腐蚀的原理

腐蚀实质是通过“与”运算进行收缩,即通过设定固定大小的数组,全赋值为二值中被包围一方的数值,依次与图像的每个像素点数据的进行整体的“与”运算,即在数组覆盖范围内,若全为被包围一方的数值,则保留不变,但若包含包围一方的数值,则图像内该范围数值全部替换为包围一方的数值。

OpenCV入门系列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 腐蚀结果展示

  • 腐蚀前图片如下所示

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

  • 腐蚀3次后图片如下图所示
    OpenCV入门系列2:图像叠加、填充和腐蚀
    迭代效果与卷积核大小息息相关。

总结

以上就是今天要分享的所有内容了,包括图像的叠加、拓展和腐蚀操作。本文所有内容均为本人的理解和书写,可能会有部分错误和不准确,欢迎大家指出。最后,如果觉得对你有用的话,就点个免费赞吧。文章来源地址https://www.toymoban.com/news/detail-449739.html

到了这里,关于OpenCV入门系列2:图像叠加、填充和腐蚀的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv 图像腐蚀膨胀 erode dilate

    2024年02月16日
    浏览(49)
  • OpenCV图像处理学习十,图像的形态学操作——膨胀腐蚀

    一.形态学操作概念 图像形态学操作是指基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学对图像进行处理。 形态学有四个基本操作:腐蚀、膨胀、开操作、闭操作,膨胀与腐蚀是图像处理中最常用的形态学操作手段。 二.形态学操作-膨胀 跟卷积

    2024年02月05日
    浏览(53)
  • OpenCV 入门教程:膨胀和腐蚀操作

    膨胀和腐蚀是图像处理中常用的形态学操作,用于改变图像的形状和结构。在 OpenCV 中,膨胀和腐蚀是基于结构元素的像素操作,可以用于图像增强、边缘检测、图像分割等多个领域。本文将以膨胀和腐蚀操作为中心,为你介绍使用 OpenCV 进行形态学操作的基本步骤和实例。

    2024年02月13日
    浏览(41)
  • 《数字图像处理-OpenCV/Python》连载(1)前言

    本书京东优惠购书链接:https://item.jd.com/14098452.html 写作背景 编写本书的初衷,源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中,我选择的是数字图像处理方向。老师向我推荐的教材是冈萨雷斯的《数字图像处理》。学习的开始阶段非常困难。教

    2024年02月11日
    浏览(56)
  • opencv(三)边界填充、图像融合、图像阈值处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 边界填充就是将图片按一定的方法将图片的四周向外填充并将图片放大 因为opencv中的颜色通道不是RGB而是BGR,所以我们要用到之前讲到的分割将颜色通道重新整合成RGB后再用matplotlib库将其画出 BORDER_R

    2024年02月21日
    浏览(54)
  • python opencv实现找到图像的轮廓,填充颜色

    我想找到图片中的闭合圈,然后填充颜色 所需要的cv函数: 1。 OpenCV提供的findContours()方法可以通过计算图像梯度来判断出图像的边缘,然后将边缘的点封装成数组返回。    image : 为检测的图像,必须是8位单通道二值图像。如果原图为彩色的,必须转为灰度图,并通过二值

    2024年02月04日
    浏览(40)
  • 我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

    例如,设定阈值为127,然后:  将图像内所有像素值大于 127 的像素点的值设为 255。  将图像内所有像素值小于或等于 127 的像素点的值设为 0。 cv2.threshold() 和 cv2.adaptiveThreshold() 是 OpenCV 中用于实现阈值处理的两个函数,它们之间有以下区别: 1.1.1. cv2.threshold(): 这个函数

    2024年02月05日
    浏览(58)
  • 【opencv】示例-inpaint.cpp 图像修复是通过填充损坏图像部分从而修复这些损坏的过程...

    原始图像 这段代码展示了一个使用OpenCV库进行图像修复的例子。它首先包含了处理图像编码、解码、显示、处理和照片处理所必要的OpenCV模块的头文件。然后利用cv和std命名空间下的类和方法。通过定义一个鼠标回调函数onMouse来处理图像上的绘图操作,并通过主函数main处理

    2024年04月25日
    浏览(43)
  • Android OpenCV(四十一):图像分割(漫水填充法),看完豁然开朗

    漫水填充算法是根据像素灰度值之间的差值寻找相同区域实现分割。我们可以将图像的灰度值理解成像素点的高度,这样一张图像可以看成崎岖不平的地面或者山区,向地面上某一个低洼的地方倾倒一定量的水,水将会掩盖低于某个高度的区域。漫水填充法利用的就是这样的

    2024年04月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包