本文共 3336 字,大约阅读时间需要 11 分钟。
本文浅讲ROI,泛洪填充,细讲泛洪填充基于代码的实际表现。 重点为方法以及代码参数原理。
这里主要介绍以及说明ROI
ROI是什么,在讲解这一节时,要清楚ROI是什么,即使知道它对我们目前的学习帮助可能并不大,但是这些小知识积累起来,也可以达到质变。
ROI:可以称之为 感兴趣区域。在机器学习,计算机视觉,图像处理中,我们常常以各种方式勾勒出需要处理的区域,我们将其称之为ROI,感兴趣区域,一般我们再处理图像时,往往先找到ROI。 如下,比如我们要处理这张图中女孩的衣裳,变颜色之类,我们就需要勾勒出这个女孩衣服的区域。ROI属于智能视频编码技术的一种,浅显的说,在有些画面中,某部分图像是不需要太大的关注的,比如监控录像中的天空等等,而ROi技术可以牺牲掉这些非关注区域的图像质量,对需要处理的图像区域进行高质量的编码。
泛洪填充又称为洪水填充算法,该算法常常用于绘图软件中,例如
绘图中的油漆状功能。它大致实现的功能是从一个像素点开始,对于邻近的像素点开始填充为新的颜色,直到整个封闭区域完全被填充为止。最常见的有,四域像素填充与八域像素填充,根据填充方式又可以分为递归和非递归。泛洪填充在OpenCV中的方法是本篇文章的重点,也是OpenCV该节课的重点。
我们直接来看代码:
先从简单的填充来看,首先我们加载一张示例图import cv2 as cvimport numpy as np#记载一张示例图def load_test_image(): #构建一张400*400三通道的纯黑图 image=np.zeros([400,400,3],np.uint8) #在黑图中添加一片白图区 这里实验,尽量规则 image[100:300,100:300,:]=255 cv.imshow('test',image) return image
可以看看示例图:
接下来我们要做的事情就是对该白色区域进行填充。使用OpenCV中的API
import cv2 as cvimport numpy as np#记载一张示例图def load_test_image(): #构建一张400*400三通道的纯黑图 image=np.zeros([400,400,3],np.uint8) #在黑图中添加一片白图区 这里实验,尽量规则 image[100:300,100:300,:]=255 return imagedef load_test_mask(): #构建一张400*400三通道的纯黑图 image=np.ones([402,402],np.uint8) #在黑图中添加一片白图区 这里实验,尽量规则 image[101:301,101:301]=0 return imagedef fill_image_1(): image=load_test_image() cv.imshow('test',image) #设置掩膜 掩膜的知识上一篇博客细讲过吗,这里不在阐述 mask=load_test_mask() cv.imshow('mask',mask) cv.floodFill(image,mask,(200,200),(0,0,255),cv.FLOODFILL_MASK_ONLY) cv.imshow('fill',image) fill_image_1()cv.waitKey(0)cv.destroyAllWindows()
结果如下:
接下来我们对主要代码进行分析。 首先,第一个,在构建掩膜mask时为什么要加2,我目前没有找到很合理的官方解释,我是这样分析的,假设我们从(0,0)处开始泛洪,那么加上这两个2能保证邻近的边界元素可以处理到,目前我没法从数学什么的角度去解释,只能说它可能是更加趋近与一个经验化的东西,大家只需要记住即可。。。。 第二个 该方法也就是博主所说的重点,至少它的参数,我们要做到掌握的很好。我们先从第一部分代码的角度说参数。 这里可以很明显看到填入了四个参数
- image:需要填充的原图
- mask:掩膜区域
- (200,200) 它是一个开始的像素点,即泛洪填充开始要考虑的像素点,这个参数要留到最后一个参数那里。
- (0,0,255)对应了RBG色彩空间中的,红色。
- cv.FLOODFILL_MASK_ONLY这个参数表明,该泛洪填充只与mask包含的区域内进行。同时它与之前的(200,200)相呼应,构成整个方法的含义:对于这张图像,从像素点(200,200)开始,填充为红色,直到填充完mask所包含的区域。
最后一个参数,不只包含那一个,我们可以理解为泛洪填充的操作方式,接下里我们看第二个参数
代码: 加载一张彩色图import cv2 as cvimport numpy as npdef load_color_image(): image=cv.imread('test.jpg') cv.imshow('test',image) return image #load_color_image() cv.waitKey(0)cv.destroyAllWindows()
如图:
进行彩图的填充
import cv2 as cvimport numpy as npdef load_color_image(): image=cv.imread('test.jpg') return imagedef load_mask(h,w): mask=np.zeros([h+2,w+2],np.uint8) return maskdef file_color_pictue(): image=load_color_image() #获取宽和高 h,w=image.shape[:2] #获取mask mask=load_mask(h,w) #填充 为红色 cv.floodFill(image,mask,(30,30),(0,0,225),(255,255,255),(50,50,50),cv.FLOODFILL_FIXED_RANGE) cv.imshow('mask',image) file_color_pictue()cv.waitKey(0)cv.destroyAllWindows()
结果如下:
掩膜设置为全图,因此不用在考虑了,现在我们主要是来看一下该FLOODFILL_FIXED_RANGE下填充方法的功能。今天的博客,感觉主要是讲了这一个方法,因为该方法很重要,同时网上有些资源又讲的很抽象,要么就是过于细节可能对有些新人不友好,因此我只挑了有用的很大一部分,容易上手且很容易理解😂很快就能用到,可以结合博主之前动态提取的博客,完成一些有意思的东西,这里就不展示了,有兴趣的小伙伴可以自己尝试。
转载地址:http://ckcki.baihongyu.com/