opencv-python填充算法(水漫填充)

水漫填充算法实现
help(cv2.floodFill)

floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) -> retval, image, mask, rect
参数解释:
image:
mask:掩码图像,大小比原图多两个像素点。设输入图像大小为width * height, 则掩码的大小必须为 (width+2) * (height+2) , mask可为输出,也可作为输入 ,由flags决定。

seedPoint :其实填充标记点
newVal:填充值
loDiff:为像素值的下限差值

flags参数 : 0~7位为0x04或者0x08 即 4连通或者8 连通
8~15位为填充mask的值大小 , 若为0 , 则默认用1填充
16~23位为 : CV_FLOODFILL_FIXED_RANGE =(1 << 16), CV_FLOODFILL_MASK_ONLY =(1 << 17)
flags参数通过位与运算处理
当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,如果满足(s – lodiff , s + updiff)之间(s为种子点像素值),则填充此像素 . 若无此位设置,则将待处理点与已填充的相邻点作此比较

CV_FLOODFILL_MASK_ONLY 此位设置填充的对像, 若设置此位,则mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像. 若无此位设置,则在填充原始图像的时候,也用flags的8~15位标记对应位置的mask.

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 26 13:56:41 2017

@author: cross
"""
import numpy as np
import cv2
import random

if __name__ == '__main__':

    img = cv2.imread("G:\python_cv2\orange.jpg",4)
    h, w = img.shape[:2]
    mask = np.zeros((h+2, w+2), np.uint8)
    seed_pt = None
    fixed_range = True
    connectivity = 4

    def update(dummy=None):
        if seed_pt is None:
            cv2.imshow('floodfill', img)
            return
        flooded = img.copy()
        mask[:] = 1
        lo = cv2.getTrackbarPos('lo', 'floodfill')
        hi = cv2.getTrackbarPos('hi', 'floodfill')
        flags = connectivity
        if fixed_range:
            flags |= cv2.FLOODFILL_FIXED_RANGE 

        cv2.floodFill(flooded, mask, seed_pt, (random.randint(0,255), random.randint(0,255), random.randint(0,255)), (lo,)*3, (hi,)*3, flags)

        cv2.circle(flooded, seed_pt, 2, (0, 0, 255), -1)#选定基准点用红色圆点标出
        cv2.imshow('floodfill', flooded)

    def onmouse(event, x, y, flags, param):#鼠标响应函数
        global seed_pt
        if flags & cv2.EVENT_FLAG_LBUTTON:#鼠标左键响应,选择漫水填充基准点
            seed_pt = x, y
            update()

    update()
    cv2.setMouseCallback('floodfill', onmouse)
    cv2.createTrackbar('lo', 'floodfill', 20, 255, update)
    cv2.createTrackbar('hi', 'floodfill', 20, 255, update)

    while True:
        ch = 0xFF & cv2.waitKey()
        if ch == 27:
            break
        if ch == ord('f'):
            fixed_range = not fixed_range #选定时flags的高位比特位0,也就是邻域的选定为当前像素与相邻像素的的差,这样的效果就是联通区域会很大
            print 'using %s range' % ('floating', 'fixed')[fixed_range]
            update()
        if ch == ord('c'):
            connectivity = 12-connectivity #选择4方向或则8方向种子扩散
            print 'connectivity =', connectivity
            update()
    cv2.destroyAllWindows()             
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV-Python提供了多种模型分割的算法,包括基于图像颜色空间的分割、基于形态学操作的分割、基于阈值的分割、基于边缘检测的分割以及基于机器学习的分割。下面我将简单介绍其中几种常用的模型分割算法。 1. 基于阈值的分割:这是最简单的图像分割算法,其基本思想是将图像根据像素灰度值的大小关系进行分割。OpenCV-Python提供了多种阈值分割的方法,包括全局阈值、自适应阈值、Otsu阈值等。 2. 基于形态学操作的分割:形态学操作是一种基于图像形状和结构的处理方法。OpenCV-Python提供了多种形态学操作,包括膨胀、腐蚀、开操作、闭操作等,这些操作可以用于去除噪声、填充空洞、分离物体等。 3. 基于边缘检测的分割:边缘是图像中物体和背景之间的分界线,因此边缘检测可以用于分割图像。OpenCV-Python提供了多种边缘检测算法,包括Sobel、Canny、Laplacian等。 4. 基于机器学习的分割:这种方法需要事先训练一个分类器,然后用分类器对图像进行分割。OpenCV-Python提供了多种机器学习算法,包括支持向量机、随机森林、神经网络等。这些算法可以用于图像分类、目标检测、物体识别等应用。 以上是常用的几种模型分割算法,你可以根据具体的应用场景选择合适的算法。同时,OpenCV-Python还提供了多种图像处理函数和工具,可以帮助你快速实现图像分割功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值