博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV自学:ROI与泛洪填充
阅读量:3968 次
发布时间:2019-05-24

本文共 3336 字,大约阅读时间需要 11 分钟。

本文浅讲ROI,泛洪填充,细讲泛洪填充基于代码的实际表现。

重点为方法以及代码参数原理。


文章目录

ROI

这里主要介绍以及说明ROI


1. 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能保证邻近的边界元素可以处理到,目前我没法从数学什么的角度去解释,只能说它可能是更加趋近与一个经验化的东西,大家只需要记住即可。。。。
第二个
在这里插入图片描述
该方法也就是博主所说的重点,至少它的参数,我们要做到掌握的很好。我们先从第一部分代码的角度说参数。
这里可以很明显看到填入了四个参数

  1. image:需要填充的原图
  2. mask:掩膜区域
  3. (200,200) 它是一个开始的像素点,即泛洪填充开始要考虑的像素点,这个参数要留到最后一个参数那里。
  4. (0,0,255)对应了RBG色彩空间中的,红色。
  5. 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下填充方法的功能。
在这里插入图片描述

  • 首先,image,mask的功能与之前相同。
  • (30,30)为选定的像素点:该像素点的作用为亮度的对比,及在泛洪填充时,考虑该像素点的亮度,假设像素点亮度为x,并设置一个基于该像素点亮度的范围,假设为up和down,则图片填充,在mask下亮度范围为(x-down,x+up)区间内的像素点。
  • (0,0,255)表示要填充的色彩空间对应的颜色。
  • (255,255,255)就是上面所说的那个down即要减去的亮度范围,注意该减法是在RBG色彩空间中的减法因此用了三元组,对于RBG色彩空间不熟悉的朋友可以去看完之后应该没啥问题。
  • (50,50,50)便是它的up了,三个数值决定了在mask中要填充的空间。
  • cv.FLOODFILL_FIXED_RANGE该参数在使用该方法时不可忽略否则会直接设置为默认值,导致出现差错。

总结

今天的博客,感觉主要是讲了这一个方法,因为该方法很重要,同时网上有些资源又讲的很抽象,要么就是过于细节可能对有些新人不友好,因此我只挑了有用的很大一部分,容易上手且很容易理解😂很快就能用到,可以结合博主之前动态提取的博客,完成一些有意思的东西,这里就不展示了,有兴趣的小伙伴可以自己尝试。

转载地址:http://ckcki.baihongyu.com/

你可能感兴趣的文章
linux工作队列(转)
查看>>
工作队列的初始化(INIT_WORK的参…
查看>>
sysfs and /proc/bus/usb/device
查看>>
linux工作队列(转)
查看>>
跟我一起写udev规则(译)
查看>>
sysfs and /proc/bus/usb/device
查看>>
跟我一起写udev规则(译)
查看>>
USB和sysfs文件系统
查看>>
USB和sysfs文件系统
查看>>
udev(八):实战:使用udevadm修…
查看>>
android开发环境搭建(for 驱动开发…
查看>>
android开发环境搭建(for 驱动开发…
查看>>
android驱动例子(LED灯控制)
查看>>
为Android内核添加新驱动,并添加…
查看>>
Android编译环境(1) - 编译Native …
查看>>
2011年07月14日
查看>>
android内核源代码获取方法
查看>>
Linux 2.6.36以后file_operations…
查看>>
Linux 2.6.36以后file_operations…
查看>>
怎样写linux下的USB设备驱动程序
查看>>