泛洪填充/漫水填充

泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是

windows paint的油漆桶功能。算法的原理很简单,就是从一个点开始,将附近像素点填充成新

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

像素填充法,八邻域像素填充法,基于扫描线的像素填充方法

它的原理其实很接单,我们首先来看一下它的api定义

1
2
3
4
5
6
7
8
9
int cv::floodFill   (   
    InputOutputArray    image, 输入图像
    Point   seedPoint,         种子点位置
    Scalar  newVal,            填充颜色值  
    Rect *  rect = 0,          输出填充区域的boundingbox
    Scalar  loDiff = Scalar(), 颜色的最小差异
    Scalar  upDiff = Scalar(), 颜色的最大差异
    int     flags = FLOODFILL_FIXED_RANGE  常用的是按照颜色差异范围来填充 
)   

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;


Mat src;
RNG rng(123456);

void onMouse(int event, int x, int y, int flags, void* userdata){
    // 如果鼠标左键被按下,就在这里打个点开始填充
    if(event == CV_EVENT_LBUTTONDOWN){
        // 构建一个随机的颜色
        Scalar randomColor = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));

        Rect rect;
        //       输入图  种子点            填充颜色      输出填充大小           最小差异                        最大差异                            按照范围填充
        floodFill(src,Point(x,y),randomColor,&rect,Scalar(20,20,20),Scalar(100,100,100),FLOODFILL_FIXED_RANGE);

        cout<<rect.size()<<endl;

        imshow("src",src);
    }
}

int main(int argc,char** argv){
    string path = "/home/kaijun/Documents/resource/opencv/zp.jpg";
    // 读取图片
    src = imread(path,IMREAD_COLOR);

    // 定义窗口
    namedWindow("src",WINDOW_NORMAL);
    setMouseCallback("src",onMouse);
    imshow("src",src);

    waitKey(0);
    return 0;
}