ROI (Regiom of Interest)是指图像中的一个矩形区域,可在该区域对其进行操作,而不会作用到整个图中。比如人脸识别…
泛洪填充(Flood Fill)通常泛洪填充需要从一个点开始,这个点可以随机选择的一点,但是一定要在填充区域内部,然后它就会进行四领域或者把整个领域寻找对周围像素完成填充。
from cv2 import cv2 as cv #导入opencv
import numpy as np #导入numpy
def fill_color_demo(image):
copyImg = image.copy()
h,w = image.shape[:2]
mask = np.zeros([h+2,w+2],np.uint8) # opencv 要求是uint8位
'''
通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
参数5.填充颜色的低值就是:参数3 减去 参数5
参数6.填充颜色的高值就是:参数3 加上 参数6
即是这两个数值之间的色素替换为参数4的颜色
FLOODFILL_FIXED_RANGE 颜色填充
FLOODFILL_MASK_ONLY mask的指定的位置为零时才填充,不为零不填充
'''
cv.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
# 从(30,30)这个像素点开始,最低的范围是30-100,30-100,最高的是30+50,30+50,
# 在这个范围之内的都填充为黄色
cv.imshow('fill_color_demo',copyImg)
def fill_binary():
image = np.zeros([400,400,3],np.uint8) # 创建图像
image[100:300,100:300,:] = 255 # 所有的都为255
cv.imshow('fill_binary',image)
mask = np.ones([402,402,1],np.uint8)
mask[101:301,101:301] = 0
cv.floodFill(image,mask,(200,200),(0,0,255),cv.FLOODFILL_MASK_ONLY)
# 0,0,255 是填充的颜色
cv.imshow('fill_mask',image)
if __name__ == "__main__":
filepath = "C:\\pictures\\0000.png"
img = cv.imread(filepath) # blue green red
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",img)
face = img[50:250,100:300] # 选取图像中的一个区域 # 用numpy选取一个区域
gray = cv.cvtColor(face,cv.COLOR_BGR2GRAY) # 对这个区域进行颜色操作
backface = cv.cvtColor(gray,cv.COLOR_GRAY2BGR) # 将这个还原回去
img[50:250,100:300] = backface # 结果是新图片中的区域是改过的颜色
cv.imshow('face',img)
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()