Opencv學習筆記05 -- 泛洪填充

距離上一次更新隔了好多天,具體原因是一直在調試骨架識別的程序,但是最終還是沒有弄明白。於是乎,今天開始繼續學習Opencv。

開始

這次的學習筆記主要講的是泛洪填充,具體什麼是泛洪填充,我認爲可以理解爲繪圖工具中的油漆桶功能。

下面代碼演示+講解

#慣例調入包,這次會額外調入numpy包
import  cv2
import  numpy as np

#慣例讀圖片+改尺寸
p = cv2.imread('test.jpg',1)
p = cv2.resize(p,(400,266))
cv2.imshow('flower',p)

#用python切片技術將圖片的高和寬讀取出來
height,width = p.shape[:2]
#設置掩碼層,這一步會在接下來說明
mask = np.zeros([height+2,width+2],np.uint8)
mask [55:43 , 139:102] = 1
#核心函數,具體會在下文講解
cv2.floodFill(p,mask,(0,100),(0,255,255),(20,20,20),(20,20,20),cv2.FLOODFILL_FIXED_RANGE)
#展示效果
cv2.imshow('flood',p)
cv2.waitKey(0)
cv2.destroyAllWindows()

原圖:
在這裏插入圖片描述效果圖:
在這裏插入圖片描述下面我將一句一句來記錄一下代碼的意思

mask = np.zeros([height+2,width+2],np.uint8)
mask [55:43 , 139:102] = 1

掩碼層可以理解爲從原圖中取一塊區域來進行研究

mask = np.zeros([height+2,width+2],np.uint8)

這一步需要注意的是如果你要對全局進行操作,那麼mask在取範圍時應該取 [height(圖高) + 2 , width(圖寬) + 2]。 具體爲什麼是 + 2 而非其他數字,我不太懂,因爲我也是通過看教程才明白的 。 其次這一步中 np.zeros()是numpy自帶函數。 np.uint8 指的是將全圖格式變爲uint8

mask [55:43 , 139:102] = 1

這一句指的是排除非操作區,在進行泛洪填充時,機器只會對圖片中初始置0的位置進行泛洪填充操作。而我將 [55:43 , 139:102] = 1 是爲了防止對此區域進行泛洪填充,也就是最大的黃花並沒有被填充,這個區域被保護了起來

cv2.floodFill(p,mask,(0,100),(0,255,255),(20,20,20),(20,20,20),cv2.FLOODFILL_FIXED_RANGE)

接下來記錄一下這個核心代碼的意思,這個函數一共有7個參數
第一個參數 :要操作的圖片
第二個參數:掩碼層,即要操作的圖片部分
第三個參數:圖片要操作的開始點(寬,高),原點是圖片的左上角。這裏推薦大家使用電腦自帶的繪圖功能,window10的畫圖功能可以自動測得各個像素點的位置。

如:
在這裏插入圖片描述可以清晰的得到圖片的尺寸和選取像素點的位置

第四個參數:填充的顏色,這裏我選擇黃色BGR(0,255,255)

第五個參數:顏色低值
第六個參數:顏色高值

第五第六參數應該放在一起考慮
他的功能是以起始點的顏色矩陣爲參考,泛洪填充顏色的範圍爲 [起始點BGR] - [顏色低值BGR] ~ [起始點BGR] + [顏色高值BGR]

如例子中,泛洪填充對較綠色的區域進行了填充,這是因爲我起始點選擇的綠色,波動範圍也比較小

但是最終的結果值一定在[0,0,0] ~ [255,255,255]之間

第七個參數:標誌位,具體可以參考官方文檔的解釋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章