【OpenCV】漫水填充

1、漫水填充的定义

漫水填充法是一种特定的颜色填充连通区域,通过设置可以连通像素的上下限以及连通方式来达到不同的填充效果的方法。漫水填充经常被用来标记或者分离图像的一部分,以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。

补充:图像掩码相关知识:

1、图象掩码这个很多种类;二值掩码就是设定一个阈值,如果像素的灰度大于该阈值这变为黑,小于则变为白,图像经过此变换就变成二值图像。当然如果是彩色图像可以先转化为灰度图。

2、二值图像是每个像素只有两个可能值的数字图像。人们经常用黑白、B&W、单色图像表示二值图像,但是也可以用来表示每个像素只有一个采样值的任何图像,例如灰度图像等。二值图像经常出现在数字图像处理中作为图像掩码或者在图像分割、二值化和dithering的结果中出现。一些输入输出设备,如激光打印机、传真机、单色计算机显示器等都可以处理二值图像。

2、漫水填充法的基本思想

所谓漫水填充,就是自动选中了和种子点相连的区域,接着将该点区域替换成指定的颜色,经常用来标记或者分离图像的一部分进行处理或分析。漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点。

以此填充算法为基础,类似PhotoShop的魔术棒选择工具就很容易实现了。漫水填充(FloodFill)是查找和种子点连通的颜色相同的点,魔术棒选择工具则是查找和种子点连通的颜色相近的点,把和初始种子像素颜色相近的点压进栈做为新种子。

3、实现漫水填充算法:floodFill函数

说明:漫水填充算法由floodFill函数实现,其作用是用我们指定的颜色从种子点开始填充一个连接域。连通性由像素值的接近程度来衡量。

两个版本的floodFill,一个不带掩膜mask版和带mask版本。这个掩膜mask,就是用于进一步控制哪些区域将被填充颜色(比如对于同一图像进行多次填充时)。这两个版本的FloodFill,都必须在图像中选一个种子点,然后把临近区域所有相似点填充上同样的颜色,不同的是,不一定将所有的邻近点都染上同一颜色,漫水填充操作的结果总是某个连接的区域,当邻近像素点位于给定的范围(从loDiff到upDiff)内或在原始seedPoint像素值范围内时,FloodFill函数就会为这个点涂上颜色。具体如下:

  • 版本一
int floodFill(InputOutputArray image,Point seedPoint,Scalar newVal,Rect * rect=0,Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4);
  • 版本二
int floodFill(InputOutputArray image,IntputOutputArray mask,Point seedPoint,Scalar newVal,Rect * rect=0,Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4)
  • 第一个参数:输入/输出1通道或3通道,8位或浮点图像,具体参数由之后的参数指明。

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

  • 第三个参数:Point seed类型的Point漫水填充的起始点

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

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

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

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

  • 第八个参数:int 类型的flags,操作标识符,此参数包含三个部分

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

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

    • FLOODFILL_FIXED_RANGE:如果设置这个标识符,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其像素与相邻像素的差。这个范围是浮动的
    • FLOODFILL_MASK_ONLY:如果设置这个标识符,函数不会去填充改变原始图像(也就忽略第三个参数new Val),而是去填充掩膜图像(mask)。这个标识符只对第二个版本的floodFill有用。

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

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

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

4、代码详解

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
	Mat src = imread("E:\\Pec\\蜘蛛侠.jpg");
	imshow("【原始图】", src);
	Rect ccomp;
	floodFill(src, Point(100, 500), Scalar(155, 255, 55), &ccomp, Scalar(20, 20, 20),
	 Scalar(20, 20, 20));
	imshow("【效果图】", src);
	waitKey(0);
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenCV是一种广泛使用的计算机视觉库,可以用于许多不同的应用程序,例如图像处理、目标识别和计算机视觉应用等。在OpenCV中,水平和垂直填充是一种常见的图像处理技术,它们可以用于扩展图像的大小并提高其质量。以下是使用OpenCV进行水平和垂直填充的示例代码: 水平填充示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat image = imread("image.jpg"); Mat padded_image; int border_width = 50; copyMakeBorder(image, padded_image, 0, 0, border_width, border_width, BORDER_CONSTANT, Scalar(0, 0, 0)); imshow("Original Image", image); imshow("Padded Image", padded_image); waitKey(0); return 0; } ``` 垂直填充示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat image = imread("image.jpg"); Mat padded_image; int border_width = 50; copyMakeBorder(image, padded_image, border_width, border_width, 0, 0, BORDER_CONSTANT, Scalar(0, 0, 0)); imshow("Original Image", image); imshow("Padded Image", padded_image); waitKey(0); return 0; } ``` 以上代码中,首先使用imread()函数读取图像。然后,使用copyMakeBorder()函数将图像进行填充。在水平填充示例中,将图像的左边和右边各填充50个像素,而在垂直填充示例中,将图像的上边和下边各填充50个像素。最后,使用imshow()函数显示原始图像和填充后的图像,并使用waitKey()函数等待用户输入。 ### 回答2: OpenCV中的漫水填充(Flood Fill)是一种图像处理技术,用于将特定区域填充为指定的颜色或模式。它可以应用于许多图像分割和处理任务中,如对象提取、背景去除等。 漫水填充的原理是从指定的种子点开始,通过扩散算法将相邻的像素点标记为同一种颜色,直到达到边界或满足特定的停止条件。 在OpenCV中,我们可以使用`cv2.floodFill()`函数来实现漫水填充。该函数具有以下参数: - `image`:输入图像,必须为8位单通道图像。 - `mask`:掩码图像,用于指示那些像素点已经填充的区域。 - `seedPoint`:漫水填充的种子点,即起始点。 - `newVal`:填充的新值,可以是单个整数或一个包含3个整数的元组。 - `loDiff`和`upDiff`:低和高的颜色差异阈值,用于控制是否填充相似颜色的像素点。 - `flags`:附加标志,可用于调整填充方式和行为。 通过传递适当的参数,我们可以实现不同的漫水填充效果。例如,我们可以使用不同的颜色填充区域,或者使用掩码限制填充的区域。 漫水填充是一个强大而灵活的图像处理技术,在实际应用中广泛使用。无论是处理数字图像还是计算机视觉任务,OpenCV漫水填充功能都有助于提取感兴趣的区域并进行后续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我菜就爱学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值