作者:小郭学数据
源自:快学python
学习视频可参见python+opencv3.3视频教学 基础入门[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)
简而言之,就是把你想要填充的区域填充成你想要的颜色
floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
测试用例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)
结果如下:
测试用例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)
[1]
python+opencv3.3视频教学 基础入门: https://www.bilibili.com/video/BV1QW411F7e7?p=1
[2]
OpenCv漫水填充floodFill详解: https://blog.csdn.net/weixin_42296411/article/details/80966724?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param