泛洪填充
泛洪填充是很多圖形繪製軟件中常用的填充算法,最熟悉不過就是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()
原圖:
彩色填充之後圖像:
二值圖像的填充:即是對感興趣區域的填充