距離上一次更新隔了好多天,具體原因是一直在調試骨架識別的程序,但是最終還是沒有弄明白。於是乎,今天開始繼續學習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]之間
第七個參數:標誌位,具體可以參考官方文檔的解釋