OpenCV漫水填充函數floodFill函數的使用

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

功能描述

? ? ? ? ffloodFill函數是OpenCV庫中用于圖像處理的一個功能,它用于填充與種子點顏色相近的連通區域。這個函數在很多場景下都非常有用,比如圖像分割、對象填充或改變圖像中某個區域的顏色等。

? ? ? ? 連通性的判斷基于鄰近像素的顏色或亮度接近程度。如果像素位于(x,y)處被認為屬于要重新上色的連通域,需滿足以下條件:

  • 對于灰度圖像和浮動范圍的情況:
    src ( x ′ , y ′ ) ? loDiff ≤ src ( x , y ) ≤ src ( x ′ , y ′ ) + upDiff \texttt{src} (x',y')- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} (x',y')+ \texttt{upDiff} src(x,y)?loDiffsrc(x,y)src(x,y)+upDiff
  • 對于灰度圖像和固定范圍的情況:
    src ( seedPoint . x , seedPoint . y ) ? loDiff ≤ src ( x , y ) ≤ src ( seedPoint . x , seedPoint . y ) + upDiff \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)- \texttt{loDiff} \leq \texttt{src} (x,y) \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)+ \texttt{upDiff} src(seedPoint.x,seedPoint.y)?loDiffsrc(x,y)src(seedPoint.x,seedPoint.y)+upDiff
  • 對于彩色圖像和浮動范圍的情況:
    src ( x ′ , y ′ ) r ? loDiff r ≤ src ( x , y ) r ≤ src ( x ′ , y ′ ) r + upDiff r , \texttt{src} (x',y')_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} (x',y')_r+ \texttt{upDiff} _r, src(x,y)r??loDiffr?src(x,y)r?src(x,y)r?+upDiffr?, src ( x ′ , y ′ ) g ? loDiff g ≤ src ( x , y ) g ≤ src ( x ′ , y ′ ) g + upDiff g \texttt{src} (x',y')_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} (x',y')_g+ \texttt{upDiff} _g src(x,y)g??loDiffg?src(x,y)g?src(x,y)g?+upDiffg?
    并且:
    src ( x ′ , y ′ ) b ? loDiff b ≤ src ( x , y ) b ≤ src ( x ′ , y ′ ) b + upDiff b \texttt{src} (x',y')_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} (x',y')_b+ \texttt{upDiff} _b src(x,y)b??loDiffb?src(x,y)b?src(x,y)b?+upDiffb?
  • 對于彩色圖像和固定范圍的情況:
    src ( seedPoint . x , seedPoint . y ) r ? loDiff r ≤ src ( x , y ) r ≤ src ( seedPoint . x , seedPoint . y ) r + upDiff r , \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r- \texttt{loDiff} _r \leq \texttt{src} (x,y)_r \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_r+ \texttt{upDiff} _r, src(seedPoint.x,seedPoint.y)r??loDiffr?src(x,y)r?src(seedPoint.x,seedPoint.y)r?+upDiffr?, src ( seedPoint . x , seedPoint . y ) g ? loDiff g ≤ src ( x , y ) g ≤ src ( seedPoint . x , seedPoint . y ) g + upDiff g \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g- \texttt{loDiff} _g \leq \texttt{src} (x,y)_g \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_g+ \texttt{upDiff} _g src(seedPoint.x,seedPoint.y)g??loDiffg?src(x,y)g?src(seedPoint.x,seedPoint.y)g?+upDiffg?
    并且:
    src ( seedPoint . x , seedPoint . y ) b ? loDiff b ≤ src ( x , y ) b ≤ src ( seedPoint . x , seedPoint . y ) b + upDiff b \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b- \texttt{loDiff} _b \leq \texttt{src} (x,y)_b \leq \texttt{src} ( \texttt{seedPoint} .x, \texttt{seedPoint} .y)_b+ \texttt{upDiff} _b src(seedPoint.x,seedPoint.y)b??loDiffb?src(x,y)b?src(seedPoint.x,seedPoint.y)b?+upDiffb?
    其中 s r c ( x ′ , y ′ ) src(x',y') src(x,y)是已經被判定屬于該連通組件的某個鄰居像素的值。要被添加到連通組件中,像素的顏色或亮度應該足夠接近:
  • 如果使用浮動范圍,它應該接近其一個已經屬于連通組件的鄰居的顏色或亮度。
  • 如果使用固定范圍,它應該接近種子點的顏色或亮度。

這些函數可用于以下操作:

  • 直接在原圖上用指定的顏色標記一個連通組件。
  • 構建一個掩模,然后提取輪廓。
  • 復制區域到另一個圖像,等等。

函數原型1


int cv::floodFill	
(InputOutputArray 	image,InputOutputArray 	mask,Point 	seedPoint,Scalar 	newVal,Rect * 	rect = 0,Scalar 	loDiff = Scalar(),Scalar 	upDiff = Scalar(),int 	flags = 4 
)		

參數1

  • 參數image:輸入/輸出的1-或3-通道、8位或浮點圖像。除非在函數的第二個變體中設置了FLOODFILL_MASK_ONLY標志,否則該圖像將被函數修改。詳情請見下方說明。
  • 參數mask:操作掩模,應當是一個比圖像寬2像素、高2像素的單通道8位圖像。如果傳遞空的Mat對象,它將被自動創建。由于這是一個輸入和輸出參數,你必須負責初始化它。洪水填充不會跨越輸入掩模中非零像素。例如,邊緣檢測的輸出可以用作掩模,以在邊緣處停止填充。輸出時,掩模中對應于圖像中填充像素的像素將被設置為1或在flags中指定的值,如下文所述。此外,函數會在掩模的邊界填充1,以簡化內部處理。因此,可以在多次調用函數時使用同一掩模,以確保填充的區域不會重疊。
  • 參數seedPoint:填充的起始點。
  • 參數newVal:重繪區域像素的新值。
  • 參數loDiff:當前觀察像素與其屬于同一連通組件的鄰居像素,或加入連通組件的種子像素之間的最大下限亮度/顏色差異。
  • 參數upDiff:當前觀察像素與其屬于同一連通組件的鄰居像素,或加入連通組件的種子像素之間的最大上限亮度/顏色差異。
  • 參數rect:可選的輸出參數,由函數設置為重繪區域的最小邊界矩形。
  • 參數flags:操作標志。前8位包含連通性值。默認值4意味著僅考慮四個最近鄰像素(那些共享邊緣的像素)。連通性值8意味著將考慮八個最近鄰像素(那些共享角落的像素)。接下來的8位(8-16位)包含一個1到255之間的值,用于填充掩模(默認值是1)。例如,4 | ( 255 << 8 )將考慮四個最近鄰并用255填充掩模。以下附加選項占據更高位,因此可以使用按位或(|)與連通性和掩模填充值進一步組合,請參閱FloodFillFlags。

注釋
???????由于掩模比填充的圖像大,圖像中的像素(x,y)對應于掩模中的像素(x+1,y+1)。

另見:

findContours:查找輪廓的函數。

函數原型2


int cv::floodFill	
(InputOutputArray 	image,Point 	seedPoint,Scalar 	newVal,Rect * 	rect = 0,Scalar 	loDiff = Scalar(),Scalar 	upDiff = Scalar(),int 	flags = 4 
)		

參數2

比原型1少了個mask參數,其他參數都一樣。

代碼示例

include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg" );if ( img.empty() ){std::cout << "Could not read the image" << std::endl;return -1;}cv::Point seedPoint( 359, 578 );  // 假設種子點為(359, 578)cv::Scalar newVal( 255, 0, 0 );   // 新的顏色值為藍色cv::Rect roi;int flags = 8;// 進行填充cv::floodFill( img, seedPoint, newVal, &roi, cv::Scalar( 1, 1, 1 ), cv::Scalar( 40, 40, 40 ), 8 );// 顯示結果cv::imshow( "Flood Fill Result", img );cv::waitKey();return 0;
}

運行結果

原圖:
在這里插入圖片描述
運算之后的圖:
藍色部分就是填充的部分,參數loDiff為Scalar(1, 1, 1),upDiff為Scalar(40, 40, 40),表示當前觀測點的像素X與周圍已被填充的像素點數值Y,需滿足X-Y<10,且Y-X<1,才被填充。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45038.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MUR2060CTR-ASEMI無人機專用MUR2060CTR

編輯&#xff1a;ll MUR2060CTR-ASEMI無人機專用MUR2060CTR 型號&#xff1a;MUR2060CTR 品牌&#xff1a;ASEMI 封裝&#xff1a;TO-220 批號&#xff1a;最新 最大平均正向電流&#xff08;IF&#xff09;&#xff1a;20A 最大循環峰值反向電壓&#xff08;VRRM&#…

【數據結構】線性表----隊列詳解

1. 隊列的基本概念 話不多說&#xff0c;直接開始&#xff01; 隊列是一種線性數據結構&#xff0c;同棧類似但又不同&#xff0c;遵循先進先出&#xff08;FIFO, First In First Out&#xff09;的原則。換句話說&#xff0c;最先進入隊列的元素會最先被移除。這樣的特點使得…

小白學python(第七天)

哈哈&#xff0c;這個系列的文章也有一段時間沒更新&#xff0c;主要是最近在忙c嘎嘎&#xff0c;不過沒事接下來會優先更python啦&#xff0c;那么我們先進入正題吧 函數的定義及調用 函數定義 格式&#xff1a;def 函數名&#xff08;形參列表&#xff09;&#xff1a; 語…

QTabWidget、QListWidget、QStackedWidget

The QTabWidget class provides a stack of tabbed widgets. More... The QListWidget class provides an item-based list widget. More... QStringList strlist;strlist<<"系統"<<"外觀"<<"截圖"<<"貼圖"…

.NET MAUI開源架構_4..NET MAUI 應用支持的平臺

可以針對以下平臺編寫 .NET Multi-platform App UI (.NET MAUI) 應用&#xff1a; 需要 Android 5.0 (API 21) 或更高版本。需要 iOS 11 或更高版本使用 Mac Catalyst 的 macOS 11 或更高版本。Windows 11 和 Windows 10 版本 1809 或更高版本&#xff0c;使用 Windows UI 庫 …

Java的高級特性

類的繼承 繼承是從已有的類中派生出新的類&#xff0c;新的類能擁有已有類的屬性和行為&#xff0c;并且可以拓展新的屬性和行為 public class 子類 extends 父類{子類類體 } 優點 代碼的復用 提高編碼效率 易于維護 使類與類產生關聯&#xff0c;是多態的前提 缺點 類缺乏獨…

c/c++ 打印調用棧

打印調用棧可以在程序出現死機的時候&#xff08;如出現 SIGABRT、SIGSEGV等一些信號錯誤&#xff09;是很有用的信息&#xff0c;有可能就不需要 core file 來協助排查問題了。通過 man backtrace 可以得到一個例子的源碼&#xff1a; #define SIZE 100 static void backTrac…

【機器學習-00】機器學習是什么?

在科技飛速發展的今天&#xff0c;機器學習已成為一個熱門話題&#xff0c;廣泛應用于各個行業和領域。那么&#xff0c;機器學習到底是什么&#xff1f;它又是如何工作的&#xff1f;本文將深入探討機器學習的定義、原理及其在各領域的應用&#xff0c;帶領讀者走進這個神秘而…

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心類&#xff0c;它提供了豐富的API來與Redis進行交互。由于Redis是一個鍵值存儲系統&#xff0c;它存儲的是字節序列&#xff0c;因此在使用RedisTemplate時&#xff0c;需要指定鍵&#xff08;Key&#xff09…

力扣題解( 等差數列劃分 II - 子序列)

446. 等差數列劃分 II - 子序列 給你一個整數數組 nums &#xff0c;返回 nums 中所有 等差子序列 的數目。 如果一個序列中 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該序列為等差序列。 例如&#xff0c;[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和…

Netgear WN604 downloadFile.php 信息泄露漏洞復現(CVE-2024-6646)

0x01 產品簡介 NETGEAR WN604是一款由NETGEAR(網件)公司生產的無線接入器(或無線路由器)提供Wi-Fi保護協議(WPA2-PSK, WPA-PSK),以及有線等效加密(WEP)64位、128位和152位支持,保障網絡安全。同時支持MAC地址認證、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全機制,…

Flat Ads:金融APP海外廣告投放素材的優化指南

在當今全球化的數字營銷環境中,金融APP的海外營銷推廣已成為眾多金融機構與開發者最為關注的環節之一。面對不同地域、文化及用戶習慣的挑戰,如何優化廣告素材,以吸引目標受眾的注意并促成有效轉化,成為了廣告主們亟待解決的問題。 作為領先的全球化營銷推廣平臺,Flat Ads憑借…

超簡易高效的 AI繪圖工具—與sd-webui一致界面,6G顯存最高提升75%出圖速率!(附安裝包)

大家好&#xff0c;我是靈魂畫師向陽 今天給大家分享一個基于Stable Diffusion WebUI 構建的AI繪圖工具—sd-webui-forge&#xff0c;該工具的目標在于簡化插件開發&#xff0c;優化資源管理&#xff0c;加速推理。 Forge承諾永遠不會對Stable Diffusion WebUI用戶界面添加不…

獲獎案例回顧|基于衛星遙感和無人機的水稻全流程風險減量項目

引言 在現代農業保險領域&#xff0c;技術創新是推動行業進步的關鍵。珈和科技與太平財險的合作&#xff0c;旨在利用先進的衛星遙感和無人機技術&#xff0c;解決傳統農業保險面臨的諸多挑戰&#xff0c;從而提升保險效率和服務質量。本次分享的項目案例獲得了《金融電子化》…

啟動yarn后,其他節點沒有NodeManager

寫在前面&#xff1a; 這個問題雖然折磨了我兩天&#xff0c;但是原因特別蠢&#xff0c;可能與各位不一定一樣&#xff0c;我是因為ResourceManager的節點的"/etc/hadoop/workers"文件沒有配置好&#xff08;沒有配hadoop102和hadoop104&#xff09;&#xff0c;但排…

數字圖像處理(實踐篇)四十八 PCA主成分分析降維與圖像重建

目錄 一 PCA 二 實踐 實踐① 實踐② 一 PCA 主成分分析(PCA)是一種常見的數據分析技術,它可以用于降維和特征提取。 PCA 的作用包括以下幾個方面: ①數據降維:PCA 可以將高維數據降維到低維空間中,從而方便后續的數據分析和可視化。可以將具有多個變量的數據集降維…

P1850換教室 題解(概率dp)

題目&#xff1a;https://www.luogu.com.cn/problem/P1850 思路&#xff1a; 概率dp,如果要求最小路徑期望&#xff0c;我們要確定的有選了幾節課&#xff0c;申請換了幾節課&#xff0c;最后一節是否申請換課&#xff08;下一次選課要知道上一次選課申請情況&#xff09;。 …

小白學webgl合集-三維數據源和格式

大多數地圖瓦片數據是二維的&#xff0c;三維效果通過渲染和樣式設置實現。主要的三維數據源和格式包括&#xff1a; 1. 3D Tiles (CesiumJS) 3D Tiles 是一種開放標準&#xff0c;用于流式傳輸和可視化大規模三維地理數據。它可以包含各種三維數據&#xff0c;如建筑物、點云…

循環結構(二)——while語句【互三互三】

文章目錄 &#x1f341;引言 &#x1f341;一、語句格式 &#x1f341;二、語句執行過程 &#x1f341;三、格式舉例 &#x1f341;四、例題 &#x1f449;【例1】 &#x1f48e;【示例代碼】 &#x1f449;【例2】 &#x1f680;【方法1】&#xff1a; &#x1f48e…

運維的操作紅線

1. 無工單、郵件的任何操作&#xff0c;嚴禁執行。 2. 工單標題和內容不一致或工單內容超出現場范圍禁止操作。 3. 操作前必須確定資產信息&#xff1a;機柜號、U位、資產號、sn 號、ip。 4. 機柜后門操作設備&#xff0c;必須多次執行第 3 條紅線。 5. 嚴禁操作、觸碰工單指定…