ROI(region of interest),也就是感兴趣区域,如果你设置了图像了ROI,那么在使用OpenCV的函数的时候,会只对ROI区域操作,其他区域忽略。
floodFill函数详解:
参数:
image 【输入/输出】 1或者3通道、 8bit或者浮点图像
mask 【输入/输出】 操作掩码,必须为单通道、8bit,且比image宽2个像素、高2个像素
seedPoint 起始像素点
newVal 重绘像素区域的新的填充值(颜色)
rect 可选输出参数,返回重绘区域的最小绑定矩形
loDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大下行差异值
upDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大上行差异值
flags flags标志位是一个32bit的int类型数据,其由3部分组成: 0-7bit表示邻接性(4邻接、8邻接);8-15bit表示mask的填充颜色;16-31bit表示填充模式(详见填充模式解释)
flood fill填充模式:
FLOODFILL_FIXED_RANGE:如果设置了该值,则考虑当前像素与seed像素之间的差异,否则考虑相邻像素之间的差异(即浮动区间)
FLOODFILL_MASK_ONLY:如果设置了该值,floodFill函数不会修改image的内容(newVal被忽略),只使用flags标志中bit8-15的值填充mask。该选项仅在含mask参数的floodFill函数中有效。
通俗解释: floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法
参数5.填充颜色的低值就是:参数3 减去 参数5
参数6.填充颜色的高值就是:参数3 加上 参数6
即是这两个数值之间的色素替换为参数4的颜色
import cv2 as cv
import numpy as np
# 截取图片中的指定区域或在指定区域添加某一图片
def jie_image(src1):
src2 = src1[20:100, 500:700] # 截取第5行到89行的第500列到630列的区域
cv.imshow("intercept", src2) #截取图片
src1[105:185, 300:500] = src2 # 指定位置填充,大小要一样才能填充
cv.imshow("composite", src1) #合成图片
#指定颜色替换
def fill_image(image):
copyImage = image.copy()#复制原图像
h, w = copyImage.shape[:2]#读取图像的宽和高
mask = np.zeros([h+2, w+2], np.uint8)#新建图像矩阵 +2是官方函数要求
# 泛洪填充
cv.floodFill(copyImage, mask, (0, 80), (0, 100, 255), (100, 100, 50), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("floodFill", copyImage)
# 指定位置填充
def fill_binary():
# 创建一张400×400的黑图
image = np.zeros([400, 400, 3], np.uint8)
image[50:350, 50:350, :] = 255
cv.imshow("original", image)
# mask的大小一定比原图大2
mask = np.ones([402, 402, 1], np.uint8)
# 将下面的区域赋值为0
mask[101:301, 101:301] = 0
# 进行指定位置填充
cv.floodFill(image, mask, (200, 200), (0, 0, 255),(10,10,10),(10, 10, 10), cv.FLOODFILL_MASK_ONLY)
cv.imshow("floodFill2", image)
if __name__ == '__main__':
'''
ROI切片填充jie_image()
'''
# src = cv.imread("pic/cat.jpg")
# cv.imshow("original", src)
# jie_image(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
泛洪填充fill_image()
'''
# src = cv.imread("pic/cat.jpg")
# cv.imshow("original", src)
# fill_image(src)
# cv.waitKey(0)
# cv.destroyAllWindows()
'''
指定位置填充fill_binary()
'''
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()