OpenCV(十二)漫水填充算法

目录

一、基础理论

1、概述

2、API

二、实战

1、黑白图像填充(python)

1、对内部填充

2、对外部填充

总代码

 2、彩图填充(C++)


一、基础理论

1、概述

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

2、API

python:

cv2.floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)

image: 输入图片
mask: 掩码, 比 image 长宽高 2
seedPoint: 泛洪算法的起始点
newVal: 重绘区域的新值 (颜色)
loDiff: seePoint - loDiff 下限
upDiff: seePoint - upDiff 上限
flags: 操作标志符
        LOODFILL_FIXED_RANGE: 改变图像, 泛洪填充
        FLOODFILL_MASK_ONLY: 不改变图像, 只填充 mask 本身, 忽略新的颜色值参数

cv2.floodFill(img, mask,             (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
    #             掩码(长宽=原图长宽+2) 泛洪算法起点  填充颜色      下限           上限          填充方式

C++: 

 int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
floodFill(src, Point(10, 10), Scalar(255, 255, 0), &ccomp, Scalar(10, 10, 10), Scalar(10, 10, 10));
//			    起始点		  颜色				 最小边界矩形  负差最大值			正差最大值

二、实战

1、黑白图像填充(python)

1、对内部填充

(注:坐标不固定,根据自己需要确定填充坐标)

# 漫水填充
def flood_fill():
    # 获取高宽
    h, w = img.shape[:2]     #即shape[0:2],shape的0~2
    print(h,w)

    # 创建掩码(长、宽必须比原图大2)
    mask = np.zeros([h+2, w+2], np.uint8)

    # 漫水填充(泛洪)
    cv2.floodFill(img, mask,             (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
    #                 掩码(长宽=原图长宽+2) 泛洪算法起点  填充颜色      下限           上限          填充方式

    # 图片展示
    cv2.imshow("flood_fill", img)

 

2、对外部填充

只需要把填充的坐标由(100, 200)修改成(200, 200)即可完成填充。

(注:坐标不固定,根据自己需要确定填充坐标)

cv2.floodFill(img, mask,             (200, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)

 

 再修改坐标,把小块填充上:

cv2.floodFill(img, mask, (200, 320), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)

总代码

# 漫水填充(泛洪)
import numpy as np
import cv2

# 漫水填充
def flood_fill():
    # 获取高宽
    h, w = img.shape[:2]     #即shape[0:2],shape的0~2
    print(h,w)

    # 创建掩码(长、宽必须比原图大2)
    mask = np.zeros([h+2, w+2], np.uint8)

    # 漫水填充(泛洪)
    # cv2.floodFill(img, mask,             (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
    # cv2.floodFill(img, mask,             (200, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
    cv2.floodFill(img, mask, (200, 320), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
    #                 掩码(长宽=原图长宽+2) 泛洪算法起点  填充颜色      下限           上限          填充方式

    # 图片展示
    cv2.imshow("flood_fill", img)


if __name__ == "__main__":
    # 读取图片
    img = cv2.imread("Resource/test8.jpg")
    cv2.imshow('img', img)

    # 获取泛洪图像
    flood_fill = flood_fill()

    cv2.waitKey(0)

 2、彩图填充(C++)

//漫水填充
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat src;

//图像初始化
void Image_Init()
{
	src = imread("Resource/test.jpg");					//读取
	if (src.empty())
	{
		printf("could not load the picture...");
	}
}

int main()
{
	Image_Init();						//图像初始化
	imshow("原图", src);

	Rect ccomp;
	floodFill(src, Point(10, 10), Scalar(255, 255, 0), &ccomp, Scalar(10, 10, 10), Scalar(10, 10, 10));
	//				起始点			颜色			最小边界矩形	 负差最大值			正差最大值

	imshow("填充图", src);

	waitKey(0);

	return 0;
}

效果

参考资料

https://iamarookie.blog.csdn.net/article/details/119089829

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答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漫水填充功能都有助于提取感兴趣的区域并进行后续处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_(*^▽^*)_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值