1. 程式人生 > >opencv(3)-floodFill函式填充,兩種形式

opencv(3)-floodFill函式填充,兩種形式

第一種:聯通方式為,CV_FLOODFILL_FIXED_RANGE,彩色填充

# -*- coding=GBK -*-
import cv2
import numpy as np

def fill_image(image):
    copy_image = image.copy() # 複製原影象
    height,width = image.shape[:2]
    mask = np.zeros([height+2,width+2],np.uint8) # 官方要求,掩模
    # 1 img 2 掩模 3 起始畫素值 4 填充顏色 5 填充顏色的低閾值(3起始畫素值-x) 6 高閾值(+x) 7 填充顏色的方法
    cv2.floodFill(copy_image,mask,(0,80),(0, 100, 255), (100, 100, 50), (50, 50, 50),cv2.FLOODFILL_FIXED_RANGE)
    cv2.imshow('填充',copy_image)
src = cv2.imread('dog.jpg',1)
cv2.imshow('src',src)
fill_image(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

cv2.floodFill引數分別為:源圖掩碼起始填充標記點填充色最大低亮度之間的差異最大高亮度之間的差異聯通方式

  • 掩碼影象,大小比原圖多兩個畫素點。設輸入影象大小為w h ,則掩碼的大小必須為 (w + 2) (h + 2) , mask可為輸出,也可作為輸入 ,由flags決定。
  • 起始填充標記點,從這個點開始往外擴散執行填充。
  • 連通方式:0~7位為0x04或者0x08 即 4連通 或者 8連通,
    8~15位為填充mask的值大小 , 若為0 , 則預設用1填充
    16~23位為 CV_FLOODFILL_FIXED_RANGE =(1 << 16)CV_FLOODFILL_MASK_ONLY =(1 << 17)

flags引數通過位與運算處理:

  • 當為CV_FLOODFILL_FIXED_RANGE 待處理的畫素點與種子點作比較,如果∈(s – lodiff , s + updiff),s為種子點畫素值,則填充此畫素。若無此位設定,則將待處理點與已填充的相鄰點作此比較。
  • 當為CV_FLOODFILL_MASK_ONLY 此位設定填充的對像, 若設定此位,則mask不能為空,此時,函式不填充原始影象img,而是填充掩碼影象. 若無此位設定,則在填充原始影象的時候,也用flags的8~15位標記對應位置的mask.

 第二種,聯通方式為CV_FLOODFILL_MASK_ONLY

mask的指定的位置為零時才填充,不為零不填充

# -*- coding=GBK -*-
import cv2
import numpy as np

def fill2_image():
    image = np.zeros([400,400,3],np.uint8)# 造一張圖
    image[200:300,200:300] = 255
    cv2.imshow('src',image) # 輸出原圖
    height,width = image.shape[:2]
    mask = np.ones([height+2,width+2,1],np.uint8) # mask模板初始化為1
    mask[201:301,201:301] = 0 # 想填充的區域初始化為0
    cv2.floodFill(image,mask,(200,200),(0,0,255),cv2.FLOODFILL_MASK_ONLY)
    cv2.imshow('dst',image)
    
fill2_image()
cv2.waitKey(0)
cv2.destroyAllWindows()