漫水填充

漫水填充:将与种子点相连的像素相近的连通域替换成指定颜色。如果存在mask,不会填充mask的非零像素。比如边缘检测输出图像可作为mask图

作用:1、标记或分离目标区域;

2、获取掩码区域,只处理掩码指定的像素点,加速处理过程。

【第一个版本】

floodFill(InputOutputArray image,1/3通道8位或浮点图像

Point seedPoint,种子点,起始点

Scalar newVal,指定颜色

Rect* rect=0,设定重绘区域的最小边界矩形

Scalar loDiff=Scalar(),当前观察象素值与其部件领域象素或者待加入该部件的种子象素之负差(Lower difference)的最大值。低于这个差距的不属于重绘区域

Scalar upDiff=Scalar(),当前观察象素值与其部件领域象素或者待加入该部件的种子象素之正差(upper difference)的最大值。高于这个差距的不属于重绘区域

int flags=4);

对于单通道图、8位图,flag可取4邻域(默认)或8邻域

对于高于8位的图,flag可以取0或下面的开关选项的组合:

FLOODFILL_FIXED_RANGE - 如果设置,则考虑当前像素与种子像素之间的差,否则考虑当前像素与其相邻像素的差。(范围是浮点数).

FLOODFILL_MASK_ONLY - 如果设置,函数不填充原始图像(忽略newVal), 只填充掩模图像 (这种情况下 MASK 必须是非空的).

【第二个版本】

floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4);

flags组合可以用“|”或符号

8|FLOODFILL_FIXED_RANGE|FLOODFILL_MASK_ONLY|(38<<8)

意思是8邻域填充固定范围的掩模图像,填充值为38.  38<<8意思是38左移8位

Mask图长和宽上都比输入图像 image 大两个象素点

Mat mask;
        mask.create(src.rows + 2, src.cols + 2, CV_8UC1);初始化掩模mask
        mask = Scalar::all(0);//所有像素为0
        imshow("mask",mask);

【实例】

    Mat src = imread("C:/Users/a/Desktop/2.jpg");
    imshow("原图",src);
    Rect ccomp;
    floodFill(src,Point(100, 50), Scalar(0, 0, 0), &ccomp, Scalar(10, 10, 10), Scalar(50, 50, 50));
    imshow("效果图",src);
    waitKey(0);
    return 0;

时间: 2024-08-06 13:32:14

漫水填充的相关文章

Opencv图像识别从零到精通(24)------漫水填充,种子填充,区域生长、孔洞填充

可以说从这篇文章开始,就结束了图像识别的入门基础,来到了第二阶段的学习.在平时处理二值图像的时候,除了要进行形态学的一些操作,还有有上一节讲到的轮廓连通区域的面积周长标记等,还有一个最常见的就是孔洞的填充,opencv这里成为漫水填充,其实也可以叫种子填充,或者区域生长,基本的原理是一样的,但是应用的时候需要注意一下,种子填充用递归的办法,回溯算法,漫水填充使用堆栈,提高效率,同时还提供了一种方式是扫描行.经常用来填充孔洞,现在来具体看看. 漫水填充:也就是用一定颜色填充联通区域,通过设置可连通

Opencv3编程入门笔记(4)腐蚀、膨胀、开闭运算、漫水填充、金字塔、阈值化、霍夫变换

19      腐蚀erode.膨胀dilate 腐蚀和膨胀是针对图像中的白色部分(高亮部分)而言的,不是黑色的.除了输入输出图像外,还需传入模板算子element,opencv中有三种可以选择:矩形MORPH_RECT,交叉形MORPH_CROSS,椭圆形MORPH_ELLIPSE.Matlab中会有更多一点的模板. 例如: Mat element = getStructuringElement(MORPH_RECT,Size(15,15)); erode(srcImage,dstImage,

【练习5.6】漫水填充法、阈值化、cvSaveImage保存格式

提纲 题目要求 程序代码 结果图片 题目要求: 从噪声图像中创建一个清晰的掩码.完成练习5后,保留图形中最大的图形区域.在图像的左上角设置一个指针,然后让他遍历图像.当你发现像素值为255的时候,存储其位置,然后对其漫水填充,新颜色值为100,.读出漫水填充法返回的连续区域,记录下其面积.如果图像中有另一个较大的区域,那么用0值对这个相对较小的区域进行颜色填充,然后删除已记录的面积.如果新的区域大于之前的区域,那么以0值填充之前的区域并删除他的位置.最后以颜色值255填充剩余的最大区域,显示结果

floodfill 漫水填充 查找相近的像素点

核心函数:cvFloodFill 程序: 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> int floodfill(int argc,char** argv) { IplImage* src=cvLoadImage("e:\\picture\\xibao.jpg"); cvNamedWindow(&q

OpenCV与EmguCV中的漫水填充

漫水填充算法,是根据选定的种子点,用一种自定义的颜色填充种子点的联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果. 漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析. 所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色. 漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点. 在OpenCV中,漫水填充是填充算法中最通用的方法.且在OpenCV 2.X中,使用C++重写过的FloodF

漫水填充算法 - cvFloodFill() 实现

前言 漫水填充算法是用来标记一片区域的:设置一个种子点,然后种子点附近的相似点都被填充同一种颜色. 该算法应用性很广,比如目标识别,photoshop 的魔术棒功能等等,是填充类算法中应用最为广泛的一个算法. 漫水填充算法函数 - cvFloodFill() 函数原型: 1 void cvFloodFill ( 2 IplImage * img, // 输入图像 3 CvPoint seedPoint, // 种子点 4 CvScalar newVal, // 像素点被染色的值 5 CvScal

opencv FloodFill(漫水填充)和物体选取

简介 本篇主要是介绍opencv的FloodFill(漫水填充)和基于它实现的物体选取. FloodFill使用 FloodFill函数 C++: int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 ); InputO

漫水填充算法的一个简单实现(Qt版)

所谓漫水填充算法,是给定一个联通域内的一个点,以此为起点找到这个联通域的其余所有点并将其填充为指定颜色的一种算法. 之所以称之为漫水填充,是因为这种算法就是模拟了涨水的过程,从一点开始,水流慢慢加大,直到漫过了全部区域. 这个算法的详细介绍可以参考下面的链接. https://en.wikipedia.org/wiki/Flood_fill 这个算法在我们寻找一片指定区域时非常有用.因此,我就花了点时间写了个程序.我所实现的算法类似于下面这张图片中的方法,不过我是每次填充一行. 下面这个 flo

opencv —— floodFill 漫水填充,证件照换背景

漫水填充:floodFill 函数 简单来说,漫水填充就是自动选中与种子像素相连的区域,利用指定颜色进行区域颜色填充.Windows 画图工具中的油漆桶功能和 Photoshop 的魔法棒选择工具,都是漫水填充的改进和延伸. //第一个版本 int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = S