学习视频可参见python+opencv3.3视频教学 基础入门
ROI与泛洪填充
1.ROI
-
ROI(region of interest),感兴趣区域
-
对lena图进行脸部的获取,代码如下
-
def roi_test(src): #第一个参数,高度范围,第二个参数宽度范围 face = src[200:410, 200:400] gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY) # face彩色图片变成灰度图片 cv.imshow("gray", gray) back_face = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) #转化后的灰度图是单通道的,所以要转乘三通道进行合并 cv.imshow("back_face", back_face) src[200:410, 200:400] = back_face cv.imshow("face", src)
-
注意转化转化后的灰度图是单通道的,所以要转成三通道进行合并
-
结果如下
-
(210, 200) (210, 200, 3)
-
-
2.泛洪填充
-
简而言之,就是把你想要填充的区域填充成你想要的颜色
-
floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
-
Iimage:输入图像,可以是一通道或者是三通道。
-
seedPoint:泛洪填充的种子点,即起始点。
-
newVal:被填充的像素点新的像素值
-
loDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最大值。
-
upDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最小值。
-
CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)
关于floodFill函数的详细内容可参见OpenCv漫水填充floodFill详解
-
-
测试用例1,彩色图像
-
def fill_color_demo(image): copyImg = image.copy() h, w = image.shape[:2] #获得高,宽 print(copyImg) mask = np.zeros([h+2, w+2], np.uint8) #+2 个人感觉就是一个padding # 参数:原图,mask图,起始点,重绘像素区域的新的填充值(颜色),起始点值减去该值作为最低值,起始点值加上该值作为最高值,彩色图模式 #如若像素点在最低值和最高值发范围内则进行填充新设置的颜色 cv.floodFill(copyImg, mask, (100, 100), (0, 255, 255), (100,100,100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE) print(copyImg) cv.imshow("fill_color_demo", copyImg)
- mask必须是单通道,且必须h+2,w+2
-
结果如下:
-
-
测试用例2,二值图像
-
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, 1], np.uint8) #单通道,h+2,w+2,就是padding=1 mask[101:301, 101:301] = 0 #填充区域,对应原图白色位置 cv.floodFill(image, mask, (200, 200), (0, 2, 255), cv.FLOODFILL_MASK_ONLY) cv.imshow("filled binary", image)
结语
以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。欢迎大家关注我的公众号小郭学数据。