【OpenCV3.3+Python3.6】泛洪填充

泛洪填充

泛洪填充是很多圖形繪製軟件中常用的填充算法,最熟悉不過就是windows paint的油漆桶功能。算法的原理很簡單,就是從一個點

開始附近像素點,填充成新的顏色,直到封閉區域內的所有像素點都被填充新顏色爲止。泛洪填充實現最常見有四鄰域像素填充

法,八鄰域像素填充法,基於掃描線的像素填充方法。根據實現又可以分爲遞歸與非遞歸(基於棧)。
 

 原理:從一個點開始遍歷附近的像素點,填充成新的顏色, 知道封閉區域內所有的像素點都被填充成新顏色爲止。

 

代碼

import cv2
import numpy as np


def fill_color_demo(image):#彩色圖像填充
    copyImg=image.copy()
    h,w,ch=image.shape
    mask=np.zeros([h+2,w+2],np.uint8)    #生成一個矩形形狀,比上面圖片的長寬各大2個像素
    #np.zeros返回來一個給定形狀和類型的用0填充的數組;
    #zeros(shape, dtype=float, order=‘C’)
    # shape:形狀
    # dtype:數據類型,可選參數,默認numpy.float64
    # order:可選參數,c代表與c語言類似,行優先;F代表列優先
    cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
    # 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:爲泛洪算法的處理模式。
    #   cv2.FLOODFILL_FIXED_RANGE:改變圖像,填充newvalue
    #   cv2.FLOODFILL_MASK_ONLY:不改變原圖像,也就是newvalue參數失去作用,而是改變對應區域的掩碼,設爲中間八位的
    # cv2.imshow("color_demo",copyImg)

def fill_binary():#二值圖像填充
    image=np.zeros([400, 400, 3],np.uint8)  #創建400*400 的3個通道的彩色圖像  3*8=24位圖像
    image[100:300, 100:300, :]= 255  #設置豎向100-300,橫向100-300的區域都賦值爲255
    cv2.imshow("fill_binary",image)

print("------HELLO PYTHON-------")
src=cv2.imread("dwaii.png")  #讀取圖片
cv2.imshow("src",src)     #顯示原圖

print("------IMAGE FILL-------")
fill_color_demo(src)
fill_binary()
cv2.waitKey(0)
cv2.destroyAllWindows()

原圖:

 

彩色填充之後圖像:

 

二值圖像的填充:即是對感興趣區域的填充

 

 

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