目录

一、基础理论

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)

opencv如何给图片某个区域添加颜色 opencv图像填充_c++

 

2、对外部填充

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

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

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

opencv如何给图片某个区域添加颜色 opencv图像填充_opencv_02

 

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

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

opencv如何给图片某个区域添加颜色 opencv图像填充_图像处理_03

总代码

# 漫水填充(泛洪)
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;
}

效果

opencv如何给图片某个区域添加颜色 opencv图像填充_计算机视觉_04