python+opencv系列教程(8)——ROI与泛洪填充

  • A+
所属分类:大数据

ROI与泛洪填充

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。

泛洪填充算法也叫漫水填充算法。就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。Windows画图工具中的油漆桶功能和Photoshop的魔术棒选择功能,都是FloodFill漫水填充的改进和延伸。

原理:从一个点开始遍历附近像素点,填充成新的颜色,知道封闭区域内所有像素点都被填充成新颜色为止。

常见实现方法:4邻域像素填充法、8邻域像素填充法、基于扫描线的像素填充法等。

代码

  1. import cv2 as cv
  2. import numpy as np
  3. def fill_color_demo(image):
  4.     copyimg = image.copycopy()
  5.     h, w = image.shape[:2]
  6.     mask = np.zeros([h+2, w+2], np.uint8)
  7.     cv.floodFill(copyimg, mask, (30, 30)
  8.                  , (0, 255, 255)
  9.                  , (100, 100, 100)
  10.                  , (50, 50, 50)
  11.                  , cv.FLOODFILL_FIXED_RANGE)
  12.     cv.imshow("fill_color_demo",  copyimg)
  13. def fill_binary():  # 填充二值图像
  14.     image = np.zeros([400, 400, 3], np.uint8)  # 直接生成一个3通道全为0的图像
  15.     image[100:300, 100:300, :] = 255  # 把其中一部分值全改成255
  16.     cv.imshow("fill_binary1", image)  # 显示该图
  17.     mask = np.ones([402, 402, 1], np.uint8)  # 必须是400+2,选中以外的位置初始化为1,必须使用np.uint8类型
  18.     mask[101:301, 101:301] = 0  # 填充位置mask初始化为0
  19.     cv.floodFill(image, mask, (200, 200), (0, 0, 255),
  20.                  cv.FLOODFILL_MASK_ONLY)
  21.     # 设置FLOODFILL_MASK_ONLY – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数
  22.     cv.imshow("fill_binary2", image)  # 显示该图
  23. print("start")
  24. src = cv.imread("C:/Users/Admin/Desktop/1.jpg")  # 读取图像
  25. cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)  # 创建显示图像的窗口
  26. cv.imshow("input image", src)  # 显示图片到特定的窗口中
  27. print(src.shape)
  28. roi = src[50:250, 100:300, 0:3]
  29. print(roi.shape)
  30. cv.imshow("roi", roi)
  31. fill_color_demo(src)
  32. fill_binary()
  33. cv.waitKey(0)  # 等待用户操作,0为一直等待,5000为等待用户操作5s
  34. 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(改变图像,泛洪填充)。

python+opencv系列教程(8)——ROI与泛洪填充

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 – 不改变图像,只填充遮罩层本身,忽略新的颜色值参数。

python+opencv系列教程(8)——ROI与泛洪填充

Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!