python-opencv圖像分割

文章目錄

    • 二值化
    • 圖像骨骼
    • 連通域分割

二值化

所謂圖像分割,就是將圖像的目標和背景分離開來,更直觀一點,就是把目標涂成白色,背景涂成黑色,言盡于此,是不是恍然大悟:這不就是二值化么?

【threshold]是此前提到的二值化函數,但只講解了固定閾值分割模式,而并未講解其自動分割的OTSU模式。

【adaptiveThreshold】是opencv提供的自適應閾值函數,可根據不同的卷積核來對局部進行二值化,可以更加細致地得到物體邊緣。

OTSU算法,mean核,高斯核的分割結果如下圖所示,其中150是手動設置的分割閾值;100是OTSU自動計算出的分割閾值。

提示說圖像違規,也不知道哪違規了。

代碼如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2path = 'coins.jpg'coins = {}
coins["original"] = plt.imread(path)
coins["gray"] = cv2.cvtColor(coins["original"],cv2.COLOR_RGB2GRAY)_, coins['th150'] = cv2.threshold(coins["gray"], 150, 255, cv2.THRESH_BINARY)
th, bImg = cv2.threshold(coins["gray"], 0, 255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
coins[f'otsu({th})'] = bImgmethod = {"mean":cv2.ADAPTIVE_THRESH_MEAN_C,"gaussian":cv2.ADAPTIVE_THRESH_GAUSSIAN_C}
for key in method:coins[key] = cv2.adaptiveThreshold(coins["gray"], 255,method[key], cv2.THRESH_BINARY, 11, 2)for i,key in enumerate(coins,1):plt.subplot(2,3,i)plt.imshow(coins[key], cmap='gray')plt.title(key)plt.axis('off')plt.show()

圖像骨骼

如果把二值圖像理解成地形,黑色表示海洋,白色表示陸地,那么陸地上任意一點,到海洋都有一個最近的距離,如下圖所示。由于硬幣圖案的顏色并不完全一致,所以在二值化時可能會出現不一致的情況,為此,需要通過腐蝕或者膨脹等形態學處理,將其內部涂抹均勻,從而得到一張目標與背景完全分割的圖像,此即【dilate】圖。對dilate圖而言,【dist-bg】為其黑色區域的骨骼;【dist-fg】為白色區域的骨骼。

在這里插入圖片描述

實現代碼如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2bImg = coins[f'otsu({th})']kernel = np.ones((5,5),np.uint8)
coins["dilate"] = cv2.dilate(coins[f'otsu({th})'], kernel)
coins["dist-fg"] = cv2.distanceTransform(coins["dilate"], cv2.DIST_L2,5)
coins["dist-bg"] = cv2.distanceTransform(255-coins["dilate"], cv2.DIST_L2,5)keys = ['dilate', 'dist-bg', 'dist-fg']
for i,key in enumerate(keys,1):plt.subplot(1,3,i)plt.imshow(coins[key], cmap='gray')plt.title(key)plt.axis('off')plt.show()

【distanceTransform】函數的功能是,計算當前像素點到零像素點的最短距離,其輸入參數有三,分別是輸入的二值圖像;求解距離的類型,以及掩膜尺寸,一般可設為3或者5。

在一張圖像中,兩點之間的距離有多種計算方式,比如

  • a a a 水平和數豎直方向的變化量
  • b b b 對角方向的變化量
  • c c c 條約移動的變化量

距離變換函數綜合了這三種距離,根據各種距離的權重不同,提供了下面幾種不同的距離類別

distanceTypemaskSize參數
CV_DIST_C3 ( 3 × 3 ) (3\times3) (3×3) a = 1 , b = 1 a=1, b=1 a=1,b=1
CV_DIST_L13 ( 3 × 3 ) (3\times3) (3×3) a = 1 , b = 2 a=1, b=2 a=1,b=2
CV_DIST_L23 ( 3 × 3 ) (3\times3) (3×3) a = 0.955 , b = 1.3693 a=0.955, b=1.3693 a=0.955,b=1.3693
CV_DIST_L25 ( 5 × 5 ) (5\times5) (5×5) a = 1 , b = 1.4 , c = 2.1969 a=1, b=1.4, c=2.1969 a=1,b=1.4,c=2.1969

連通域分割

所謂連通域,即Connected Component,是一組彼此相連的像素點的集合,這些像素點彼此之間可以假設一條互相鏈接的路徑,路徑上所有像素的灰度一致,或者符合某個特定的條件。

通過連通域分割,可以將圖像中不同的目標區分開來,為進一步的處理打下基礎,最常用的連通域濾波流程大致如下:圖像灰度化->二值化->形態學處理->標記連通域,其前面的幾個步驟已經在二值化以及距離變換中得以體現,其生成標簽的結果如下圖所示

在這里插入圖片描述

其中,dilate是膨脹二值圖。對其進行連通域分割,得到labels圖像,其中每一枚硬幣所在區域,都被分配到了一個編號,即Label,最后的三維圖,便是這張圖像的標簽值。

處理和繪圖代碼如下

ret, coins["labels"] = cv2.connectedComponents(coins["dilate"])for i,key in enumerate(['dilate', 'labels'],1):plt.subplot(1,3,i)plt.imshow(coins[key], cmap='gray')plt.title(key)plt.axis('off')ax = plt.subplot(133, projection='3d')
ys, xs = np.indices(coins['labels'].shape)
ax.plot_surface(xs, ys, coins['labels'])
plt.title("labels")
plt.show()

【connectedComponents】是opencv提供的連通域分割函數,其必不可少的輸入參數是一個二值圖像,此外還有兩個整型參數,分別用于規定鄰域形式和輸出的Labels類型。其中,鄰域形式主要分為4-鄰域和8鄰域,前者把當前像素的上下左右四個像素算作鄰域,換言之,這四個像素與當前像素是連通的;8-鄰域則將一個像素周圍的8個像素視作鄰域。

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

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

相關文章

香橙派 AIpro 的系統評測

0. 前言 你好,我是悅創。 今天受邀測評 Orange Pi AIpro開發板,我將準備用這個測試簡單的代碼來看看這塊開發版的性能體驗。 分別從:Sysbench、Stress-ng、PyPerformance、RPi.GPIO Benchmark、Geekbench 等方面來測試和分析結果。 下面就…

DevExpress Installed

一、What’s Installed 統一安裝程序將DevExpress控件和庫注冊到Visual Studio中,并安裝DevExpress實用工具、演示應用程序和IDE插件。 Visual Studio工具箱中的DevExpress控件 Visual Studio中的DevExpress菜單 Demo Applications 演示應用程序 Launch the Demo…

Python如何查詢數據庫:深入探索與實踐

Python如何查詢數據庫:深入探索與實踐 在數據驅動的世界中,Python作為一種強大且靈活的語言,自然成為了數據庫查詢的得力助手。本文將通過四個方面、五個方面、六個方面和七個方面,詳細探討Python如何查詢數據庫,并力…

elementary OS 8的新消息

原文:Happy Pride! Have Some Updates! ? elementary Blog 這個月,我們為OS 7帶來了一些意外驚喜,包括GNOME應用的新版本和郵件應用的重大更新。Wayland也來了,我們有了一種新的方式來管理驅動程序,并且我們現在默認…

PS去水印

去除圖片水印 step1:使用套索工具框選圖片水印 step2:CTRLshiftU 去色 step3:CTRLL 色階 step4:使用第三根吸管去點擊需要去掉的圖片水印 成功去掉 去掉文字水印 也可按照上述方法去除

計算機網絡 期末復習(謝希仁版本)第1章

大眾熟知的三大網絡:電信網絡、有線電視網絡、計算機網絡。發展最快起到核心的是計算機網絡。Internet是全球最大、最重要的計算機網絡。互聯網:流行最廣、事實上的標準譯名。互連網:把許多網絡通過一些路由器連接在一起。與網絡相連的計算機…

【多模態】35、TinyLLaVA | 3.1B 的 LMM 模型就可以實現 7B LMM 模型的效果

文章目錄 一、背景二、方法2.1 模型結構2.2 訓練 pipeline 三、模型設置3.1 模型結構3.2 訓練數據3.3 訓練策略3.4 評測 benchmark 四、效果 論文:TinyLLaVA: A Framework of Small-scale Large Multimodal Models 代碼:https://github.com/TinyLLaVA/T…

AcWing 842. 排列數字——算法基礎課題解

AcWing 842. 排列數字 題目描述 給定一個整數 𝑛,將數字 1~𝑛 排成一排,將會有很多種排列方法。 現在,請你按照字典序將所有的排列方法輸出。 輸入格式 共一行,包含一個整數 𝑛。 輸出格…

【Unity性能優化】使用多邊形碰撞器網格太多,性能消耗太大了怎么辦

👨?💻個人主頁:元宇宙-秩沅 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 秩沅 原創 👨?💻 專欄交流🧧&…

【機器學習基礎】Python編程04:五個實用練習題的解析與總結

Python是一種廣泛使用的高級編程語言,它在機器學習領域中的重要性主要體現在以下幾個方面: 簡潔易學:Python語法簡潔清晰,易于學習,使得初學者能夠快速上手機器學習項目。 豐富的庫支持:Python擁有大量的機器學習庫,如scikit-learn、TensorFlow、Keras和PyTorch等,這些…

一道java線程池面試題

線程池面試題 一個線程池的核心線程數為10個,最大線程數為20個,阻塞隊列的容量為30。現在提交45個 任務,每個任務的耗時為500毫秒。 請問:這批任務執行完成總共創建幾個線程? 請問:這批任務執行完成總計需…

快團團有貨源的供貨大團長如何給單個訂單發貨?

快團團團長給單個訂單發貨的步驟如下: 登錄快團團商家后臺:首先,你需要以團長的身份登錄快團團的商家后臺管理系統。 進入訂單管理頁面:登錄后,在后臺導航中找到并點擊“訂單管理”或類似的選項,進入訂單列…

C語言中的#和##操作符用法

C語言中#和##操作符用法 答:在C語言中,#和##是預處理器(preprocessor)的操作符,主要用于宏(macro)的定義中。這兩個操作符提供了字符串化和字符串連接的功能。 #操作符 #操作符用于將其后的宏…

算法人生(19): 從“LangChain的六大組件”看“個人職業規劃”

我們今天要說說和大模型有著密切關系的Langchain ,它提供了一個平臺,讓開發者可以更加輕松地訓練、部署和管理這些大模型。具體來說,Langchain 可以通過提供高性能的計算資源、靈活的模型管理和部署選項、以及豐富的監控和調試功能&#xff0…

Python語言試卷:深入剖析Python編程的精髓

Python語言試卷:深入剖析Python編程的精髓 在編程的世界里,Python以其簡潔、易讀和強大的功能贏得了眾多開發者的青睞。為了全面檢驗大家對Python語言的理解程度,本試卷將從四個方面、五個方面、六個方面和七個方面展開深入剖析,…

企業軟件產品和服務 之 設計保證安全 七項承諾

1. 引言 公司如何保護自己免受數據泄露的影響?標準答案就是: “啟用多因素身份驗證”——MTA(Enable multifactor authentication)。 但是,目前很多公司仍然盲目地只使用密碼作為唯一的身份來源。 網絡安全的核心是…

Python怎么定義類:深入探索與實戰解析

Python怎么定義類:深入探索與實戰解析 在Python編程的廣闊天地中,定義類是一項基礎且至關重要的技能。類作為面向對象編程的核心構造,為我們提供了一種組織和封裝代碼、創建可重用對象的方式。今天,我們將從四個方面、五個方面、…

【分享】兩種方法設置PDF“打開密碼”

想要保護PDF文件的私密性,只允許特定人查看,我們可以給PDF設置“打開密碼”,這樣只有知道密碼的人才可以打開文件。如果小伙伴們不知道如何設置,就一起看看以下兩種方法吧! 方法1:使用PDF編輯器 大部分PD…

Leetcode:羅馬數字轉整數

題目鏈接:13. 羅馬數字轉整數 - 力扣(LeetCode) 普通版本(模擬) 分析:通常情況下,羅馬數字中小的數字在大的數字的右邊。若輸入的字符串滿足該情況,累加每個字符對應的數值即可&am…

HarmonyOS(二十四)——Harmonyos通用事件之觸摸事件

1.觸摸事件。 觸摸事件是HarmonyOS通用事件的一種事件之一,當手指在組件上按下、滑動、抬起時觸發。 名稱是否冒泡功能描述onTouch(event: (event?: TouchEvent) > void)是手指觸摸動作觸發該回調,event返回值見下面TouchEvent介紹。 2. TouchEve…