- A+
ROI与泛洪填充
ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。
泛洪填充算法也叫漫水填充算法。就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。Windows画图工具中的油漆桶功能和Photoshop的魔术棒选择功能,都是FloodFill漫水填充的改进和延伸。
原理:从一个点开始遍历附近像素点,填充成新的颜色,知道封闭区域内所有像素点都被填充成新颜色为止。
常见实现方法:4邻域像素填充法、8邻域像素填充法、基于扫描线的像素填充法等。
代码
- import cv2 as cv
- import numpy as np
- def fill_color_demo(image):
- copyimg = image.copycopy()
- h, w = image.shape[:2]
- mask = np.zeros([h+2, w+2], np.uint8)
- cv.floodFill(copyimg, mask, (30, 30)
- , (0, 255, 255)
- , (100, 100, 100)
- , (50, 50, 50)
- , cv.FLOODFILL_FIXED_RANGE)
- cv.imshow("fill_color_demo", copyimg)
- def fill_binary(): # 填充二值图像
- image = np.zeros([400, 400, 3], np.uint8) # 直接生成一个3通道全为0的图像
- image[100:300, 100:300, :] = 255 # 把其中一部分值全改成255
- cv.imshow("fill_binary1", image) # 显示该图
- mask = np.ones([402, 402, 1], np.uint8) # 必须是400+2,选中以外的位置初始化为1,必须使用np.uint8类型
- mask[101:301, 101:301] = 0 # 填充位置mask初始化为0
- cv.floodFill(image, mask, (200, 200), (0, 0, 255),
- cv.FLOODFILL_MASK_ONLY)
- # 设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数
- cv.imshow("fill_binary2", image) # 显示该图
- print("start")
- src = cv.imread("C:/Users/Admin/Desktop/1.jpg") # 读取图像
- cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) # 创建显示图像的窗口
- cv.imshow("input image", src) # 显示图片到特定的窗口中
- print(src.shape)
- roi = src[50:250, 100:300, 0:3]
- print(roi.shape)
- cv.imshow("roi", roi)
- fill_color_demo(src)
- fill_binary()
- cv.waitKey(0) # 等待用户操作,0为一直等待,5000为等待用户操作5s
- cv.destroyAllWindows() # 释放所有内存
讲解
从print("start")开始,读取原始图像,并显示
选择50:250, 100:300,3通道感兴趣区域,并显示出来
fill_color_demo(src)负责利用泛洪算法填充感兴趣区域。#mask必须行和列都加2,且必须为uint8单通道阵列,当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理。从(30, 30)这个像素点开始,当前像素-(100, 100, 100)作为低值,当前像素+(50, 50, 50)作为高值,在低值和高值之间的颜色全被填充, (0, 255, 255)是要填充成这个颜色,设置FLOODFILL_FIXED_RANGE(改变图像,泛洪填充)。
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参数表示需要填充对象像素点的上下限中的下限是:种子点的像素减去loDiff(其结果还是一个颜色值)。
upDiff参数表示需要填充对象像素点的上下限中的上限是:种子点的像素加upDiff(其结果还是一个颜色值)。
flags参数:操作标志符,包含三部分:
低八位(0~7位):用于控制算法的连通性,可取4(默认)或8。
中间八位(8~15位):用于指定掩码图像的值,但是如果中间八位为0则掩码用1来填充。
高八位(16~32位):可以为0或者如下两种标志符的组合:
FLOODFILL_FIXED_RANGE:表示此标志会考虑当前像素与种子像素之间的差,否则就考虑当前像素与相邻像素的差。
FLOODFILL_MASK_ONLY:表示函数不会去填充改变原始图像,而是去填充掩码图像mask,mask指定的位置为零时才填充,不为零不填充。
fill_binary()负责填充二值图像,直接生成一个3通道全为0的图像,把其中一部分值全改成255,生成mask,必须是400+2,选中以外的位置初始化为1,必须使用np.uint8类型,填充位置mask初始化为0,设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数。