一、指定颜色填充
代码如下:
# 引入包
import cv2 as cv
import numpy as np
def fill_image(image):
copyImage = image.copy() # 复制原图像
h, w = image.shape[:2] # 读取图像的宽高
mask = np.zeros([h+2, w+2], np.uint8) # 新建图像矩阵 +2是官方函数要求
#(0,80) 起始点,(0,100,255) 蓝色 ,(100,100,50)棕色 ,(50,50,50) 浅黑
cv.floodFill(copyImage, mask, (0,0), (0, 100, 255), (100, 100, 50), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.namedWindow("fill", cv.WINDOW_NORMAL)
cv.imshow("fill", copyImage)
src = cv.imread("./static/image/Linux.jpg")
cv.namedWindow("oldImage", cv.WINDOW_NORMAL)
cv.imshow("oldImage", src)
fill_image(src)
cv.waitKey(0)
cv.destroyAllWindows()
代码解释:
思想
漫水填充:就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。通常是用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。可以只处理掩码指定的部分或者对掩码上的区域进行屏蔽不处理。
主要作用就是:选出与种子点连通的且颜色相近的点,对像素点的值进行处理。如果遇到掩码,根据掩码进行处理。
工作流程:
- 选定种子点(x,y)
- 检查种子点的颜色,如果该点颜色与周围连接点的颜色不相同,则将周围点颜色设置为该点颜色,如果相同则不做处理。但是周围点不一定都会变成和种子点的颜色相同,如果周围连接点在给定的范围内(lodiff - updiff)内或在种子点的象素范围内才会改变颜色。
- 检测其他连接点,进行2步骤的处理,直到没有连接点,即到达检测区域边界停止。
原文:https://blog.csdn.net/u013539952/article/details/80702849
floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
- image:输入/输出】1或者3通道、 8bit或者浮点图像。仅当参数flags的FLOODFILL_MASK_ONLY标志位被设置时image不会被修改,否则会被修改。
- mask:【输入/输出】 操作掩码,必须为单通道、8bit,且比原图image宽、高多2个像素。为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理。使用前必须先初始化。当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
- seedPoint:漫水填充的种子点,起始像素点。
- newVal:被填充的像素点新的像素值
- loDiff:添加进种子点区域条件的下界差值。表示当前观察像素值与其邻域像素值或待加入的种子像素值之间的亮度或颜色的最大负差。
- upDiff:添加进种子点区域条件的上界差值。表示当前观察像素值与其邻域像素值或待加入的种子像素值之间的亮度或颜色的最大正差。
- flag:为泛洪算法的处理模式
- 当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)
- CV_FLOODFILL_MASK_ONLY 此位设置填充的对像, 若设置此位,则mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像.
通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.添加进种子点区域条件的下界差值, 6.添加进种子点区域条件的上界差值 ,7.填充的方法)
(100, 100, 50), (50, 50, 50)为色素差范围,我的理解是差值过大将会覆盖所有颜色,即整张图片将变成参数4的填充颜色
实例(800, 800, 800), (50, 50, 50):
当种子点为(0, 0)时,则与种子点区域相同色素的区域将会被填充颜色
当种子点为(68, 75)时,则与种子点区域相同色素的区域将会被填充颜色,即字母L将被填充为与填充色相同的颜色
二、指定位置填充
代码如下:
def fill2_image():
image = np.zeros([200, 200, 3], np.uint8)
# image[100:300, 100:300, :] = 255
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.imshow("image", image)
# mask 的高宽比原图多2,即h+2,w+2
mask = np.ones([202, 202, 1], np.uint8)
# mask需要填充的位置的像素设置为0,mask就是填充的指定位置。
mask[100:150, 100:150] = 0
# 调用floodFill函数填充 (0,0,255)指定红色填充
cv.floodFill(image, mask, (100, 100), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
cv.namedWindow("fill", cv.WINDOW_NORMAL)
cv.imshow("fill", image)
fill2_image()
cv.waitKey(0)
cv.destroyAllWindows()
填充原理图