距离上一次更新隔了好多天,具体原因是一直在调试骨架识别的程序,但是最终还是没有弄明白。于是乎,今天开始继续学习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]之间
第七个参数:标志位,具体可以参考官方文档的解释