[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,一经查实,立即删除!

相关文章

【经典回放】JavaScript学习详细干货笔记之(二)

【经典回放】JavaScript学习详细干货笔记之(一) 【经典回放】JavaScript学习详细干货笔记之(二) 【经典回放】JavaScript学习详细干货笔记之(三) 一、JavaScript 数组 JavaScript数组的定义、使用都是非常简单的,从a17.htm就可以知道,仅仅定义的话,就使用: var …

java string类api_java基础—String类型常用api

1、字符串比较equalsequalsIgnoreCase 忽略大小写做比较2、字符串拆分(切片)splitString a "lemon:python:Java";//split切片之后的结果是一个一维字符串类型数组String[] arr a.split(":");for(int i 0 ;i System.out.println(arr[i]);}3、字符串截取…

解决冲突

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

Android之java.lang.OutOfMemoryError: Failed to allocate a ** byte allocation with **free bytes and 2M

1 问题 glide加载图片出现oom java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM 2 解决办法 1) 简单粗暴点的在AndroidManifest.xml添加如下,增大安卓虚拟机内存 android:largeHeap"…

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…

【经典回放】JavaScript学习详细干货笔记之(三)

【经典回放】JavaScript学习详细干货笔记之(一) 【经典回放】JavaScript学习详细干货笔记之(二) 【经典回放】JavaScript学习详细干货笔记之(三) 一、再次从var开始说起 var到底是什么? 在前面的所有介绍中, JavaScript的var变量说明、是非常令人迷惑的事情。 var中…

WinUI迁移到.NET MAUI个人体验

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

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

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

Android之Only fullscreen opaque activities can request orientation

1 问题 使用透明的activity主题,并且固定了方向,在Android8.0手机上提示错误如下 Only fullscreen opaque activities can request orientation 2 解决办法 简单粗暴就是去在AndroidManifest.xml文件去掉当前activity配置的里面的横竖屏方向设置 and…

wamp5.5.12安装re dis扩展

转载地址:http://hanqunfeng.iteye.com/blog/1984387 phpredis是个人觉得最好的一个php-redis客户端,因为其提供的function与redis的命令基本一致,降低的了学习成本,同时功能也很全面。 一。linux安装方法 phpredis下载地址&#…

java 数组转bean_json数组转java对象怎么转

展开全部首先需要 commons-beanutils jar包,然后转bean的方法为:62616964757a686964616fe59b9ee7ad9431333363386133/**** Title: transMap2Bean* param:param map* param:param obj* return:void* Description&#x…

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

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

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

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

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

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

Android之Canvas的drawRoundRect()

1 问题 Canvas的drawRoundRect()函数怎么用 public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) 功能:该方法用于在画布上绘制圆角矩形,通过指定RectF对象以及圆角半径来实现。float rx:生成圆角的椭圆的X轴半径 float ry:生成圆角的椭圆的Y轴半径…

201671010128 2017-10-08《Java程序设计》之Lambda与内部类

一、基本概念 Java Lambda 表达式是 Java 8 引入的一个新的功能,主要用途是提供一个函数化的语法来简化编码。Lambda表达式本质上是一个匿名方法。Java Lambda 表达式以函数式接口为应用基。内部类(inner class)是定义在另一个类内部的类。二、几点注意 使用内部类的…

自定义Git

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

java抽象方法实例_Java的抽象方法和抽象类实例详解

本文实例讲述了Java的抽象方法和抽象类。分享给大家供大家参考,具体如下:一 点睛抽象方法是只有方法签名,没有方法实现的方法。抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义为抽象类,抽象类…

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

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