python + opencv 图像处理(七)——ROI与泛洪填充

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()

你可能感兴趣的:(opencv)