11基于opencv的漫水填充算法floodFill()

本文详细介绍了OpenCV中的漫水填充算法floodFill(),包括函数参数解析和示例。floodFill()函数用于图像处理,用于填充指定像素点及相连的相同颜色像素,可用于图像分割等场景。文章还提供了SetMouseCallback()函数的解释,用于处理鼠标事件,结合floodFill()实现交互式图像处理。此外,提供了完整的C++代码示例,演示如何在OpenCV中使用这些函数。
摘要由CSDN通过智能技术生成

漫水填充算法floodFill

一、floodFill()函数

1.1 floodFill()函数各参数详解

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

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

参数详解。除了第二个参数外,其他的参数都是共用的。

Ø  第一个参数,InputOutputArray类型的image, 输入/输出1通道或3通道,8位或浮点图像,具体参数由之后的参数具体指明。

Ø  第二个参数, InputOutputArray类型的mask,这是第二个版本的floodFill独享的参数,表示操作掩模,。它应该为单通道、8位、长和宽上都比输入图像 image 大两个像素点的图像。第二个版本的floodFill需要使用以及更新掩膜,所以这个mask参数我们一定要将其准备好并填在此处。需要注意的是,漫水填充不会填充掩膜mask的非零像素区域。例如,一个边缘检测算子的输出可以用来作为掩膜,以防止填充到边缘。同样的,也可以在多次的函数调用中使用同一个掩膜,以保证填充的区域不会重叠。另外需要注意的是,掩膜mask会比需填充的图像大,所以 mask 中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1)。

Ø  第三个参数,Point类型的seedPoint,漫水填充算法的起始点。

Ø  第四个参数,Scalar类型的newVal,像素点被染色的值,即在重绘区域像素的新值。

Ø  第五个参数,Rect*类型的rect,有默认值0,一个可选的参数,用于设置floodFill函数将要重绘区域的最小边界矩形区域。

Ø  第六个参数,Scalar类型的loDiff,有默认值Scalar( ),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差(lowerbrightness/color difference)的最大值。

Ø  第七个参数,Scalar类型的upDiff,有默认值Scalar( ),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之正差(lowerbrightness/color difference)的最大值。

Ø  第八个参数,int类型的flags,操作标志符,此参数包含三个部分,比较复杂,我们一起详细看看。

 

低八位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或者 8。如果设为4,表示填充算法只考虑当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。

高八位部分(16~23位)可以为0 或者如下两种选项标识符的组合:    

                                                                                   

FLOODFILL_FIXED_RANGE- 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。

FLOODFILL_MASK_ONLY -如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal), 而是去填充掩模图像(mask)。这个标识符只对第二个版本的floodFill有用,因第一个版本里面压根就没有mask参数。

 

中间八位部分,上面关于高八位FLOODFILL_MASK_ONLY标识符中已经说的很明显,需要输入符合要求的掩码。Floodfill的flags参数的中间八位的值就是用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充。

而所有flags可以用or操作符连接起来,即“|”。例如,如果想用8邻域填充,并填充固定像素值范围,填充掩码而不是填充源图像,以及设填充值为38,那么输入的参数是这样:

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

 

1.2调用示例 

Mat ScrImage;

ScrImage = imread("E:\\1TJQ\\Opencv\\Images\\image1.jpg");

floodFill(ScrImage, Point(50,100), Scalar(50, 100, 255));

imshow("【漫水填充算法】", ScrImage);

 

二、SetMouseCallback()函数

2.1 SetMouseCallback()函数各参数详解

void setMouseCallback(conststring& winname,MouseCallback onMouse, void* userdata = 0)

 

Ø  第一个参数,const string&类型的winname,为窗口的名字。

Ø  第二个参数,MouseCallback类型的onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。这个函数的原型应该为voidFoo(int event,int x, int y, int flags, void* param);其中event是 CV_EVENT_*变量之一, x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系), flags是CV_EVENT_FLAG的组合, param是用户定义的传递到cvSetMouseCallback函数调用的参数。

Ø  第三个参数,void*类型的userdata,用户定义的传递到回调函数的参数,有默认值0

 

2.2调用示例 

Mat ScrImage;

ScrImage = imread("E:\\1TJQ\\Opencv\\Images\\image1.jpg");

//点击鼠标,用回调函数处理图片

setMouseCallback("效果图", onMouse, 0);

 

三、完整程序

#include "opencv2/imgproc/imgproc.hpp" 

#include "opencv2/highgui/highgui.hpp" 

#include <iostream> 

 

//-----------------------------------【命名空间声明部分】---------------------------------------   

//      描述:包含程序所使用的命名空间   

//-----------------------------------------------------------------------------------------------    

using namespacecv;

using namespacestd;

 

 

//-----------------------------------【全局变量声明部分】--------------------------------------   

//      描述:全局变量声明    

//-----------------------------------------------------------------------------------------------   

Matg_srcImage, g_dstImage, g_grayImage, g_maskImage;//定义原始图、目标图、灰度图、掩模图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三公子Tjq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值