前言
在这里我们不硬啃原理(原理可参考Opencv[人民邮电出版社出版])。
一.漫水填充法原理
漫水填充法是图像处理中进行图像分割的重要方法,其原理是根据像素灰度值之间的差值寻找相同区域以实现分割。
二. 漫水填充法的步骤
2.1 选择种子点(x,y)
2.2 以种子点为中心,判断 4-邻域或者8-邻域的像素值与种子点像素值的差值,将差值小于阈值的像素点添加进区域内
2.3 将新加入的像素点作为新的种子点,反复执行第二步,直到没有新的像素点被添加进该区域为止\
三.参数解析:
floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
image: 可以是单通道或三通道
mask: 掩码矩阵,尺寸比输入图像宽和高各大2的单通道图像,用于标记填充区域。
seedPoint: 种子点
newVal: 归入种子点区域的最小矩阵
loDiff: 添加进种子点区域条件的下界差值
upDiff: 添加种子点区域条件的上界差值,当种子点像素值与邻域某像素点的像素值的差值小于该值时,该像素点被添加进种子点所在的区域
flags:漫水填充法的操作标志。
四.设计步骤
4.1 读取图像
4.2 生成随机数,用于随机生成像素
4.3 确定连通域方式
4.4 掩码图像的数值
4.5 设置于选中像素点的差值
4.6 随机产生图像中的某一点像素
4.7 彩色图像中填充的像素值
4.8 漫水填充函数\
五.demo
程序和设计步骤中有部分出入,单还是可以完成。
import random 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是官方函数要求 px = random.randint(0, h) py = random.randint(0, w) print("px", px, "py", px) cv.floodFill(copyImage, mask, (px, py), (255, 0, 0), (100, 100, 50), (50, 50, 50), flags=4 | (255 << 8) | cv.FLOODFILL_FIXED_RANGE) mask_copy = mask[1:h + 1, 1:w + 1] # 把掩码中的数值取出来大小和原图一样,这样才能和原图进行运算,注意掩码的取值范围从1到h/w+1 mask_copy = cv.merge([mask_copy, mask_copy, mask_copy]) # 要进行图像操作通道数目要一致,用merge函数合并出一个三通道图像 src = cv.bitwise_and(image, mask_copy) # 两个图像相与,mask中非标记区域为0与出来的结果也是0,起到屏蔽作用 cv.namedWindow("fill", cv.WINDOW_NORMAL) cv.imshow("fill", copyImage) # 显示填充过后的图像 cv.namedWindow("and", cv.WINDOW_NORMAL) # cv.imshow("and", image) return src src = cv.imread("0.jpg") # 读取图片 cv.namedWindow("raw", cv.WINDOW_NORMAL) # 设置框体大小和名字 cv.imshow("raw", fill_image(src)) cv.waitKey(0) cv.destroyAllWindows()