[python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充

一、学习目标

  1. 了解什么是ROI
  2. 了解floodFill的使用方法

如有错误欢迎指出~

目录

[python opencv 计算机视觉零基础到实战] 一、opencv的helloworld

[【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 三、numpy与图像编辑] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解] 一、opencv的helloworld

[[python opencv 计算机视觉零基础到实战] 五、对象追踪] 一、opencv的helloworld
[python opencv 计算机视觉零基础到实战] 六、图像运算
[python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用

二、了解OpenCV中图像ROI的颜色填充

2.1 了解ROI是什么

ROI指的是region of Interest,翻译过来就是你所感兴趣的区域。弱在一张图片中,你感兴趣的是某一个区域,那么这个区域就可以称为ROI。我们通过一些方法选取了该区域后,可以进行操作;例如颜色填充、图像变换等编辑。

先有一张图如下:

我们对这张图的激光雕刻机部分感兴趣,那么就可以选取该部分。如何进行选取呢?我们可以通过代码得知该图片的大小:

import cv2
img = cv2.imread(r"C:\Users\Administrator\Desktop\1.jpg")
print(img.shape)

得到该图片的高宽分别为447与755。

我们可以通过粗略的丈量得知激光雕刻机应在整个图片的正中央,那么宽应该为一半,大致在200到400之间;由于图片中激光雕刻机位于图片偏下部分,所以可以粗略得知高度在200至400之间。这时我们可以直接读取图片后获取指定的行列得到该区域图片。

import cv2img = cv2.imread(r'C:\Users\Administrator\Desktop\1.jpg')#读取
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)#创建一个窗口
cv2.imshow("Image", img)#显示图像roi=img[200:400,200:400]
cv2.imshow("roi", roi)#显示图像cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy

以上代码读取图片后,通过选取图片区域进行ROI选择。img[200:400,200:400]代码中,第一个200:400指的是200指400行,第二个200:400指的是200至400列。通过两个选取的行与列的交叉区域则是所选择的ROI区域。图示如下,红色框框表示列,紫色框框表示行,其中重叠区域则是ROI选择区域。

以上代码在运行结果如下:

从结果中,我们可以知道,该值的列选择还应该往右边移动一部分,由于我们是200指400这个区域,那么我们现在应该移动的访问从图片上看,应该是接近300指500。修改代码。

roi=img[200:400,280:450]

运行后最后得到如下结果:

我们得到ROI内容后,可以对该部分的内容进行编辑,例如转为灰度图像:

gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray_roi", gray_roi)#显示图像

结果如下:

也可以将转换后的图片与原图进行结合,只需要将转换后的图片值对原图该区域的值进行替换即可,完整代码如下:

import cv2img = cv2.imread(r'C:\Users\Administrator\Desktop\1.jpg')#读取
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)#创建一个窗口
cv2.imshow("Image", img)#显示图像roi=img[200:400,280:450]
cv2.imshow("roi", roi)#显示图像gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray_roi", gray_roi)#显示图像gray_roi_rgb = cv2.cvtColor(gray_roi, cv2.COLOR_GRAY2BGR)#灰度图像转RGB
img[200:400,280:450]=gray_roi_rgb
cv2.imshow("Image2", img)#显示图像cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy

在以上代码中需要注意的是,灰度图像必须转为RGB图形才能对原图进行赋值。以上代码中灰度转RGB图像的代码为:

gray_roi_rgb = cv2.cvtColor(gray_roi, cv2.COLOR_GRAY2BGR)

最终运行结果如下:

2.2 泛洪填充及floodFill使用方法

泛洪填充指指定起始点,通过该像素点所链接的周围像素点在所指定的颜色值范围内进行颜色填充。该操作需要一个遮罩或者说掩膜进行运算处理。

首先我们依旧开始读取一张图像:

import cv2
import numpy as npimg = cv2.imread(r"C:\Users\Administrator\Desktop\1.jpg")
cv2.imshow("img", img)

接着通过copy方法可以快速复制一张图片:

copyimg = image.copy()

由于我们需要建立一个遮罩,这个遮罩跟原图片大小一致,所以代码可以写成如下:

h, w = copyimg.shape[:2]
mask = np.zeros([h + 2, w + 2], np.uint8)

以上代码通过shape获取了原图片的高宽,接着通过zeros创建一个与原图大小一致的纯黑图片。那为什么要加2呢?因为接下来我们需要对图片进行颜色填充,官方的规定要+2,具体什么原因我本人没有进行深究,按照官方要求来就可以了。

那问题来了,遮罩是什么?还记得我们在逻辑运算应用那一个小节中,通过色彩提取后,可以得到目标对象的颜色范围,这个颜色范围是一张黑白图片,白色为选取的区域,黑色为不选取的区域,这时我们通过将提取出来的图片作为遮罩对图片进行bitwise_and运算,这时就可以还原出原本色彩,抠选出原图中的图像内容。其实遮罩的作用就是如此,我们通过zeros创建一张纯黑图片后,使用floodFill函数对指定目标进行填充;在填充之前,将进行一定的计算。由于floodFill函数将会选取出目标点,该目标点将作用在这张纯黑色的遮罩图片中,该纯黑图片将会对计算后选取的点进行指的变换,该区域就会变成白色,最终得到颜色填充的区域,进行填充。

我们首先看一下floodFill函数,floodFill函数接收7个参数,函数原型如下:

floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
  • image为传入的图像参数
  • mask为遮罩
  • seedPoint为选中的颜色填充的起始点
  • newVal填充的颜色像素值
  • loDiff选中起始点的颜色像素值的最低范围,例如是红色,那么红色减去该值后得到最低的取值范围
  • upDiff选中起始点的颜色像素值的最高范围,例如是红色,那么红色加该值后得到最高的取值范围
  • flags为CV_FLOODFILL_FIXED_RANGE或者CV_FLOODFILL_MASK_ONLY
    ,两者填充方式不一样,当前示例将讲解CV_FLOODFILL_FIXED_RANGE。若选择CV_FLOODFILL_FIXED_RANGE,则会比较像素点与其实像素点,若在颜色值的范围内,则进行填充。
    此时我们调用floodFill方法,传入图片,遮罩,起始点,填充的颜色值,最低值,最高值与填充模式。
cv2.floodFill(copyimg, mask, (220,420), (0, 255, 255), (5, 5, 5), (5, 5 ,5), cv2.FLOODFILL_FIXED_RANGE)

copyimg为图片;mask为遮罩;220,420为起始点;0, 255, 255为填充的颜色,为黄色;5, 5, 5为选中的起始点减去该颜色值,判断周围的颜色是否低于该值;5, 5 ,5为选中的起始点加上该颜色值,判断周围的颜色是否高于该值。最终的完整代码如下:
img = cv2.imread(r"C:\Users\Administrator\Desktop\1.jpg")
cv2.imshow(“img”, img)

在复制图像上进行操作

import cv2
import numpy as npimg = cv2.imread(r"C:\Users\Administrator\Desktop\1.jpg")
cv2.imshow("img", img)
copyimg = img.copy()
h, w = copyimg.shape[:2]
mask = np.zeros([h + 2, w + 2], np.uint8)
cv2.floodFill(copyimg, mask, (220,420), (0, 255, 255), (5, 5, 5), (5, 5 ,5), cv2.FLOODFILL_FIXED_RANGE)
cv2.imshow("fill_color", copyimg)cv2.waitKey (0)#等待关闭
cv2.destroyAllWindows()#destroy

运行结果如下:

我们现在可以证明220,420是否是起始点,我们可以换一个值,例如0,0。若在左上角进行颜色填充那么则判断正确:

我们也可以改变填充值的选择范围,将2个5,5,5改为50,50,50,可以明显看到效果:

cv2.floodFill(copyimg, mask, (0,0), (0, 255, 255), (50,50, 50), (50, 50 ,50), cv2.FLOODFILL_FIXED_RANGE)

这时候的相关所链接的颜色范围扩大,那么所能填充的范围也肯定是扩大,运行结果如下:

其中颜色值可以可以进行修改,修改方法不再赘述。
该系列文章首发于ebaina

三、总结

  1. 了解了ROI是感兴趣的选择范围
  2. 了解了ROI可以通过图片内容进行选择,并且可以与原图进行结合
  3. 了解了泛洪填充的方法
  4. 初步了解了mask遮罩以及floodFill函数的使用方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决冲突

人生不如意之事十之八九,合并分支往往也不是一帆风顺的。 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new branch feature1修改readme.txt最后一行,改为: Creating a new …

HQL入门学习

2019独角兽企业重金招聘Python工程师标准>>> package myHibernate; /** 测试简单的HQL语句* 2010年4月9日 23:36:54* */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.uti…

Oracle精简客户端配置

2019独角兽企业重金招聘Python工程师标准>>> 由于Oracle client体积很大。而且安装后,基本上就用2个功能:TNS配置服务名和SQL*Plus。下面是一种小巧、快捷的Oracle客户端配置方法: 1.下载Instant Client 下载地址: htt…

WinUI迁移到.NET MAUI个人体验

迁移的初衷本人平时是做.net相关的工作,对于.net技术栈也有一些了解,自从新的.net能够跨平台之后,之前也有跨平台的ui框架Xamarin,现在微软推出了.NET MAUI这个说是 统一了开发体验,而且都RC版本了,所以本人…

祝CSDN2021牛气冲天祝我也拨云散雾

前言 2020年4月,我写了一篇用turtle绘制《小清新风格的树》,反响挺好。现在打算使用turtle修改一下绘制方式,因为线条的绘制太过考虑因素过多,如果使用方块进行堆叠,绘制出来的形状可以如马赛克一样,既符合…

FPGA图案--数字表示(代码+波形)

在数字逻辑系统,仅仅存在高低。所以用它只代表一个整数数字。并且有3代表性的种类。这是:原码表示(符号加绝对值值)、反码表示(加-minus标志)而补码(符号加补)。这三个在FPGA中都有着广泛的应用。以下分别讨论。1、原码表示法 原码表示法是机器数的一种简…

WPF效果第一百八十四篇之网页视频保存

一年一度的小学入学采集开始了;我一朋友很是头大,他说头都大了好几圈了;既要准备各种入学材料又要听线上专人视频直播讲解;然而在直播结束后,他发现自己仍是一脸疑惑;虽说直播有回访吧,但是他那蜗牛网速简直了;这时他场外找我,让我看能不能给他自己下载一份;1、毕竟第一次,直接…

【遥感数字图像处理】基础知识:第一章 绪论

第一章 绪 论 ◆ 课程学习要求 主要教学内容:遥感数字图像处理的概念和基础知识,遥感数字图像的几何处理,遥感图像的辐射校正,遥感数字图像的增强处理,遥感图像的计算机分类,遥感数字图像的分析方法&…

自定义Git

在安装Git一节中,我们已经配置了user.name和user.email,实际上,Git还有很多可配置项。 比如,让Git显示颜色,会让命令输出看起来更醒目: $ git config --global color.ui true这样,Git会适当地显…

[python opencv 计算机视觉零基础到实战] 九、模糊

一、学习目标 了解什么是卷积了解模糊的使用方法与应用 如有错误欢迎指出~ 二、了解模糊的应用 上一篇:[python opencv 计算机视觉零基础到实战] 八、ROI泛洪填充 2.1 了解卷积是什么 在本节中,卷积我们不过多的进行深入讲解,我本人对卷积也只是稍…

windbg的时间旅行实现对 C# 程序的终极调试!

一:什么是时间旅行 简而言之就是把程序的执行流拍成vlog,这样就可以对 vlog 快进或者倒退,还可以分享给别人做进一步的分析,是不是想都不敢想。很开心的是 windbg preview 版本中已经实现了,叫做 时间旅行调试 TTD&…

【神经网络】神经网络结构在命名实体识别(NER)中的应用

命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图。它是NLP领域中一些复杂任务(例如关系抽取,信息检索等)的基础。…

[python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃

一、学习目标 了解高斯模糊的使用方法了解毛玻璃的图片效果添加了解如何自己做一个噪声图片 上一篇:[python opencv 计算机视觉零基础到实战] 九、模糊 如有错误欢迎指出~ 二、了解模糊与美颜 2.1 使用高斯模糊降噪 由于很多小伙伴反应抛开原理或理论讲解使用用法对于初学…

Android之自定义View实现带4圆角或者2圆角的效果

1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行。 2) 实现view上2圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行。 安卓源码里面有这样的类 package and…

java trim()函数_Java - split()函数和trim()函数的使用方法

split()函数和trim()函数的使用方法本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141详细參考Java API: http://docs.oracle.com/javase/6/docs/api/java/lang/String.htmlsplit()函数是依据參数如",", "-", " "等, 切割…

分布式服务器集群架构方案思考

0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。 集群主要分为:高可用集群(High Availability Cluster),负载均衡集群(Load Balance Cluster&…

交互式 .Net 容器版

1背景介绍 在之前的文章 - 交互式 .Net 中已经介绍了什么是 交互式 .Net,文中是通过 Visual Studio Code 插件的方式实现 交互式 .Net 的。现在,我们将使用容器的方式实现 交互式 .Net。2镜像构建 1. DockerfileFROM mcr.microsoft.com/dotn…

Java 集合练习——3

创建Map集合,创建Emp对象,并将创建的Emp对象添加到集合中,并将id为005的对象从集合中移除 创建Emp类: package jihe;public class Emp {private String id;public String getId() {return id;}public void setId(String id) {this…