OpenCV圖像形態(tài)學的實現(xiàn)
在圖像處理領域,圖像形態(tài)學是一種基于形狀進行圖像分析的有力工具,廣泛應用于圖像分割、特征提取、邊緣檢測、圖像降噪等多個方面。借助 OpenCV 這個強大的計算機視覺庫,我們可以輕松實現(xiàn)各種圖像形態(tài)學操作。本文將深入探討圖像形態(tài)學的基本原理,并結合 OpenCV 的代碼示例,介紹腐蝕、膨脹、開運算、閉運算、梯度運算、頂帽運算和黑帽運算等常見的形態(tài)學操作。
一、圖像形態(tài)學簡介
圖像形態(tài)學以數(shù)學形態(tài)學為基礎,通過對圖像中的像素進行特定的集合運算,改變圖像中物體的形狀和結構。其核心操作是使用一個稱為結構元素(也叫核)的小矩陣,在圖像上滑動,對每個像素及其鄰域進行操作,從而實現(xiàn)對圖像的處理。在 OpenCV 中,提供了豐富的函數(shù)和工具,幫助我們進行各種圖像形態(tài)學處理。
二、腐蝕(Erosion)
1. 原理
腐蝕是一種基本的圖像形態(tài)學操作,其作用是 “收縮” 或 “細化” 圖像中的物體。具體來說,腐蝕操作以結構元素為模板,對圖像中的每個像素進行檢查。如果結構元素覆蓋的所有像素都為 1(對于二值圖像而言),則中心像素保持不變,否則中心像素被設置為 0。通俗地講,腐蝕操作會將物體的邊界向內部收縮,從而去除圖像中的一些小的噪聲點和毛刺。例如,對于一個白色物體在黑色背景上的二值圖像,腐蝕操作會使白色物體的面積變小。
2. OpenCV 實現(xiàn)
在 OpenCV 中,使用cv2.erode()函數(shù)實現(xiàn)腐蝕操作。該函數(shù)的第一個參數(shù)為輸入圖像,第二個參數(shù)為結構元素,第三個參數(shù)為迭代次數(shù)(可選,默認為 1)。下面通過一個簡單的示例來展示如何使用cv2.erode()進行腐蝕操作:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行腐蝕操作 eroded = cv2.erode(img, kernel, iterations = 1) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(eroded, cmap = 'gray'), plt.title('Eroded') plt.xticks([]), plt.yticks([]) plt.show()
三、膨脹(Dilation)
1. 原理
膨脹是與腐蝕相反的操作,其作用是 “擴展” 或 “加粗” 圖像中的物體。膨脹操作同樣以結構元素為模板,對圖像中的每個像素進行檢查。只要結構元素覆蓋的像素中有一個為 1(對于二值圖像而言),則中心像素被設置為 1。膨脹操作可以填補圖像中的小空洞,連接斷裂的物體,擴大物體的面積。例如,在檢測物體輪廓時,膨脹操作可以幫助我們更完整地獲取物體的輪廓。
2. OpenCV 實現(xiàn)
在 OpenCV 中,使用cv2.dilate()函數(shù)實現(xiàn)膨脹操作。該函數(shù)的參數(shù)與cv2.erode()類似,第一個參數(shù)為輸入圖像,第二個參數(shù)為結構元素,第三個參數(shù)為迭代次數(shù)(可選,默認為 1)。下面是使用cv2.dilate()進行膨脹操作的示例代碼:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行膨脹操作 dilated = cv2.dilate(img, kernel, iterations = 1) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(dilated, cmap = 'gray'), plt.title('Dilated') plt.xticks([]), plt.yticks([]) plt.show()
四、開運算(Opening)
1. 原理
開運算由腐蝕和膨脹兩個操作組成,先對圖像進行腐蝕操作,再進行膨脹操作。開運算可以去除圖像中的小噪聲點,平滑物體的輪廓,斷開狹窄的連接,而不會明顯改變物體的面積。對于含有噪聲的二值圖像,開運算能夠有效地去除噪聲,保留主要的物體結構。
2. OpenCV 實現(xiàn)
在 OpenCV 中,使用cv2.morphologyEx()函數(shù)并指定操作類型為cv2.MORPH_OPEN來實現(xiàn)開運算。該函數(shù)的第一個參數(shù)為輸入圖像,第二個參數(shù)為操作類型,第三個參數(shù)為結構元素。以下是實現(xiàn)開運算的示例代碼:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行開運算 opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(opened, cmap = 'gray'), plt.title('Opened') plt.xticks([]), plt.yticks([]) plt.show()
五、閉運算(Closing)
1. 原理
閉運算同樣由腐蝕和膨脹兩個操作組成,但順序與開運算相反,先進行膨脹操作,再進行腐蝕操作。閉運算可以填補物體內部的小空洞,連接鄰近的物體,平滑物體的輪廓,同時保持物體的整體形狀和面積。在處理含有孔洞的物體圖像時,閉運算能夠有效地填補孔洞,使物體的形狀更加完整。
2. OpenCV 實現(xiàn)
在 OpenCV 中,使用cv2.morphologyEx()函數(shù)并指定操作類型為cv2.MORPH_CLOSING來實現(xiàn)閉運算。示例代碼如下:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行閉運算 closed = cv2.morphologyEx(img, cv2.MORPH_CLOSING, kernel) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(closed, cmap = 'gray'), plt.title('Closed') plt.xticks([]), plt.yticks([]) plt.show()
六、梯度運算(Morphological Gradient)
1. 原理
形態(tài)學梯度運算通過膨脹和腐蝕操作的差值來獲取圖像中物體的輪廓。具體來說,梯度運算的結果等于膨脹后的圖像減去腐蝕后的圖像。這樣可以突出圖像中物體的邊緣,使物體的輪廓更加明顯。形態(tài)學梯度運算常用于邊緣檢測和物體形狀的提取。
2. OpenCV 實現(xiàn)
在 OpenCV 中,使用cv2.morphologyEx()函數(shù)并指定操作類型為cv2.MORPH_GRADIENT來實現(xiàn)梯度運算。示例代碼如下:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行梯度運算 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(gradient, cmap = 'gray'), plt.title('Gradient') plt.xticks([]), plt.yticks([]) plt.show()
七、頂帽運算(Top - Hat)
1. 原理
頂帽運算,也叫禮帽運算,其結果為原始圖像與圖像開運算的差值。即頂帽圖像 = 原始圖像 - 開運算圖像。開運算會平滑物體輪廓、去除小噪聲,但也會使圖像中較亮的部分有所損失。頂帽運算能夠分離出比鄰近點亮一些的斑塊,突出圖像中的微小細節(jié),在提取圖像中的明亮區(qū)域或噪聲方面非常有用。例如,在文本檢測中,頂帽運算可以幫助突出文本的細節(jié)。
2. OpenCV 實現(xiàn)
在 OpenCV 中,通過cv2.morphologyEx()函數(shù)并指定操作類型為cv2.MORPH_TOPHAT來實現(xiàn)頂帽運算。下面是實現(xiàn)頂帽運算的代碼示例:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行頂帽運算 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(tophat, cmap = 'gray'), plt.title('Top - Hat') plt.xticks([]), plt.yticks([]) plt.show()
八、黑帽運算(Black - Hat)
1. 原理
黑帽運算與頂帽運算相對,其結果為圖像閉運算與原始圖像的差值。即黑帽圖像 = 閉運算圖像 - 原始圖像。閉運算能夠填補物體內部的小空洞、連接鄰近物體。黑帽運算有助于分離出比鄰近點暗一些的斑塊,突出圖像中相對較暗的區(qū)域,在檢測圖像中的暗細節(jié)或背景特征時十分有效。比如在檢測深色物體時,黑帽運算能幫助增強物體的特征。
2. OpenCV 實現(xiàn)
在 OpenCV 中,通過cv2.morphologyEx()函數(shù)并指定操作類型為cv2.MORPH_BLACKHAT來實現(xiàn)黑帽運算。代碼示例如下:
import cv2 import numpy as np import matplotlib.pyplot as plt # 讀取圖像并轉換為灰度圖 img = cv2.imread('test.jpg', 0) # 創(chuàng)建結構元素,這里使用5x5的矩形結構元素 kernel = np.ones((5, 5), np.uint8) # 進行黑帽運算 blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) # 顯示結果 plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(blackhat, cmap = 'gray'), plt.title('Black - Hat') plt.xticks([]), plt.yticks([]) plt.show()
九、總結
本文詳細介紹了 OpenCV 中的圖像形態(tài)學處理技術,包括腐蝕、膨脹、開運算、閉運算、梯度運算、頂帽運算和黑帽運算。每種操作都有其獨特的原理和適用場景。腐蝕和膨脹是基礎操作,開運算、閉運算、頂帽運算和黑帽運算基于它們組合而成,用于不同的圖像特征提取與處理。梯度運算則專注于突出物體邊緣。在實際應用中,我們可以根據圖像的特點和處理需求,靈活組合這些形態(tài)學操作,達到最佳的處理效果。
到此這篇關于OpenCV圖像形態(tài)學的實現(xiàn)的文章就介紹到這了,更多相關OpenCV圖像形態(tài)學內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中
這篇文章主要介紹了python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python利用re,bs4,requests模塊獲取股票數(shù)據
這篇文章主要介紹了python利用re,bs4,requests模塊獲取股票數(shù)據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07Python 調用 Outlook 發(fā)送郵件過程解析
這篇文章主要介紹了Python 調用 Outlook 發(fā)送郵件過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08python如何實現(xiàn)int函數(shù)的方法示例
int()函數(shù)常用來把其他類型轉換為整數(shù),下面這篇文章主要給大家介紹了關于python如何實現(xiàn)int函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2018-02-02Python return語句如何實現(xiàn)結果返回調用
這篇文章主要介紹了Python return語句如何實現(xiàn)結果返回調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10實現(xiàn)Python3數(shù)組旋轉的3種算法實例
在本篇文章里小編給大家整理的是一篇關于實現(xiàn)Python3數(shù)組旋轉的3種算法實例內容,需要的朋友們可以學習參考下。2020-09-09