Opencv之cv2.floodFill演算法詳解
阿新 • • 發佈:2018-11-25
目錄
一、 泛洪演算法——floodFill函式原型
cv2.floodFill(img,mask,seed,newvalue(BGR),(loDiff1,loDiff2,loDiff3),(upDiff1,upDiff2,upDiff3),flag)
- img:為待使用泛洪演算法的影象
- mask:為掩碼層,使用掩碼可以規定是在哪個區域使用該演算法,如果是對於完整影象都要使用,則掩碼層大小為原圖行數+2,列數+2.是一個二維的0矩陣,邊緣一圈會在使用演算法是置為1。而只有對於掩碼層上對應為0的位置才能泛洪,所以掩碼層初始化為0矩陣。【dtype:np.uint8
- seed:為泛洪演算法的種子點,也是根據該點的畫素判斷決定和其相近顏色的畫素點,是否被泛洪處理。
【類似於】
- newvalue:是對於泛洪區域新賦的值(B,G,R)
- (loDiff1,loDiff2,loDiff3):是相對於seed種子點畫素可以往下的畫素值,即seed(B0,G0,R0),泛洪區域下界為(B0-loDiff1,G0-loDiff2,R0-loDiff3)
- (upDiff1,upDiff2,upDiff3):是相對於seed種子點畫素可以往上的畫素值,即seed(B0,G0,R0),泛洪區域上界為(B0+upDiff1,G0+upDiff2,R0+upDiff3)
- flag:為泛洪演算法的處理模式。
- 低八位 控制演算法的連通性,是以seed點為中心,接著判斷周圍的幾個畫素點,再將泛洪區域畫素點周圍的幾個畫素點進行考慮。 一般為4,8;預設為4
- 中間八位 與掩碼層賦值密切相關,一般使用(255<<8)使中間8位全位1,則值為255,也就是掩碼層對應原圖的泛洪區域的部分被由原來的初值0賦值成255,如果中間8位為0,則賦值為1.
- 高八位 由opencv巨集引數指定
- cv2.FLOODFILL_FIXED_RANGE:改變影象,填充newvalue
- cv2.FLOODFILL_MASK_ONLY:不改變原影象,也就是newvalue引數失去作用,而是改變對應區域的掩碼,設為中間八位的值
二、簡單應用
#泛洪填充(彩色影象填充)
import cv2
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) #mask必須行和列都加2,且必須為uint8單通道陣列
#為什麼要加2可以這麼理解:當從0行0列開始泛洪填充掃描時,mask多出來的2可以保證掃描的邊界上的畫素都會被處理
cv.floodFill(copyImg, mask, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color_demo", copyImg)
src = cv.imread('E:/imageload/baboon.jpg')
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
三、應用,結合minareaRect
cv2.floodFill(initial_car,mask,(seed_x,seed_y),(255,0,0),(loDiff,loDiff,loDiff),(upDiff,upDiff,upDiff),flag)
points = []
row,column = mask.shape
for i in range(row):
for j in range(column):
if mask[i][j]==255:
points.append((j,i)) #點應該輸入點座標(列,行)
points = np.asarray(points)
new_rect = cv2.minAreaRect(points)