數字圖像處理(實踐篇)十九 漫水填充

目錄

一 漫水填充算法--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 角點檢測

數字圖像處理(實踐篇)十八 人臉檢測

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

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

相關文章

進程地址空間

引入地址空間 靜態變量和棧空間變量 靜態變量默認是被初始化的 存放在初始化和為初始化空間中 static已經變成了全局變量 命令行參數和環境變量的增長方向 這里觀察的是命令行參數和環境變量的地址 觀察命令行和環境變量表的地址 進程地址空間 如果他們是同一塊兒空間&am…

Ubuntu22.04 交叉編譯fdk-aac for Rv1106

一、下載fdk-aac git clone https://github.com/mstorsjo/fdk-aac.git 二、編譯 mkdir build cd buildcmake -DCMAKE_CXX_COMPILER/opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g -DCMAKE_C_COMPILER/opt/arm-rockchip830-linux-…

軟件測試——集成測試

集成測試是在單元測試之后,將各個獨立單元(通常是已經通過單元測試的模塊或組件)組合在一起,測試它們在一起協同工作的過程。以下是進行集成測試的一般步驟和最佳實踐: 1. 明確定義集成測試的目標 確定集成測試的目標…

麒麟v10 數據盤初始化 gpt分區

麒麟v10 數據盤初始化 gpt分區 1、查看磁盤 lsblk2 、分區 parted2.1、 設置磁盤分區形式2.2、 設置磁盤的計量單位為磁柱2.3、 分區2.4、 查看分區 3、分區格式化4、 掛載磁盤4.1、新建掛載目錄4.2、掛載磁盤4.3、查看掛載結果 5、設置開機自動掛載磁盤分區5.1、 查詢磁盤分區…

ClamAV開源病毒庫使用例子

ClamAV是一個開源的反病毒引擎,用于檢測惡意軟件和病毒。ClamAV提供了一個名為cl_scanfile的函數,用于掃描單個文件是否包含病毒。以下是一個使用cl_scanfile函數的示例代碼: 首先,確保已經安裝了ClamAV庫。在Debian/Ubuntu系統中…

用AI來糾正錯別字和修飾文字

▲ 搜索“大龍談智能內容”關注GongZongHao▲ 在使用谷歌翻譯或百度翻譯將英語翻譯成中文時,有些句子讀起來不太流暢。我嘗試使用AI來幫助我修改翻譯后的中文,希望能讓句子更符合中文習慣。 使用百度文心一言嘗試一下。 文心一言的鏈接是這個&#x…

VUE3給table的head添加popover篩選、時間去除時分秒、字符串替換某字符

1. VUE3給table的head添加popover篩選 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…

RHEL/CentOS的firewalld防火墻服務配置

從 RHEL/CentOS 7開始&#xff0c;使用新的防火墻服務——firewalld。這里介紹該防火墻服務的基本用法 一、防火墻服務管理&#xff1a;從 RHEL/CentOS 7開始采用Systemd作為新的系統管理器&#xff0c;而systemctl則是Systemd中用于管理服務的命令 # 啟動防火墻服務 systemct…

谷歌Gemini剛發就惹質疑:測試標準有失偏頗,效果視頻疑似剪輯

夢晨 克雷西 發自 凹非寺 量子位 | 公眾號 QbitAI 谷歌憋了許久的大招&#xff0c;雙子座Gemini大模型終于發布&#xff01;其中一圖一視頻最引人注目&#xff1a; 一圖&#xff0c;MMLU多任務語言理解數據集測試&#xff0c;Gemini Ultra不光超越GPT-4&#xff0c;甚至超越了…

OpenGL學習資料

1.學習網站 Song Ho Ahn LearnOpenGL GAMES101:現代計算機圖形學入門 OpenGL 官網 2.書籍 Fundamentals of computer graphics OpenGL ES 3.0編程指南 計算機圖形學(OpenGL版)第3版 3.參考的一些文章 顏色緩沖區 深度緩沖 VBO&#xff0c;VAO和EBO詳解 深入探索透視投影變…

實戰干貨!基于ERNIE Bot SDK的數字詩人聊天開發教程

隨著人工智能技術的不斷迭代發展&#xff0c;數字人的開發與應用需求也與日俱增&#xff0c;并且隨著大語言模型的發展&#xff0c;數字人也更智能&#xff0c;從最初的語音預制到現在的實時交流&#xff0c;目前已在很多場景都有廣泛應用。 虛擬客服&#xff1a;數字人可以通…

Mysql自動備份腳本(本地備份、遠程備份、刪除冗余備份)

Mysql自動備份腳本&#xff08;本地備份、遠程備份、刪除冗余備份&#xff09; 1. 腳本功能 自動備份mysql數據到服務器上&#xff0c;可以通過linux的 crontab定義備份周期。 自動刪除七天前的備份數據。 2. 腳本內容 #!/bin/bash # auth Eric source /etc/profile # 設…

【EMNLP 2023】基于知識遷移的跨語言機器閱讀理解算法

近日&#xff0c;阿里云人工智能平臺PAI與華南理工大學朱金輝教授團隊、達摩院自然語言處理團隊合作在自然語言處理頂級會議EMNLP2023上發表基于機器翻譯增加的跨語言機器閱讀理解算法X-STA。通過利用一個注意力機制的教師來將源語言的答案轉移到目標語言的答案輸出空間&#x…

計算機網絡高頻面試八股文

目錄&#xff1a; 網絡分層結構三次握手兩次握手可以嗎&#xff1f;四次揮手第四次揮手為什么要等待2MSL&#xff1f;為什么是四次揮手&#xff1f;TCP有哪些特點&#xff1f;說說TCP報文首部有哪些字段&#xff0c;其作用又分別是什么&#xff1f;TCP和UDP的區別&#xff1f;…

套接字應用程序

這章節是關于實現 lib_chan 庫的 。 lib_chan 的代碼在 TCP/IP 之上實現了一個完整的網絡層&#xff0c;能夠提供認證和Erlang 數據流功能。一旦理解了 lib_chan 的原理&#xff0c;就能量身定制我們自己的通信基礎結構&#xff0c;并把它疊加在TCP/IP 之上了。 就lib_chan 本身…

MMLM之Gemini:《Introducing Gemini: our largest and most capable AI model》的翻譯與解讀

MMLM之Gemini&#xff1a;《Introducing Gemini: our largest and most capable AI model》的翻譯與解讀 導讀&#xff1a;2023年12月6日&#xff0c;Google重磅發布大規模多模態模型Gemini&#xff0c;表示了Google語言模型發展到了一個新階段&#xff0c;其多模態和通用能力明…

中斷、異常和系統調用(2-1,2-2,2-3)

2-1 課堂練習2.1&#xff1a;外部中斷 本實訓分析 Linux 0.11 對外部中斷的響應和處理過程。在每條指令執行的末尾&#xff0c;如果沒有關中斷&#xff0c;CPU 會檢查是否收到了外部中斷信號&#xff0c;如果有信號&#xff0c;則 CPU 就切換到核心態去執行對應的中斷處理程序…

Android 獲取進程名稱

Android 獲取進程名稱 本篇文章主要獲取下當前應用的進程名稱,具體代碼如下: public static String getProcessNameDevice(final Context context) {int myPid Process.myPid();if (context null || myPid < 0) {return "";}ActivityManager.RunningAppProces…

DHTMLX Scheduler PRO 6.0.5 Crack

功能豐富的 JavaScript調度程序 DHTMLX Scheduler 是一個 JavaScript 日程安排日歷&#xff0c;具有 10 個視圖和可定制的界面&#xff0c;用于開發任何類型的日程安排應用程序。 DHTMLX JS 調度程序庫的主要特性 我們的 JS 調度程序最需要的功能之一是時間軸視圖。借助時間軸…

vue-loader是如何工作的?

什么是單文件組件&#xff1f; 單文件組件是一種將模板、腳本和樣式封裝在一個 .vue 文件中的方式 例如&#xff1a; <template><div class"example">{{ msg }}</div> </template> <script>export default {data() {return {msg: &qu…