目录
一、基础理论
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;
}
效果