目錄
一 漫水填充算法--FloodFill
二 涉及的函數
三 實踐
一 漫水填充算法--FloodFill
FloodFill漫水填充算法就是選中與種子點相連接的區域,利用指定顏色進行區域顏色填充。可以通過設置連通方式或像素的范圍控制填充的效果。通常是用來標記或者分離圖像的一部分,以便做進一步分析和處理。
二 涉及的函數
cv2.floodFill()函數原型如下:
cv2.floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
輸入:
①image:【輸入/輸出】1或者3通道、 8bit或者浮點圖像。僅當參數flags的FLOODFILL_MASK_ONLY標志位被設置時image不會被修改,否則的話,image會被修改。
②mask:【輸入/輸出】 操作掩碼,必須為單通道、8bit,且比原圖image寬、高多2個像素。使用前必須先初始化。只有對于掩碼層上對應為0的位置才能泛洪,所以掩碼層初始化為0矩陣。
③seedPoint:漫水填充的種子點,起始像素點。根據該點的像素判斷決定和其相近顏色的像素點,是否被泛洪處理。
④newVal:被填充的像素點的新像素值(B,G,R)。
⑤loDiff:(loDiff1,loDiff2,loDiff3),添加進種子點區域條件的下界差值。例如,seed(B0,G0,R0),泛洪區域下界為(B0-loDiff1,G0-loDiff2,R0-loDiff3)。
⑥upDiff:(upDiff1,upDiff2,upDiff3),添加進種子點區域條件的上界差值。例如,seed(B0,G0,R0),泛洪區域上界為(B0+upDiff1,G0+upDiff2,R0+upDiff3)。
⑦flag:為泛洪算法的處理模式。
當為CV_FLOODFILL_FIXED_RANGE時,待處理的像素點與種子點作比較,在范圍之內,則填充此像素 。 改變圖像,填充newvalue。 ?????
當為CV_FLOODFILL_MASK_ONLY?時,函數不填充原始圖像iamge,而是填充掩碼圖像。不改變原圖像,也就是newvalue參數失去作用,而是改變對應區域的掩碼。
返回:
①image:【輸入/輸出】
②mask:【輸入/輸出】 操作掩碼。
三 實踐
實踐①:不同的seedPoint
- 代碼
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path)h, w = im.shape[:2]im1 = im.copy()im2 = im.copy()im3 = im.copy()im4 = im.copy()im5 = im.copy()mask1 = np.zeros([h+2, w+2], np.uint8)mask2 = np.zeros([h+2, w+2], np.uint8)mask3 = np.zeros([h+2, w+2], np.uint8)mask4 = np.zeros([h+2, w+2], np.uint8)mask5 = np.zeros([h+2, w+2], np.uint8)cv2.floodFill(im1, mask1, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im2, mask2, (90, 80), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im3, mask3, (100, 150), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im4, mask4, (180, 180), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im5, mask5, (200, 190), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)fig = plt.figure(figsize=(10, 10))im = dealImg(im)im1 = dealImg(im1)im2 = dealImg(im2)im3 = dealImg(im3)im4 = dealImg(im4)im5 = dealImg(im5)titles = ["img", "seedPoint=(20, 20)", "seedPoint=(40, 40)", "seedPoint=(60, 70)", "seedPoint=(100, 150)", "seedPoint=(200, 190)"]images = [im, im1, im2, im3, im4, im5]for i in range(6):plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("4.jpeg")pass
- 效果圖
實踐②:指定位置的填充
- 代碼
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):b, g, r = cv2.split(img)img_rgb = cv2.merge([r, g, b])return img_rgb
def dealImageResult(img_path):im = cv2.imread(img_path)h, w = im.shape[:2]print(h, w)im1 = im.copy()im2 = im.copy()im3 = im.copy()mask1 = np.ones([h+2, w+2], np.uint8)mask1[0:100, 0:100] = 0mask2 = np.ones([h+2, w+2], np.uint8)mask2[0:200, 0:200] = 0mask3 = np.ones([h+2, w+2], np.uint8)mask3[0:w, 0:h] = 0cv2.floodFill(im1, mask1, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im2, mask2, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(im3, mask3, (20, 20), (255, 255, 0), (100, 100, 50), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)fig = plt.figure(figsize=(10, 10))im = dealImg(im)im1 = dealImg(im1)im2 = dealImg(im2)im3 = dealImg(im3)titles = ["img", "mask1_result", "mask2_result", "mask3_result"]images = [im, im1, im2, im3]for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")plt.title("{}".format(titles[i]), fontsize=20, ha='center')plt.xticks([]), plt.yticks([])# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)# plt.tight_layout()plt.show()fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':dealImageResult("4.jpeg")pass
- 效果圖
前文回顧
?入門篇目錄
?數字圖像處理(入門篇)一 圖像的數字化與表示
?數字圖像處理(入門篇)二 顏色空間
?數字圖像處理(入門篇)三 灰度化
?數字圖像處理(入門篇)四 像素關系
?數字圖像處理(入門篇)五 圖像數據預處理之顏色空間轉換
?數字圖像處理(入門篇)六 圖像數據預處理之坐標變化
?數字圖像處理(入門篇)七 圖像數據預處理之灰度變化
?數字圖像處理(入門篇)八 圖像數據預處理之直方圖
?數字圖像處理(入門篇)九 圖像數據預處理之濾波
?數字圖像處理(入門篇)十 邊緣檢測
?數字圖像處理(入門篇)十一 形態學處理
?數字圖像處理(入門篇)十二 自適應閾值分割
?數字圖像處理(入門篇)十三 仿射變換
?數字圖像處理(入門篇)十四 透視變換
實踐篇目錄
數字圖像處理(實踐篇)一 將圖像中的指定目標用bBox框起來吧!
數字圖像處理(實踐篇)二 畫出圖像中目標的輪廓
數字圖像處理(實踐篇)三 將兩張圖像按照指定比例融合
數字圖像處理(實踐篇)四 圖像拼接-基于SIFT特征點和RANSAC方法
數字圖像處理(實踐篇)五 使用Grabcut算法進行物體分割
數字圖像處理(實踐篇)六 利用hough變換進行直線檢測
數字圖像處理(實踐篇)七 利用霍夫變換進行圓環檢測
數字圖像處理(實踐篇)八 Harris角點檢測
數字圖像處理(實踐篇)九 基于邊緣的模板匹配
數字圖像處理(實踐篇)十 圖像質量檢測
數字圖像處理(實踐篇)十一 圖像中的條形碼解析
數字圖像處理(實踐篇)十二 基于小波變換的圖像降噪
數字圖像處理(實踐篇)十三 數據增強之給圖像添加噪聲!
數字圖像處理(實踐篇)十四 圖像金字塔
數字圖像處理(實踐篇)十五 基于傅里葉變換的高通濾波和低通濾波
數字圖像處理(實踐篇)十六 基于分水嶺算法的圖像分割
數字圖像處理(實踐篇)十七 Shi-Tomasi 角點檢測
數字圖像處理(實踐篇)十八 人臉檢測