OpenCV-ROI与泛洪填充

ROI与泛洪填充

ROI

region of interest,感兴趣区域。

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

OpenCV图像坐标是从左上角开始,起始坐标为(0,0),往下是x坐标,往右是Y坐标

示例

def roi(image):
    """将图片的[60:360, 90:300]转换为灰色"""
    face = image[60:360, 90:300]
    # cv.imshow("face", face)
    face_gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)
    face_back = cv.cvtColor(face_gray, cv.COLOR_GRAY2BGR)
    # cv.imshow("face", face_gray)
    image[60:360, 90:300] = face_back
    cv.imshow("face", image)

结果:

在这里插入图片描述

泛洪填充

Flood Fill Algorithm

泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛红填充实现最常见有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与非递归(基于栈)。

注意: 图像处理前可以先使用image.copy()复制一份

cv2.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参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之负差的最大值。
  • upDiff参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之正差的最大值。
  • flags参数:操作标志符,包含三部分:(参考:https://www.cnblogs.com/little-monkey/p/7598529.html)
    • 低八位(0~7位):用于控制算法的连通性,可取4(默认)或8。
    • 中间八位(8~15位):用于指定掩码图像的值,但是如果中间八位为0则掩码用1来填充.
    • 高八位(16~32位):可以为0或者如下两种标志符的组合:
      • FLOODFILL_FIXED_RANGE:表示此标志会考虑当前像素与种子像素之间的差,否则就考虑当前像素与相邻像素的差。
      • FLOODFILL_MASK_ONLY:表示函数不会去填充改变原始图像,而是去填充掩码图像mask,mask指定的位置为零时才填充,不为零不填充。
        • 设置FLOODFILL_FIXED_RANGE – 改变图像,泛洪填充
        • 设置FLOODFILL_MASK_ONLY –不改变图像,只填充遮罩层本身,忽略新的颜色值参数

填充区域:

s r c ( s e e d . x , s e e d . y ) − l o D i f f < = s r c ( x , y ) < = s r c ( s e e d . x , s e e d . y ) + u p D i f f src(seed.x, seed.y)-loDiff<=src(x, y)<=src(seed.x, seed.y)+upDiff src(seed.x,seed.y)loDiff<=src(x,y)<=src(seed.x,seed.y)+upDiff

注意:

  • OpenCV里的mask都是为uin8类型的单通道阵列
  • mask的高和宽都需要比image多2个像素
  • FLOODFILL_MASK_ONLY不是不改变image本身,它也是改变了的。只是说这个“不改变”指的是不改变图像本身的范围,而是只与遮罩层有关

示例

对图片进行泛洪填充,标记为FLOODFILL_FIXED_RANGE

def fill_color(image):
    """对图片进行泛洪填充,标记为FLOODFILL_FIXED_RANGE"""
    copy_image = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([w + 2, h + 2], np.uint8)
    # cv.floodFill(图片,遮盖层,起始位置,填充颜色,低值,高值,填充方法)
    cv.floodFill(copy_image, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("copy_image", copy_image)

结果:
在这里插入图片描述

示例

对黑色的图片进行泛洪填充,标记为FLOODFILL_MASK_ONLY

def fill_binary():
    """对黑色的图片进行泛洪填充,标记为FLOODFILL_MASK_ONLY"""
    image = np.zeros([400, 400, 3], np.uint8)
    image[300, 300, 1] = 255
    cv.imshow("fill_binary_1", image)
    mask = np.ones([400 + 2, 400 + 2], np.uint8)
    mask[101:301, 101:301] = 0  # mask中间矩形[101:301, 101:301]是0,旁边是1
    # cv.floodFill(图片,遮盖层,起始位置,填充颜色,低值,高值,填充方法)
    cv.floodFill(image, mask, (200, 200), (0, 255, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("fill_binary_2", image)

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬着棒棒糖闯天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值