Python-OpenCV中的圖像處理-形態學轉換

Python-OpenCV中的圖像處理-形態學轉換

  • 形態學轉換
    • 腐蝕
    • 膨脹
    • 開運算
    • 閉運算
    • 形態學梯度
    • 禮帽
    • 黑帽
    • 形態學操作之間的關系
  • 形態學代碼例程

形態學轉換

  • 形態學操作:腐蝕,膨脹,開運算,閉運算,形態學梯度,禮帽,黑帽等
  • 主要涉及函數:cv2.erode(), cv2.dilate(), cv2.morphologyEx()
  • 原理:形態學操作是根據圖像形狀進行的簡單操作。一般情況下對二值化圖像進行的操作。需要輸入兩個參數,一個是原始圖像,第二個被稱為結構化元素或核,它是用來決定操作的性質的。兩個基本的形態學操作是腐蝕和膨脹。他們的變體構成了開運算,閉運算,梯度等。

腐蝕

就像土壤侵蝕一樣,這個操作會把前景物體的邊界腐蝕掉(但是前景仍然是白色)。這是怎么做到的呢?卷積核沿著圖像滑動,如果與卷積核對應的原圖像的所有像素值都是 1,那么中心元素就保持原來的像素值,否則就變為零。這回產生什么影響呢?根據卷積核的大小靠近前景的所有像素都會被腐蝕掉(變為 0),所以前景物體會變小,整幅圖像的白色區域會減少。這對于去除白噪聲很有用,也可以用來斷開兩個連在一塊的物體等。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5,5), np.uint8)
erosion = cv2.erode(img, kernel=kernel, iterations=1)plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(erosion, cv2.COLOR_BGR2RGB)), plt.title('erode'), plt.xticks([]), plt.yticks([])
plt.show()

在這里插入圖片描述

膨脹

與腐蝕相反,與卷積核對應的原圖像的像素值中只要有一個是 1,中心元素的像素值就是 1。所以這個操作會增加圖像中的白色區域(前景)。一般在去噪聲時先用腐蝕再用膨脹。因為腐蝕在去掉白噪聲的同時,也會使前景對象變小。所以我們再對他進行膨脹。這時噪聲已經被去除了,不會再回來了,但是前景還在并會增加。膨脹也可以用來連接兩個分開的物體。

import numpy as np
import cv2
from matplotlib import pyplot as plt# 膨脹
img = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Original_Image.png', cv2.IMREAD_GRAYSCALE)kernel = np.ones((5,5), np.uint8)
dilation = cv2.dilate(img, kernel=kernel, iterations=1)plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(dilation, cv2.COLOR_BGR2RGB)), plt.title('dilate'), plt.xticks([]), plt.yticks([])
plt.show()

在這里插入圖片描述

開運算

先腐蝕再膨脹就叫做開運算。它被用來去除噪聲。這里我們用到的函數是 cv2.morphologyEx()
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

閉運算

先膨脹再腐蝕就叫做閉運算。它經常被用來填充前景物體中的小洞,或者前景物體上的小黑點
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

形態學梯度

其實就是一幅圖像膨脹與腐蝕的差別,結果看上去就像前景物體的輪廓。
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

禮帽

原始圖像與進行開運算之后得到的圖像的差。下面的例子是用一個 9x9 的核進行禮帽操作的結果。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽

進行閉運算之后得到的圖像與原始圖像的差
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

形態學操作之間的關系

形態學轉換

  • Opening:
    dst = open(src, element) = dilate(erode(src, element), element)
  • Closing:
    dst = close(src, element) = erode(dilate(src, element), element)
  • Morphological gradient:
    dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)
  • “Top hat”:
    dst = tophat(src, element) = src - open(src, element)
  • “Black hat”:
    dst = blackhat(src, element) = close(src, element) - src

形態學代碼例程

import numpy as np
import cv2
from matplotlib import pyplot as plt'''
形態學轉換
Opening: dst = open(src, element) = dilate(erode(src, element), element)Closing:dst = close(src, element) = erode(dilate(src, element), element)Morphological gradient:dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)"Top hat":dst = tophat(src, element) = src - open(src, element)"Black hat":dst = blackhat(src, element) = close(src, element) - src
'''# 開運算
# 先進行腐蝕在進行膨脹叫做開運算。用來去除噪音
# opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 閉運算
# 先進行膨脹再進行腐蝕叫做閉運算。用來填充前景物體中的小洞,或者全景上的小黑點。
# closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 形態學梯度
# 就是一副圖像膨脹與腐蝕的差別,結果看上去就像前景物體的輪廓。
# gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 禮帽
# 原始圖像與進行開運算之后得到的圖像的差
# tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)# 黑帽
# 原始圖像與進行閉運算之后得到的圖像的差
# blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 結構化元素
kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))       # 矩形核
kernel_elli = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))    # 橢圓核
kernel_cros = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))      # 十字核# 卷積核
# kernel = kernel_rects
# kernel = kernel_elli
# kernel = kernel_cros
kernel = np.ones((5,5), np.uint8)
kernel9x9 = np.ones((15,15), np.uint8)img_origin = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_COLOR)
img_gray = cv2.imread('./resource/opencv/image/Morphology_1_Tutorial_Theory_Dilation.png', cv2.IMREAD_GRAYSCALE)# 開運算 腐蝕=>膨脹
opening = cv2.morphologyEx(img_gray, cv2.MORPH_OPEN, kernel)# 閉運算 膨脹=>腐蝕
closing = cv2.morphologyEx(img_gray, cv2.MORPH_CLOSE, kernel)# 梯度 膨脹-腐蝕 
gradient = cv2.morphologyEx(img_gray, cv2.MORPH_GRADIENT, kernel)# 禮帽  原始圖像與進行開運算之后得到的圖像的差
tophat = cv2.morphologyEx(img_gray, cv2.MORPH_TOPHAT, kernel9x9)# 黑帽 進行閉運算之后與原始圖像的圖像的差
blackhat = cv2.morphologyEx(img_gray, cv2.MORPH_BLACKHAT, kernel9x9)# 腐蝕
erosion = cv2.erode(img_gray, kernel=kernel, iterations=1)# 膨脹 
dilation = cv2.dilate(img_gray, kernel=kernel, iterations=1)plt.subplot(331), plt.imshow(cv2.cvtColor(img_origin,cv2.COLOR_BGR2RGB), 'gray'), plt.title('origin'), plt.xticks([]), plt.yticks([])
plt.subplot(332), plt.imshow(img_gray, 'gray'), plt.title('gray'), plt.xticks([]), plt.yticks([])
plt.subplot(333), plt.imshow(opening, 'gray'), plt.title('open'), plt.xticks([]), plt.yticks([])
plt.subplot(334), plt.imshow(closing, 'gray'), plt.title('close'), plt.xticks([]), plt.yticks([])
plt.subplot(335), plt.imshow(gradient, 'gray'), plt.title('gradient'), plt.xticks([]), plt.yticks([])
plt.subplot(336), plt.imshow(tophat, 'gray'), plt.title('tophat'), plt.xticks([]), plt.yticks([])
plt.subplot(337), plt.imshow(blackhat, 'gray'), plt.title('blackhat'), plt.xticks([]), plt.yticks([])
plt.subplot(338), plt.imshow(erosion, 'gray'), plt.title('erode'), plt.xticks([]), plt.yticks([])
plt.subplot(339), plt.imshow(dilation, 'gray'), plt.title('dilate'), plt.xticks([]), plt.yticks([])
plt.show()

在這里插入圖片描述

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

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

相關文章

企業微信 企業內部開發 學習筆記

官方文檔 文檔 術語介紹 引入pom <dependency><groupId>com.github.binarywang</groupId><artifactId>wx-java-cp-spring-boot-starter</artifactId><version>4.5.3.B</version></dependency>核心代碼 推送消息 final WxCp…

面試攻略,Java 基礎面試 100 問(十一)

抽象類&#xff08;abstract class&#xff09;和接口&#xff08;interface&#xff09;有什么異同? 抽象類和接口都不能夠實例化&#xff0c;但可以定義抽象類和接口類型的引用。一個類如果繼承了某個抽象類或者實現了某個接口都需要對其中的抽象方法全部進行實現&#xff…

SpringBoot 后端項目利用 Minio 實現分片上傳、斷點續傳

一、準備工作 安裝 Minio 服務后&#xff0c;在 SpringBoot 項目中添加依賴&#xff1a; <!-- MinIO --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency&g…

【js】日期、時間正則匹配

1、日期的正則表達式 格式&#xff1a;2023-08-11 var reg /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/; var regExp new RegExp(reg); if(!regExp.test(value)){alert("日期格式不正確");return; }2、時間的正則表達式 格式&#xff1a;23:00:00…

英碼國產高配邊緣計算盒子上市!搭載TPU處理器BM1684X,適配麒麟系統,支持OTA升級!

隨著人工智能技術不斷深入實際應用場景&#xff0c;加速各行各業場景應用落地&#xff0c;邊緣計算的重要性越發凸顯。相較于傳統的集中式云計算&#xff0c;邊緣計算在距離數據源或用戶更近的地方提供計算能力&#xff0c;不僅滿足了對實時性要求較高的場景應用需求&#xff0…

操作系統結構

操作系統結構 分層法模塊化宏內核微內核微內核的基本概念微內核的基本功能 內核 分層法 分層法是將操作系統分為若干層&#xff0c;最底層為硬件&#xff0c;最高層為用戶接口&#xff0c;每層只能調用緊鄰它的底層的功能和服務&#xff08;單向依賴&#xff09; 分層法的優點…

如何通過CSS選擇器選擇一個元素的子元素?如何選擇第一個子元素和最后一個子元素?

聚沙成塔每天進步一點點 ? 專欄簡介? 選擇一個元素的子元素? 選擇第一個子元素和最后一個子元素? 注意事項? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

線程池,以及線程池的實現以及面試常問的問題,工廠模式,常見的鎖策略(面試常考,要了解,不行就背)

一、&#x1f49b; 線程池的基本介紹 內存池&#xff0c;進程池&#xff0c;連接池&#xff0c;常量池&#xff0c;這些池子概念上都是一樣的&#xff5e;&#xff5e; 如果我們需要頻繁的創建銷毀線程&#xff0c;此時創建銷毀的成本就不能忽視了&#xff0c;因此就可以使用線…

Java中使用instanceof判斷對象類型

記錄&#xff1a;470 場景&#xff1a;Java中使用instanceof判斷對象類型。例如在解析JSON字符串轉換為指定類型時&#xff0c;先判斷類型&#xff0c;再定向轉換。在List<Object>中遍歷Object時&#xff0c;先判斷類型&#xff0c;再定向轉換。 版本&#xff1a;JDK 1…

Redis系列(一):深入了解Redis數據類型和底層數據結構

Redis有以下幾種常用的數據類型&#xff1a; redis數據是如何組織的 為了實現從鍵到值的快速訪問&#xff0c;Redis 使用了一個哈希表來保存所有鍵值對。 Redis全局哈希表&#xff08;Global Hash Table&#xff09;是指在Redis數據庫內部用于存儲所有鍵值對的主要數據結構。…

安卓13不再支持PPTP怎么辦?新的連接解決方案分享

隨著Android 13的發布&#xff0c;我們迎來了一個令人興奮的新品時刻。然而&#xff0c;對于一些用戶而言&#xff0c;這也意味著必須面對一個重要的問題&#xff1a;Android 13不再支持PPTP協議。如果你是一個習慣使用PPTP協議來連接換地址的用戶&#xff0c;那么你可能需要重…

C++ 泛型編程:函數模板

文章目錄 前言一、什么是泛型編程二、函數模板三、函數模板的使用四、多參數函數模板五&#xff0c;示例代碼&#xff1a;總結 前言 當需要編寫通用的代碼以處理不同類型的數據時&#xff0c;C 中的函數模板是一個很有用的工具。函數模板允許我們編寫一個通用的函數定義&#…

Vue day02 Computed和Watch

1.事件綁定 可以用 v-on 指令監聽DOM 事件&#xff0c;并在觸發時運行一些 JavaScript 代碼。v-on 還可以接收一個需要調用的方法名稱。 <button v-on:click"handler">good</button> methods: { handler: function (event) { if (event) { alert(event.t…

接口測試之Jmeter+Ant+Jenkins接口自動化測試平臺

平臺簡介 一個完整的接口自動化測試平臺需要支持接口的自動執行&#xff0c;自動生成測試報告&#xff0c;以及持續集成。Jmeter支持接口的測試&#xff0c;Ant支持自動構建&#xff0c;而Jenkins支持持續集成&#xff0c;所以三者組合在一起可以構成一個功能完善的接口自動化…

BOLT- 識別和優化熱門的基本塊

在BOLT中&#xff0c;識別和優化熱門的基本塊之所以關鍵&#xff0c;是因為BOLT的主要目標是優化程序以更好地利用硬件特性&#xff0c;特別是指令緩存&#xff08;ICache&#xff09;。以下是BOLT如何識別和優化熱門基本塊的流程&#xff1a; 收集性能數據: BOLT開始的時候并不…

idea - 刷新 Git 分支數據 / 命令刷新 Git 分支數據

一、idea - 刷新 Git 分支數據 idea 找到 fetch 選項&#xff0c;重新獲取分支數據 二、命令刷新 Git 分支數據 git fetch參考鏈接 1. 遠程Gitlab新建的分支在IDEA里不顯示

jxls導出問題

![請添加圖片描述](https://img-blog.csdnimg.cn/bc74c4207818491c93b75e19b3333451.png 為什么最后導出的文件還是按原樣導出啊&#xff0c;沒有填充數據 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/d4500b9a98c042f6b64a5d0650071303.png

qt多線程使用方式

有5個方式&#xff1a;可以參考這個博客&#xff1a;Qt 中開啟線程的五種方式_qt 線程_lucky-billy的博客-CSDN博客 注&#xff1a;為了實現更加靈活的線程管理&#xff08;因為這5種都有一些不方便之處&#xff1a;QThread需要子類化且不能傳參&#xff0c;moveToThread不能傳…

【leetcode】459. 重復的子字符串(easy)

給定一個非空的字符串 s &#xff0c;檢查是否可以通過由它的一個子串重復多次構成。 示例 1: 輸入: s “abab” 輸出: true 解釋: 可由子串 “ab” 重復兩次構成。 示例 2: 輸入: s “aba” 輸出: false 示例 3: 輸入: s “abcabcabcabc” 輸出: true 解釋: 可由子串 “ab…

ChatGPT等人工智能編寫文章的內容今后將成為常態

BuzzFeed股價上漲200%可能標志著“轉向人工智能”媒體趨勢的開始。 周四&#xff0c;一份內部備忘錄被華爾街日報透露BuzzFeed正計劃使用ChatGPT聊天機器人-風格文本合成技術來自OpenAI&#xff0c;用于創建個性化盤問和將來可能的其他內容。消息傳出后&#xff0c;BuzzFeed的…