指定颜色替换
代码:
# -*- coding=GBK -*-
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是官方函数要求
cv.floodFill(copyImage, mask, (0, 10), (255, 250, 250), (30, 30, 30), (150, 150, 150), cv.FLOODFILL_FIXED_RANGE)
cv.floodFill(copyImage, mask, (530, 280), (255, 250, 250), (40, 40, 40), (70, 70, 70), cv.FLOODFILL_FIXED_RANGE)
cv.floodFill(copyImage, mask, (530, 60), (255, 250, 250), (150, 150, 150), (75, 75, 75), cv.FLOODFILL_FIXED_RANGE)
# floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
# Image:输入图像,可以是一通道或者是三通道。
# mask:该版本特有的掩膜。 单通道,8位,在长宽上都比原图像image多2个像素点。另外,当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
# seedPoint:漫水填充的种子点,即起始点。
# newVal:被填充的像素点新的像素值
# loDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的差的最大值。
# upDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的和的最大值。
# flag:
# 当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)
# CV_FLOODFILL_MASK_ONLY 此位设置填充的对象,若设置此位,则mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像.
cv.imshow("fill", copyImage)
src = cv.imread("fengling.jpg")
cv.imshow("before", src)
fill_image(src)
cv.waitKey(0)
cv.destroyAllWindows()
结果:
备注:
seedPoint表示的是像素位置,指定位置像素替换的规则是:
src(seed.x’, seed.y’) - loDiff <= src(x, y) <= src(seed.x’, seed.y’) +upDiff
指定位置填充
代码:
# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
#指定位置填充
def fill2_image():
image = np.zeros([200, 200, 3], np.uint8)
#image[100:300, 100:300, :] = 255
cv.imshow("before", image)
mask = np.ones([202, 202, 1], np.uint8)
mask[100:150, 100:150] = 0
cv.floodFill(image, mask, (100, 100), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
cv.namedWindow("after",0)
cv.imshow("after", image)
fill2_image()
cv.waitKey(0)
cv.destroyAllWindows()
结果:
备注:
掩膜/MASK为单通道
FLOODFILL_MASK_ONLY 方式填充为掩膜填充,代码 floodFill() 函数的输入参数(100, 100)为种子点,(0, 0, 255) 为填充颜色