Opencv学习笔记05 -- 泛洪填充

距离上一次更新隔了好多天,具体原因是一直在调试骨架识别的程序,但是最终还是没有弄明白。于是乎,今天开始继续学习Opencv。

开始

这次的学习笔记主要讲的是泛洪填充,具体什么是泛洪填充,我认为可以理解为绘图工具中的油漆桶功能。

下面代码演示+讲解

#惯例调入包,这次会额外调入numpy包
import  cv2
import  numpy as np

#惯例读图片+改尺寸
p = cv2.imread('test.jpg',1)
p = cv2.resize(p,(400,266))
cv2.imshow('flower',p)

#用python切片技术将图片的高和宽读取出来
height,width = p.shape[:2]
#设置掩码层,这一步会在接下来说明
mask = np.zeros([height+2,width+2],np.uint8)
mask [55:43 , 139:102] = 1
#核心函数,具体会在下文讲解
cv2.floodFill(p,mask,(0,100),(0,255,255),(20,20,20),(20,20,20),cv2.FLOODFILL_FIXED_RANGE)
#展示效果
cv2.imshow('flood',p)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:
在这里插入图片描述效果图:
在这里插入图片描述下面我将一句一句来记录一下代码的意思

mask = np.zeros([height+2,width+2],np.uint8)
mask [55:43 , 139:102] = 1

掩码层可以理解为从原图中取一块区域来进行研究

mask = np.zeros([height+2,width+2],np.uint8)

这一步需要注意的是如果你要对全局进行操作,那么mask在取范围时应该取 [height(图高) + 2 , width(图宽) + 2]。 具体为什么是 + 2 而非其他数字,我不太懂,因为我也是通过看教程才明白的 。 其次这一步中 np.zeros()是numpy自带函数。 np.uint8 指的是将全图格式变为uint8

mask [55:43 , 139:102] = 1

这一句指的是排除非操作区,在进行泛洪填充时,机器只会对图片中初始置0的位置进行泛洪填充操作。而我将 [55:43 , 139:102] = 1 是为了防止对此区域进行泛洪填充,也就是最大的黄花并没有被填充,这个区域被保护了起来

cv2.floodFill(p,mask,(0,100),(0,255,255),(20,20,20),(20,20,20),cv2.FLOODFILL_FIXED_RANGE)

接下来记录一下这个核心代码的意思,这个函数一共有7个参数
第一个参数 :要操作的图片
第二个参数:掩码层,即要操作的图片部分
第三个参数:图片要操作的开始点(宽,高),原点是图片的左上角。这里推荐大家使用电脑自带的绘图功能,window10的画图功能可以自动测得各个像素点的位置。

如:
在这里插入图片描述可以清晰的得到图片的尺寸和选取像素点的位置

第四个参数:填充的颜色,这里我选择黄色BGR(0,255,255)

第五个参数:颜色低值
第六个参数:颜色高值

第五第六参数应该放在一起考虑
他的功能是以起始点的颜色矩阵为参考,泛洪填充颜色的范围为 [起始点BGR] - [颜色低值BGR] ~ [起始点BGR] + [颜色高值BGR]

如例子中,泛洪填充对较绿色的区域进行了填充,这是因为我起始点选择的绿色,波动范围也比较小

但是最终的结果值一定在[0,0,0] ~ [255,255,255]之间

第七个参数:标志位,具体可以参考官方文档的解释

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章