一、ROI

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。

代码如下:

#进行图片截取、合并、填充
import cv2 as cv
src=cv.imread('E:\imageload\lena.jpg')
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)
face = src[200:300, 200:400] #选择200:300行、200:400列区域作为截取对象
gray = cv.cvtColor(face, cv.COLOR_RGB2GRAY) #生成的的灰度图是单通道图像
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) #将单通道图像转换为三通道RGB灰度图,因为只有三通道的backface才可以赋给三通道的src
src[200:300, 200:400] = backface
cv.imshow("face", src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:COLOR_RGB2GRAY是把三通道RGB对象转换为单通道灰度对象

二、泛洪填充(彩色图像填充)

代码如下:

#泛洪填充(彩色图像填充)
import cv2 as cv
import numpy as np
def fill_color_demo(image):
copyImg = image.copy()
h, w = image.shape[:2]
mask = np.zeros([h+2, w+2],np.uint8) #mask必须行和列都加2,且必须为uint8单通道阵列
#为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理
cv.floodFill(copyImg, mask, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color_demo", copyImg) src = cv.imread('E:/imageload/baboon.jpg')
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.opencv里的mask都是为uin8类型的单通道阵列

2.泛洪填充算法也叫漫水填充算法。opencv的floodFill函数原型: floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) -> retval, image, mask, rect

  image参数表示输入/输出1或3通道,8位或浮点图像。

  mask参数表示掩码,该掩码是单通道8位图像,比image的高度多2个像素,宽度多2个像素。填充时不能穿过输入掩码中的非零像素。

  seedPoint参数表示泛洪算法(漫水填充算法)的起始点。

  newVal参数表示在重绘区域像素的新值。

  loDiff参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之负差的最大值。

  upDiff参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之正差的最大值。

  flags参数:操作标志符,包含三部分:(参考https://www.cnblogs.com/little-monkey/p/7598529.html

    低八位(0~7位):用于控制算法的连通性,可取4(默认)或8。

    中间八位(8~15位):用于指定掩码图像的值,但是如果中间八位为0则掩码用1来填充。

    高八位(16~32位):可以为0或者如下两种标志符的组合:

    FLOODFILL_FIXED_RANGE:表示此标志会考虑当前像素与种子像素之间的差,否则就考虑当前像素与相邻像素的差。FLOODFILL_MASK_ONLY:表示函数不会去填充改变原始图像,而是去填充掩码图像mask,mask指定的位置为零时才填充,不为零不填充。  

3.个人理解:参数3起始点的像素值减去参数5的像素值表示的是从起始点开始搜索周边范围的像素最低值,参数3起始点的像素值加上参数5的像素值表示的是从起始点开始搜索周边范围的像素最大值。有了这个范围,然后该函数就可以在这个连续像素范围内填充指定的颜色newVal参数值。

4.设置FLOODFILL_FIXED_RANGE – 改变图像,泛洪填充

设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数

三、泛洪填充(二值图像填充)

代码如下:

#泛洪填充(二值图像填充)
import cv2 as cv
import numpy as np
def fill_binary():
image = np.zeros([400, 400, 3], np.uint8)
image[100:300, 100:300] = 255
cv.imshow("fill_binary", image)
mask = np.ones([402, 402], np.uint8) #mask要保证比原图像高和宽都多2
mask[101:301, 101:301] = 0
cv.floodFill(image, mask, (200,200), (255 , 0, 0), cv.FLOODFILL_MASK_ONLY) #mask不为0的区域不会被填充,mask为0的区域才会被填充
cv.imshow("filled_binary", image)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

注意:

1.个人认为,不管是FLOODFILL_FIXED_RANGE还是FLOODFILL_MASK_ONLY操作,泛洪填充都不会填充掩膜mask的非零像素区域

2. mask[101:301, 101:301] = 0 这条语句为什么是101:301而不是100:300呢?我觉得应该是掩膜mask是比原图像左右上下都多了1,所以掩膜mask左右一共比原图像多2,上下也比原图像多2。那么原图像的100就自然对应到掩膜的101,同样原图像的300就自然对应到掩膜的301。

3.当FLOODFILL_MASK_ONLY设置了的时候,原图不会改变,只会用中间八位的值填冲mask。 floodFill的flags参数的中间八位的值就是用于指定填充掩码图像的值的,但是如果flags中间八位的值为0,则掩码会用1来填充。

Python+OpenCV图像处理(六)—— ROI与泛洪填充的更多相关文章

  1. Python+OpenCV图像处理(一)

    Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...

  2. Python+OpenCV图像处理(一)——读取显示一张图片

    先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...

  3. 5、OpenCV Python ROI和泛洪填充

    __author__ = "WSX" import cv2 as cv import numpy as np #泛洪填充 从一个点开始 ,填充周围和他相似的点,直到遇到一个边界 # ...

  4. opencv python:ROI 与 泛洪填充

    提取ROI区域,处理然后放回去: 泛洪填充 测试代码:显示一张图像,鼠标点击之后,会从该点开始进行填充,显示填充后的结果图像 注:二值图像的填充需要使用选项:cv2.FLOODFILL_MASK_ON ...

  5. Python+OpenCV图像处理(十六)—— 轮廓发现

    简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def c ...

  6. Python+OpenCV图像处理(九)—— 模板匹配

    百度百科:模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题.它是图像处理中最基本.最常用的匹配方法.模板匹配具有自身的局限性, ...

  7. Python+OpenCV图像处理(十四)—— 直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

  8. Python+OpenCV图像处理(十一)—— 图像金字塔

    简介:图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构.简单来说,图像金字塔就是用来进行图像缩放的. 进行图像缩放可以用图像金字塔,也可以使用 ...

  9. Python+OpenCV图像处理(八)—— 图像直方图

    直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...

随机推荐

  1. what's the 回撤

    什么是“回撤”? “回撤”是个谓语,前面隐含了一个主语.一般来说,没有人说“亏损回撤”的,我们说的“回撤”,通常指“股价回撤”.“市值回撤”.“净值回撤”和“盈利回撤”. “股价回撤”是针对个股的,即 ...

  2. docker的容器和镜像的差别

  3. python 调用阿里云服务器api创建服务器

    首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-ecs 可以配合jenkins传递参数 #!/u ...

  4. zip()

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以 ...

  5. cocos2dx 3.x版本搭建Mac环境工程(创建一个新的C++工程)百分百可行

    首先第一篇,想学cocos2dx第一步就是搭建环境,第一步搭建不了环境,创建不了工程那一切都是扯淡. 说到mac下安装cocos2d-x想到的模式就是xcode+cocos2d-x.因为我本身就是一个 ...

  6. dubbo.provider和dubbo.consumer配置

    Configure service provider <?xml version="1.0" encoding="UTF-8"?> <bean ...

  7. Linux之HugePages快速配置

    关于Linux系统的HugePages与Oracle数据库优化,可以参考熊爷之前的文章,相关概念介绍的非常清晰: Linux大内存页Oracle数据库优化 本文旨在Linux系统上快速配置HugePa ...

  8. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  9. Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1

    Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...

  10. 21Oracle数据库和实例

    Oracle数据库:相关的操作系统文件(即储存在计算机硬盘上的文件)的集合,这些文件组织在一起,成为一个逻辑整体,即为Oracle数据库.物理存在 Oracle实例:位于物理内存里的数据结构,它由操作 ...