import cv2 as cv
import numpy as np
def fill_color_demo(image):
copyImage = image.copy()
h,w = image.shape[:2]
mask = np.zeros([h+2,w+2],np.uint8)
cv.floodFill(copyImage,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color",copyImage)
def fill_binary_demo():
image = np.zeros([400,400,3],np.uint8)
image[100:300,100:300,:] =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)
cv.imshow("filled_binary",image)
src = cv.imread("E:/opencv/picture/me.jpg")
cv.imshow("initial_window",src)
face = src[50:350,100:300]
gray = cv.cvtColor(face,cv.COLOR_BGR2GRAY)
back_face = cv.cvtColor(gray,cv.COLOR_GRAY2BGR)
src[50:350,100:300] = back_face
cv.imshow("face_window",src)
fill_color_demo(src)
fill_binary_demo()
cv.waitKey(0)
cv.destroyAllWindows()
知识点:
1. 选取ROI感兴趣区域
src[ : , : ] = 像素矩阵
然后显示src图像就会出现ROI区域的像素值是像素矩阵的值。
容易混淆的。
h,w= src.shape[:2] ,获取图片的高度(x),获取图片的宽度(y)
2. 彩色图像的泛洪填充
def fill_color_demo(image):
copyImage = image.copy()
#复制图像
h,w = image.shape[:2] #读取图像的高,宽
mask = np.zeros([h+2,w+2],np.uint8)
#新建一个mask矩阵,+2是官方要求必须是8位字节的
cv.floodFill(copyImage,mask,(30,30),(0,255,255)(100,100,100),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color",copyImage)
关于floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
通俗解释:floodFill( 1.操作的图像, 2.掩模mask, 3.漫水填充算法的起始位置,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
关于参数5:读取起始位置的像素值,并由起始位置的像素值-参数五的值即可得到漫水目标区域的下限值
关于参数6:读取起始位置的像素值,并由起始位置的像素值+参数六的值即可得到漫水目标区域的上限值
FLOODFILL_FIXED_RANGE -(既可以用于彩色也可用于灰度图像) 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。
FLOODFILL_MASK_ONLY - (只用于灰度图像)如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal), 而是去填充掩模图像(mask)
注意:mask表示操作掩膜,单通道,8位,长宽都比输入图像大2个像素点的图像。漫水填充不会填充掩膜mask的非零像素区域。(这个大小只能是size.height+2,size.width+2)!
如果是对灰度图像进行漫水操作,填充的颜色值new_value就会被忽略掉(但是也需要设置编写否则语法过不了关),flag部分写cv.FLOODFILL_MASK_ONLY。
3. 灰度图像的泛洪填充
4. image = np.zeros([400,400,3],np.uint8)
image[100:300,100:300,:] =255
#建立一个图像矩阵,并将[100:300,100:300]像素值设置为255,即那一块是白色
cv.imshow("fill_binary",image)
mask = np.ones([402,402,1],np.uint8)
#建立mask矩阵,官方要求+2,必须是8位字节的
mask[101:301,101:301] =0#设置mask[101:301,101:301]位置的像素值为0
cv.floodFill(image,mask,(200,200),(0,0,255),cv.FLOODFILL_MASK_ONLY)
#cv.FLOODFILL_MASK_ONLY:mask的指定的位置为零时才填充,不为零不填充。
#如果设置为cv.FLOODFILL_MASK_ONLY的话,函数不会去填充改变原始图像 (也就是忽略第三个漫水填充算法的起始位置), 而是去填充掩模图像mask
cv.imshow("filled_binary",image)
知识盲区解答:
对ROI进行直接赋值像素值怎么做?
答:image[100:400,100:200] = np.zeros([300,100,3],np.uint8)