OpenCV(十二)漫水填充算法
目錄
一、基礎理論
1、概述
2、API
二、實戰
1、黑白圖像填充(python)
1、對內部填充
2、對外部填充
總代碼
?2、彩圖填充(C++)
一、基礎理論
1、概述
????????自動選中了和種子點相連的區域,接著將該區域替換成指定的顏色,這是個非常有用的功能,經常用來標記或者分離圖像的一部分進行處理或分析.漫水填充也可以用來從輸入圖像獲取掩碼區域,掩碼會加速處理過程,或者只處理掩碼指定的像素點。
2、API
python:
cv2.floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
image: 輸入圖片
mask: 掩碼, 比 image 長寬高 2
seedPoint: 泛洪算法的起始點
newVal: 重繪區域的新值 (顏色)
loDiff: seePoint - loDiff 下限
upDiff: seePoint - upDiff 上限
flags: 操作標志符
????????LOODFILL_FIXED_RANGE: 改變圖像, 泛洪填充
????????FLOODFILL_MASK_ONLY: 不改變圖像, 只填充 mask 本身, 忽略新的顏色值參數
cv2.floodFill(img, mask, (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)# 掩碼(長寬=原圖長寬+2) 泛洪算法起點 填充顏色 下限 上限 填充方式
C++:?
int floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )
floodFill(src, Point(10, 10), Scalar(255, 255, 0), &ccomp, Scalar(10, 10, 10), Scalar(10, 10, 10));
// 起始點 顏色 最小邊界矩形 負差最大值 正差最大值
二、實戰
1、黑白圖像填充(python)
1、對內部填充
(注:坐標不固定,根據自己需要確定填充坐標)
# 漫水填充
def flood_fill():# 獲取高寬h, w = img.shape[:2] #即shape[0:2],shape的0~2print(h,w)# 創建掩碼(長、寬必須比原圖大2)mask = np.zeros([h+2, w+2], np.uint8)# 漫水填充(泛洪)cv2.floodFill(img, mask, (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)# 掩碼(長寬=原圖長寬+2) 泛洪算法起點 填充顏色 下限 上限 填充方式# 圖片展示cv2.imshow("flood_fill", img)
?
2、對外部填充
只需要把填充的坐標由(100, 200)修改成(200, 200)即可完成填充。
(注:坐標不固定,根據自己需要確定填充坐標)
cv2.floodFill(img, mask, (200, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
?
?再修改坐標,把小塊填充上:
cv2.floodFill(img, mask, (200, 320), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)
總代碼
# 漫水填充(泛洪)
import numpy as np
import cv2# 漫水填充
def flood_fill():# 獲取高寬h, w = img.shape[:2] #即shape[0:2],shape的0~2print(h,w)# 創建掩碼(長、寬必須比原圖大2)mask = np.zeros([h+2, w+2], np.uint8)# 漫水填充(泛洪)# cv2.floodFill(img, mask, (100, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)# cv2.floodFill(img, mask, (200, 200), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)cv2.floodFill(img, mask, (200, 320), (255, 0, 0), (30, 30, 30), (50, 50, 50), cv2.FLOODFILL_FIXED_RANGE)# 掩碼(長寬=原圖長寬+2) 泛洪算法起點 填充顏色 下限 上限 填充方式# 圖片展示cv2.imshow("flood_fill", img)if __name__ == "__main__":# 讀取圖片img = cv2.imread("Resource/test8.jpg")cv2.imshow('img', img)# 獲取泛洪圖像flood_fill = flood_fill()cv2.waitKey(0)
?2、彩圖填充(C++)
//漫水填充
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat src;//圖像初始化
void Image_Init()
{src = imread("Resource/test.jpg"); //讀取if (src.empty()){printf("could not load the picture...");}
}int main()
{Image_Init(); //圖像初始化imshow("原圖", src);Rect ccomp;floodFill(src, Point(10, 10), Scalar(255, 255, 0), &ccomp, Scalar(10, 10, 10), Scalar(10, 10, 10));// 起始點 顏色 最小邊界矩形 負差最大值 正差最大值imshow("填充圖", src);waitKey(0);return 0;
}
效果
參考資料
https://iamarookie.blog.csdn.net/article/details/119089829
總結
以上是生活随笔為你收集整理的OpenCV(十二)漫水填充算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法(8-2)有序表查找(折半
- 下一篇: OpenCV(十四)图像阈值