ROI(Range Of Interest)與泛洪填充
python+opencv3.3視頻教學 基礎入門筆記(賈志剛老師)
https://www.bilibili.com/video/av24998616/?p=8
ROI(Range Of Interest 感興趣區域)
numpy獲取ROI 指定寬高的起始結束位置
src1 = cv.imread('1.jpg') # cv.namedWindow('src1',cv.WINDOW_AUTOSIZE) cv.imshow('src1',src1) face = src1[180:335 ,470:570] #row-指定高范圍180px-335px width-指定寬范圍470px-570px gray = cv.cvtColor(face,cv.COLOR_BGR2GRAY) #將face一塊的圖像轉為灰度圖(單通道) backface = cv.cvtColor(gray,cv.COLOR_GRAY2BGR) #再將灰度圖轉為BRG圖(3通道) src1[180:335 ,470:570] = backface cv.imshow('face',src1) print(src1.shape)
泛洪填充(漫水填充)
是一種用特定的顏色填充聯通區域的方法,通過設置可連通像素的上下限以及連通方式來達到不同的填充效果的方法。
泛洪填充經常被用來標記或分離圖像的一部分以便對其進行進一步處理或分析,也可以用來從輸入圖像獲取掩碼區域,掩碼會加速處理過程,或只處理掩碼指定的像素點,操作的結果總是某個連續的區域。
def fill_color_demo(img): copyImg = img.copy() h,w = copyImg.shape[:2] #記住:遮罩mask 要在img的h w 之上加2,基於opencv掃描算法 ##mask必須行和列都加2,且必須為uint8單通道陣列---當從0行0列開始泛洪填充掃描時,mask多出來的2可以保證掃描的邊界上的像素都會被處理 mask = np.zeros([h+2,w+2],np.uint8) #floodFill(image, mask, seedPoint, newVal, flags=None) #種子點(200,500)、填充顏色(0,255,255)、填充區域最低(170,320,100) 最高范圍(360,580,30) cv.floodFill(copyImg,mask,(256,256),(0,0,255),(100,100,100),(50,50,50),cv.FLOODFILL_FIXED_RANGE) cv.imshow('fill_color_demo',copyImg)
cv.floodFill(image, mask, (430, 430), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE) -> retval, image, mask, rect
cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)
以上兩個函數的前三個參數:
1-image:為需要進行洪泛處理的圖片;
2-mask:表示為掩圖,其作用見對上述矩形的處理;
3-(430, 430)或(200, 200):表示種子數據,即選中的像素點位置;
4-(0, 255, 255)或(100, 2, 255):表示填充的顏色;
5-(100, 100, 100)與 (50, 50, 50):表示低、高的三通道范圍。例如第一個函數中, (430, 430)這個位置的像素點(x,y,z),即像素范圍在(x-100,y-100,z-100)到(x+50,y+50,z+50)全部被填充。
6-cv.FLOODFILL_FIXED_RANGE:泛洪填充,改變圖像;
cv.FLOODFILL_MASK_ONLY:不改變圖像,只填充掩遮罩本身。
def fill_binary(): image = np.zeros([400,400,3],np.uint8) image[100:300,100:300,:] = 255 #高100-300 寬100-300 區域的3個通道BRG設置為255 cv.imshow('before_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),loDiff=cv.FLOODFILL_MASK_ONLY) cv.imshow('after_filled_binary',image)
注意:
1.個人認為,不管是FLOODFILL_FIXED_RANGE還是FLOODFILL_MASK_ONLY操作,泛洪填充都不會填充掩膜mask的非零像素區域
2. mask[101:301, 101:301] = 0 這條語句為什么是101:301而不是100:300呢?我覺得應該是掩膜mask是比原圖像左右上下都多了1,所以掩膜mask左右一共比原圖像多2,上下也比原圖像多2。
那么原圖像的100就自然對應到掩膜的101,同樣原圖像的300就自然對應到掩膜的301。
3.當FLOODFILL_MASK_ONLY設置了的時候,原圖不會改變,只會用中間八位的值填充mask。 floodFill的flags參數的中間八位的值就是用於指定填充掩碼圖像的值的,但是如果flags中間八位的值為0,則掩碼會用1來填充。