【形態學變換】——圖像預處理(OpenCV)

目錄

1 核

2 腐蝕

3 膨脹

4 開運算

5 閉運算

6 禮帽運算

7 黑帽運算

8 形態學梯度


形態學變換是一種基于形狀的簡單變換,處理對象是二值化后的圖像。有兩個輸入:原圖像和核,一個輸出:形態學變換后的圖像。基本操作有以下四種。

1 核

核就是一個小區域,通常為3*3、5*5、7*7大小,比如矩形結構、橢圓結構、十字形結構,如下圖所示:

2 腐蝕

核在原圖(二值化后的圖像)上進行從上到下,從左到右的滑動。在滑動過程中,令核值為1的區域與該被核覆蓋的對應區域進行相乘,得到最小值,就是卷積核覆蓋區域中心像素點的新像素值。簡單記憶就是只要被覆蓋區域有黑色(像素值為0),那么該區域的中心像素值必定為黑色。經過腐蝕之后變“瘦”了。

通過這樣的遍歷方式,腐蝕操作能夠逐步收縮目標物體邊界,消除孤立的噪聲像素以及細化連續的前景區域。

總結:二值圖腐蝕后白色像素(非0)變少了

案例:

import cv2 as cv
import numpy as nplong = cv.imread("./images/long.png")
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 腐蝕操作:cv2.erode(img,kernel,iterations=1)iterations:迭代次數,默認值為1
dst_erode = cv.erode(long,kernel=kernel,iterations=1)
cv.imshow("long",long)
cv.imshow("dst_erode",dst_erode)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

3 膨脹

核在滑動過程中,令核值為1的區域與被覆蓋的對應區域進行相乘,得到最大值就是被覆蓋區域中心像素點的新像素值。簡單記憶就是,只要有白色(像素值為255),那么區域的中心像素點必為白色(255)。經過膨脹之后變“胖”了。

膨脹能逐步擴大物體的邊界,連接斷裂的前景部分,并填充內部空洞,使物體輪廓更加明顯且連續。

總結:二值化膨脹后白色像素變多了。

案例:

import cv2 as cv
import numpy as nplong = cv.imread("./images/long.png")
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 膨脹操作:cv2.dilate(img,kernel,iterations)
dst_dilate = cv.dilate(long,kernel=kernel,iterations=2)
cv.imshow("long",long)
cv.imshow("dst_dilate",dst_dilate)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

4 開運算

先腐蝕后膨脹,作用:分離物體,消除小區域。特點:消除噪聲,去除小的干擾塊,而不影響原來的圖像

案例:

import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 開運算(先腐蝕,后膨脹)
opening = cv.morphologyEx(car,cv.MORPH_OPEN,kernel)
cv.imshow("car",car)
cv.imshow("opening",opening)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

5 閉運算

先膨脹后腐蝕,作用:消除/閉合物體里面的孔洞。特點:可以填充閉合區域。

案例:

import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 閉運算(先膨脹,后腐蝕)
closing = cv.morphologyEx(car,cv.MORPH_CLOSE,kernel)
cv.imshow("car",car)
cv.imshow("closing",closing)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

6 禮帽運算

原圖像與開運算結果圖之差。作用:用來分離比鄰近點亮一些的斑塊。

案例:

import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 禮帽運算(原圖和開運算的差):cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
tophat = cv.morphologyEx(car,cv.MORPH_TOPHAT,kernel)
cv.imshow("car",car)
cv.imshow("tophat",tophat)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

7 黑帽運算

原圖與“閉運算”的結果圖只差。作用:用來分離比鄰近點暗一些的斑塊。

案例:

import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 黑帽運算(閉運算和原圖之間的差):cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
blackhat = cv.morphologyEx(car,cv.MORPH_BLACKHAT,kernel)
cv.imshow("car",car)
cv.imshow("blackhat",blackhat)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

8 形態學梯度

形態學梯度是一個基于結構元素的圖像處理方法,它通過比較原圖像與膨脹圖和腐蝕圖之間的差異來突出圖像邊緣特征。 對于圖像中的每個像素點,其形態學梯度值是該像素點在膨脹后的圖像值與其在腐蝕后的圖像值之差

作用:強化圖像的邊緣信息,并且對噪聲有一定的抑制作用

案例:

import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定義一個5x5的卷積核
kernel = np.ones((5,5),np.uint8)
# 形態學梯度(膨脹和腐蝕的差):cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)
gradient = cv.morphologyEx(car,cv.MORPH_GRADIENT,kernel)
cv.imshow("car",car)
cv.imshow("gradient",gradient)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

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

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

相關文章

一次“非法指令”(SIGILL)問題的完整調試過程:CPU指令集兼容性探秘

一次"非法指令"問題的完整調試過程:CPU指令集兼容性探秘一、問題概述二、問題現象與初步分析1. 環境與現象2. 官方文檔的線索3. 重現問題4. 懷疑方向:CPU指令兼容性5. 關鍵發現:AVX512指令三、詳細調試過程1. 搭建調試環境 (KVM虛擬…

Node.js - 創建 Express 項目

創建 Express 項目 安裝 npm i -g express-generatorornpm i -g express-generator4# 注意:Windows有可能碰到提示:npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1,因為在此系統上禁止運行腳本。 # 如果碰到這個錯誤,需要…

高并發系統設計面試題

高并發系統設計面試題🔥🔥🔥 超高頻問題(幾乎必問)讓你設計一個秒殺系統,你會考慮哪些問題?如果你的業務量突然提升100倍QPS你會怎么做?庫存扣減如何避免超賣和少賣?訂單…

【通識】如何看電路圖

1. 電路圖 1.1 基礎概念 電路圖即電原理圖。 電路圖第一種是說明模擬電子電路工作原理,用圖形符號表示電阻器、電容器、開關、晶體管等實物,用線條把元器件和單元電路按工作原理的關系連接起來。 第二種則是說明數字電子電路工作原理的。用圖形符號表示…

SpringBoot實戰指南:從快速入門到生產級部署(2025最新版)

一、為什么SpringBoot依然是Java開發的首選? SpringBoot自2014年發布以來,已成為Java企業級開發的事實標準框架。根據2025年最新調研數據顯示,全球78%的Java微服務項目基于SpringBoot構建,其核心優勢在于: 約定優于配置…

新房裝修是中央空調還是壁掛空調好?

這個要看戶型和投資金額,大戶型空間適合裝中央空調,因為空間大有足夠的地方安裝,功率也可以根據面積大小進行配置,整體配置一個外機就行了,整體的裝修效果比較規整,就是多花點,使用成本也稍高點…

如何理解泊松分布

文章目錄一、引例——鯨魚研究二、泊松分布一、引例——鯨魚研究 有生態學家對生活在北冰洋水域的鯨魚進行了跟蹤研究,他們利用一臺水下無人機來探測鯨魚數量,這是近十天的數據: 第1天第2天第3天第4天第5天第6天第7天第8天第9天第10天10101…

python學習DAY22打卡

作業: 自行學習參考如何使用kaggle平臺,寫下使用注意點,并對下述比賽提交代碼 kaggle泰坦尼克號人員生還預測 import warnings warnings.filterwarnings("ignore") #忽略警告信息 # 數據處理清洗包 import pandas as pd import …

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中設置 RGP 表的技巧,以優化仿真精度和效率。挑戰在計算流體動力學 (CFD) 領域,RGP(真實氣體屬性)表對于準確模擬流體在不同條件下的行為至關重要。這些表格提供了詳細的熱力學屬性&a…

C語言————原碼 補碼 反碼 (日漸清晰版)

本文的內容通下面這篇文章有著緊密的聯系,讀者可以選擇性閱讀 C語言————二、八、十、十六進制的相互轉換-CSDN博客 目錄 基本概念 原碼 反碼 補碼 轉換 數據的存儲方式 基本存儲單位 數據的計算方式 補碼的模運算原理 移位操作符 左移操作符 右移操…

函數-變量的作用域和生命周期

變量的作用域 引入問題 我們在函數設計的過程中,經常要考慮對于參數的設計,換句話說,我們需要考慮函數需要幾個參數,需要什么類型的參數,但我們并沒有考慮函數是否需要提供參數,如果說函數可以訪問到已定義…

Ansible在配置管理中的應用

Ansible是一個開源的配置管理和應用程序部署工具,它使用YAML語言編寫的Playbook來描述配置和應用部署過程。通過SSH協議與目標機器通信,Ansible可以實現批量操作,極大地提升了工作效率。核心功能Ansible的核心功能包括:配置管理&a…

【學習路線】Go語言云原生開發之路:從簡潔語法到微服務架構

一、Go語言基礎入門(1-2個月) (一)環境搭建與工具鏈Go環境安裝 官方安裝:從golang.org下載安裝包版本管理:g、gvm等Go版本管理工具環境變量:GOROOT、GOPATH、GOPROXY配置Go Modules:…

軟件工廠:推動新質生產力的組織躍遷

引言:軟件工廠的建設,不在于工具多,而在于理解深;不在于上線快,而在于體系穩。不僅是“看得見的流水線”,更是“看不見的組織變革”。在新質生產力的時代命題下,軟件工廠正成為連接創新與效率、…

9.0% 年增速驅動!全球自清潔滾輪拖布機器人市場2031年將邁向 946 百萬美元

自清潔滾輪拖布機器人是重要的智能清潔設備,采用滾筒式拖布結構,集掃拖功能,通過高速旋轉加壓擦洗地面,深度除污。其活水清潔系統可實時自清潔、回收污水,避免二次污染,提升清潔效率與效果,帶來…

新能源工廠的可視化碳中和實驗:碳足跡追蹤看板與能源調度策略仿真

摘要新能源工廠明明用著風電、光伏等清潔能源,碳排放數據卻依舊居高不下?某鋰電池廠耗費百萬升級設備,碳足跡卻難以精準追蹤,能源調度全靠經驗“拍腦袋”,導致成本飆升。而隔壁企業通過可視化碳中和實驗,碳…

數據結構自學Day13 -- 快速排序--“非遞歸利用棧實現”

一、快速排序回顧 快速排序本質上是**“分而治之”(Divide and Conquer)策略的遞歸應用。但遞歸其實就是函數棧的一種體現,因此我們也可以顯式使用棧(stack)來模擬遞歸過程**,從而實現非遞歸版本的快速排序…

前端數據庫:IndexedDB 基礎使用

前言 在現代 Web 開發中,隨著應用程序復雜度的增加,對本地存儲的需求也越來越高。雖然 localStorage 和 sessionStorage 可以滿足一些簡單的數據存儲需求,但當需要存儲大量結構化數據或進行復雜查詢時,它們就顯得力不從心了。這時…

Kubernetes深度解析:企業級容器編排平臺的核心實踐

引言:Kubernetes的戰略地位與核心價值在云原生技術生態中,??Kubernetes??已成為容器編排的事實標準。根據2023年全球云原生調查報告:全球??96%?? 的組織正在使用或評估Kubernetes企業生產環境Kubernetes采用率增長??400%??&#…

Netty中future和promise用法和區別

定義與概念 Future:表示一個異步操作的結果。它是只讀的,意味著你只能查看操作是否完成、是否成功、獲取結果或者異常等信息,但不能主動設置操作的結果。Promise:是 Future 的可寫擴展。它不僅可以像 Future 一樣查看操作結果&…