思想
漫水填充:就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。通常是用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。可以只处理掩码指定的部分或者对掩码上的区域进行屏蔽不处理。
主要作用就是:选出与种子点连通的且颜色相近的点,对像素点的值进行处理。如果遇到掩码,根据掩码进行处理。
工作流程:
- 选定种子点(x,y)
- 检查种子点的颜色,如果该点颜色与周围连接点的颜色不相同,则将周围点颜色设置为该点颜色,如果相同则不做处理。但是周围点不一定都会变成和种子点的颜色相同,如果周围连接点在给定的范围内(lodiff - updiff)内或在种子点的象素范围内才会改变颜色。
- 检测其他连接点,进行2步骤的处理,直到没有连接点,即到达检测区域边界停止。
实例
下面贴出毛星云的例子,进行详细分析
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage, g_grayImage, g_maskImage; //定义原始图,目标图,灰度图,掩模图(进一步控制那些区域将被填充颜色)
int g_nFillMode = 1; //漫水填充的模式
int g_nLowDifference = 20, g_nUpDifference = 20; //负差最大值,正差最大值
int g_nConnectivity = 4; //表示floodFill函数标识符低8位的连通值,4,只考虑像素水平和垂直方向的连接点
int g_bIsColor = true; //是否为彩色图的标识符布尔值
bool g_bUseMask = false; //是否显示掩模窗口的布尔值
int g_nNewMaskVal = 255; //新的重新绘制的像素值
//鼠标回调函数
static void onMouse(int event, int x, int y, int, void *)
{
//若鼠标左键没有按下,便返回
if (event != EVENT_LBUTTONDOWN)
return;
//调用floodFill函数之前的参数准备
Point seed = Point(x, y); //漫水填充的起始点
int LowDifference = g_nFillMode == 0 ? 0 : g_nLowDifference; //空范围的漫水填充,此值设为0,否则设为全局的g_nLowDifference
int UpDifference = g_nFillMode == 0 ? 0 : g_nUpDifference;