天天看點

openCV第五課 ROI 與 泛宏填充

#File Name : 第五課.py

import cv2 as cv
import numpy as np
# 泛宏填充
def fill_color_demo(image):
    copyImg = image.copy()
    h,w = image.shape[:2]
    mask = np.zeros([h+2,w+2],np.uint8) # 尺寸要注意
    print(image[100,100,:])
    cv.floodFill(copyImg,mask,(100,100),(0,255,255),(100,100,100),(30,30,30),cv.FLOODFILL_FIXED_RANGE)
    #這個掩膜mask,就是用于進一步控制哪些區域将被填充顔色(比如說當對同一圖像進行多次填充時)。
    #第二個參數, InputOutputArray類型的mask,這是第二個版本的floodFill獨享的參數,表示操作掩模,
    # 它應該為單通道、8位、長和寬上都比輸入圖像 image 大兩個像素點的圖像。第二個版本的floodFill需要
    # 使用以及更新掩膜,是以這個mask參數我們一定要将其準備好并填在此處。需要注意的是,漫水填充不會填
    # 充掩膜mask的非零像素區域。例如,一個邊緣檢測算子的輸出可以用來作為掩膜,以防止填充到邊緣。
    # 同樣的,也可以在多次的函數調用中使用同一個掩膜,以保證填充的區域不會重疊。另外需要注意的是,
    # 掩膜mask會比需填充的圖像大,是以 mask 中與輸入圖像(x,y)像素點相對應的點的坐标為(x+1,y+1)。
    #第三個參數,Point類型的seedPoint,漫水填充算法的起始點。
    #第四個參數,Scalar類型的newVal,像素點被染色的值,即在重繪區域像素的新值。
    #第五個參數,Rect*類型的rect,有預設值0,一個可選的參數,用于設定floodFill函數将要重繪區域的最小邊界矩形區域。
    #第六個參數,Scalar類型的loDiff,有預設值Scalar( ),表示目前觀察像素值與其部件鄰域像素值或者待加入該部件的種子像素之間的亮度或顔色之負差(lower brightness/color difference)的最大值。 
    #第七個參數,Scalar類型的upDiff,有預設值Scalar( ),表示目前觀察像素值與其部件鄰域像素值或者待加入該部件的種子像素之間的亮度或顔色之正差(lower brightness/color difference)的最大值。
    #第八個參數,int類型的flags,操作标志符,此參數包含三個部分,比較複雜,我們一起詳細看看。
    #FLOODFILL_FIXED_RANGE - 如果設定為這個辨別符的話,就會考慮目前像素與種子像素之間的差,否則就考慮目前像素與其相鄰像素的差。也就是說,這個範圍是浮動的。
    #FLOODFILL_MASK_ONLY - 如果設定為這個辨別符的話,函數不會去填充改變原始圖像 (也就是忽略第三個參數newVal), 而是去填充掩模圖像(mask)。這個辨別符隻對第二個版本的floodFill有用,因第一個版本裡面壓根就沒有mask參數。
    cv.imshow('fill_color_demo',copyImg)
    
def fill_bin():
    image = np.zeros([400,400,3],np.uint8)
    image[100:300,100:300,:] = 255
    cv.imshow('fill_bin',image)
    mask = np.ones([402,402,1],np.uint8)
    # 隻會改變0區域 而非零不會改變
    mask[101:301,101:301] = 0
    cv.floodFill(image,mask,(200,200),(255,255,0),cv.FLOODFILL_MASK_ONLY)
    cv.imshow('bin',image)

# ROI
src1 = cv.imread('G:/openCV/opencv/sources/samples/data/messi5.jpg')
ball = src1[280:340,330:390]
src1[200:260,100:160] = ball
#cv.imshow('test',src1)
#fill_color_demo(src1)
fill_bin()
cv.waitKey(0)