OpenCV之漫水填充与floodFill函数(C++实现)

69 篇文章 15 订阅
53 篇文章 15 订阅

漫水填充的定义

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

漫水填充的基本思想

漫水填充,就是自动的选中与种子点相连的区域,然后将该区域替换成指定的颜色,这个功能经常被用来标记或分离图像的一部分进行处理或分析。漫水填充也可以用来输入图像获取掩膜区域,掩膜会加速处理过程,或者只处理掩膜指定的像素点。

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

漫水填充:floodFill函数

OpenCV中漫水填充由floodFill函数实现,其作用时用指定的颜色从种子点开始填充一个连通区域。连通性由像素值的接近程度来衡量。

第一个版本的floodFill:

int floodFill(InputArray image, Point seedPoint, Scalar newVal, Rect* rect=0,Scalar ioDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4)

第二个版本的floodFill:

int floodFill(InputArray image, InputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0,Scalar ioDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4)

参数详解(除了第二个参数外,其它参数都是公用的):

  • 第一个参数:输入图像,1个或3个通道的8位或浮点图像。
  • 第二个参数:InputArray类型的mask,只有第二个版本才有该参数,表示作为掩膜。它应该是单通道,8位,长和宽都比输入图像大两个点的图像。因为漫水填充需要使用以及更细掩膜,所以对这个mask参数,我们一定要将其准本好并填在此处。需要注意的是,漫水填充不会填充mask的非零像素区域。例如,一个边缘检测算子的输出可以用来作为掩膜,以防止填充到边缘。同样的,也可以在多次的函数调用中使用同一个掩膜,以保证填充的区域不会重叠。需要注意的是,mask会比需填充的图像大,所以mask与输入图像(x, y)像素点对应的坐标为(x,+1 y+1)。
  • 第三个参数:Point类型的seedPoint,漫水填充算法的起始点。
  • 第四个参数:Scalar类型的newVal,像素被染色的值。
  • 第五个参数:Rect*类型的rect,默认值是0,可选参数,用于设置floodFill函数将要重绘区域的最小边界矩形区域。
  • 第六个参数:Scalar类型loDiff,默认值是Scalar(),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差的最大值。
  • 第七个参数:Scalar类型upDiff,默认值是Scalar(),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之正差的最大值。
  • 第八个参数:int类型的flags,操作标志符。

代码示例:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main() {
    Mat srcImage;
    srcImage = imread("/Users/dwz/Desktop/cpp/b.jpg");
    Rect ccomp;
    floodFill(srcImage,Point(150, 150), Scalar(0, 0, 255), &ccomp, Scalar(20, 20, 20),
            Scalar(20, 20, 20));
    imwrite("floodfill.jpg", srcImage);
    return 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值