【OpenCV3.3+Python3.6】泛洪填充

31 篇文章 1 订阅
31 篇文章 0 订阅

泛洪填充

泛洪填充是很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能。算法的原理很简单,就是从一个点

开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。泛洪填充实现最常见有四邻域像素填充

法,八邻域像素填充法,基于扫描线的像素填充方法。根据实现又可以分为递归与非递归(基于栈)。
 

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

 

代码

import cv2
import numpy as np


def fill_color_demo(image):#彩色图像填充
    copyImg=image.copy()
    h,w,ch=image.shape
    mask=np.zeros([h+2,w+2],np.uint8)    #生成一个矩形形状,比上面图片的长宽各大2个像素
    #np.zeros返回来一个给定形状和类型的用0填充的数组;
    #zeros(shape, dtype=float, order=‘C’)
    # shape:形状
    # dtype:数据类型,可选参数,默认numpy.float64
    # order:可选参数,c代表与c语言类似,行优先;F代表列优先
    cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
    # cv2.floodFill(img, mask, seed, newvalue(BGR), (loDiff1, loDiff2, loDiff3), (upDiff1, upDiff2, upDiff3), flag)
    #
    # img:为待使用泛洪算法的图像
    # mask:为掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数 + 2,列数 + 2.
    # 是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵。【dtype: np.uint8】
    # seed:为泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。
    #         【类似于】
    # newvalue:是对于泛洪区域新赋的值(B, G, R)
    # (loDiff1, loDiff2, loDiff3):是相对于seed种子点像素可以往下的像素值,即seed(B0, G0,
    #                                                         R0),泛洪区域下界为(B0 - loDiff1, G0 - loDiff2, R0 - loDiff3)
    # (upDiff1, upDiff2, upDiff3):是相对于seed种子点像素可以往上的像素值,即seed(B0, G0,
    #                                                         R0),泛洪区域上界为(B0 + upDiff1, G0 + upDiff2, R0 + upDiff3)
    # flag:为泛洪算法的处理模式。
    #   cv2.FLOODFILL_FIXED_RANGE:改变图像,填充newvalue
    #   cv2.FLOODFILL_MASK_ONLY:不改变原图像,也就是newvalue参数失去作用,而是改变对应区域的掩码,设为中间八位的
    # cv2.imshow("color_demo",copyImg)

def fill_binary():#二值图像填充
    image=np.zeros([400, 400, 3],np.uint8)  #创建400*400 的3个通道的彩色图像  3*8=24位图像
    image[100:300, 100:300, :]= 255  #设置竖向100-300,横向100-300的区域都赋值为255
    cv2.imshow("fill_binary",image)

print("------HELLO PYTHON-------")
src=cv2.imread("dwaii.png")  #读取图片
cv2.imshow("src",src)     #显示原图

print("------IMAGE FILL-------")
fill_color_demo(src)
fill_binary()
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

 

彩色填充之后图像:

 

二值图像的填充:即是对感兴趣区域的填充

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Demo.demo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值