形態學基于圖像的形狀進行操作,用于處理二值化圖像,主要包括腐蝕和膨脹兩種基本操作。這些操作通常用于去除噪聲、分隔或連接相鄰的元素以及尋找圖像中顯著的最大點和最小點。
1. 形態學操作
import cv2
import numpy as np
import matplotlib.pyplot as plotimg = cv2.imread("tmp.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((5,5), np.uint8)
img_e = cv2.erode(img, kernel)
img_d = cv2.dilate(img, kernel)plot.figure(figsize=(12,4));
plot.subplot(1,3,1)
plot.title('source image')
plot.imshow(img)
plot.subplot(1,3,2)
plot.title('erosion')
plot.imshow(img_e)
plot.subplot(1,3,3)
plot.title('dilation')
plot.imshow(img_d)plot.show()
2. 概念簡述
2.1 腐蝕(Erosion)
- 基本原理:腐蝕操作會將圖像中的前景區域進行“侵蝕”,縮小物體的邊界。核(kernel)會掃描圖像的每個像素,如果核覆蓋區域的所有像素值都是前景,則該像素保持不變;否則,它將被腐蝕成背景。因此,腐蝕可以有效去除圖像中的小細節,比如孤立的噪聲點。
- 應用場景:
- 去除噪聲:腐蝕常用于消除圖像中的孤立噪聲點或小塊不需要的細節。
- 分割連接物體:腐蝕可以用于分離連接較緊密的物體,例如兩個接觸的物體。
2.2 膨脹(Dilation)
- 基本原理:膨脹操作是腐蝕的反向操作,它通過擴展物體的邊界來增加前景區域的面積。核(kernel)掃描圖像時,如果核覆蓋區域有一個或多個前景像素,那么該像素就會被膨脹為前景。因此,膨脹操作會使物體變大,并且可以填充前景區域中的小空隙或“洞”。
- 應用場景:
- 增強物體邊界:膨脹通常用于在邊界模糊的物體中增強邊緣,使得物體更加明顯。
- 連接斷開的部分:膨脹可以用于連接圖像中斷開的物體,如中斷的線條、文字或其他形狀。
2.3 腐蝕與膨脹的結合
腐蝕和膨脹通常結合使用,形成了多種形態學操作:
- 開運算(Opening):先腐蝕后膨脹,常用于去除小物體或噪聲,但保留物體整體結構。
- 閉運算(Closing):先膨脹后腐蝕,常用于填充物體內部的小空洞,平滑物體邊緣。
- 形態學梯度:通過膨脹和腐蝕之間的差異,提取圖像邊緣
3. 開閉運算
import cv2
import numpy as np
import matplotlib.pyplot as plotimg = cv2.imread("tmp.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
kernel = np.ones((5,5), np.uint8)
img_op = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
img_cl = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
img_gr = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)plot.figure(figsize=(16,4));
plot.subplot(1,4,1)
plot.title('source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Open')
plot.imshow(img_op)
plot.subplot(1,4,3)
plot.title('Close')
plot.imshow(img_cl)
plot.subplot(1,4,4)
plot.title('Gradient')
plot.imshow(img_gr)plot.show()
4. Matplotlib顯示函數對比
4.1 plot
繪制x,y的一元方程的函數關系圖
plot ([x], y, [fmt], **kwargs)
- [x]:橫坐標軸數據,可選參數
- y:縱坐標軸數據
- [fmt] :定義圖形的基本樣式:顏色,點型,線型
- **Kwargs:不定長的關鍵字參數,用字典形式設置圖形的其他屬性,或者重復x,y,fmt用于多條線同時顯示
[fmt] 具體形式 ‘[顏色][標記][線型]’,是一個字符串來定義圖的基本屬性,詳細分解如下:
顏色參數 | 顏色含義 |
---|---|
b | blue 藍 |
g | green 綠 |
'r | red 紅 |
c | cyan 藍綠 |
m | magenta 洋紅 |
y | yellow 黃 |
k | black 黑 |
w | white 白 |
標記參數 | 標記含義 |
---|---|
. | 點標記 |
, | 像素標記 |
o | 圓圈標記 |
v | 倒三角標記 |
^ | 正三角標記 |
< | 左三角標記 |
> | 右三角標記 |
1 | 朝下三角標記 |
2 | 朝上三角標記 |
3 | 朝左三角標記 |
4 | 朝右三角標記 |
s | 方形標記 |
p | 五角形標記 |
* | 星形標記 |
h | 六邊形標記1 |
H | 六邊形標記2 |
+ | 加號標記 |
x | 乘號標記 |
D | 鉆石標記 |
d | 瘦鉆石標記 |
| | 豎線標記 |
_ | 水平線標記 |
線型參數 | 線型含義 |
---|---|
- | 實線 |
- - | 虛線 |
-. | 點畫線 |
: | 點線 |
4.2 imshow
創建圖像對象并配置其屬性,但不會顯示圖像
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs):
- X:輸入數據。可以是二維數組、三維數組、PIL圖像對象、matplotlib路徑對象等。
- cmap:顏色映射。用于控制圖像中不同數值所對應的顏色。可以選擇內置的顏色映射,如gray、hot、jet等,也可以自定義顏色映射。
- norm:用于控制數值的歸一化方式。可以選擇Normalize、LogNorm等歸一化方法。
- aspect:控制圖像縱橫比(aspect ratio)。可以設置為auto或一個數字。
- interpolation:插值方法。用于控制圖像的平滑程度和細節程度。可以選擇nearest、bilinear、bicubic等插值方法。
- alpha:圖像透明度。取值范圍為0~1。
- origin:坐標軸原點的位置。可以設置為upper或lower。
- extent:控制顯示的數據范圍。可以設置為[xmin, xmax, ymin, ymax]。
- vmin、vmax:控制顏色映射的值域范圍。
- filternorm 和 filterrad:用于圖像濾波的對象。可以設置為None、antigrain、freetype等。
- imlim: 用于指定圖像顯示范圍。
- resample:用于指定圖像重采樣方式。
- url:用于指定圖像鏈接。
4.3 顯示圖像
show
實際上顯示所有已經配置好的圖形,包括由 imshow 創建的圖像,具體步驟概述如下:
- 導入Matplotlib庫:import matplotlib.pyplot as plt
- 創建圖形對象:fig = plt.figure()
- 繪制圖形:使用Matplotlib提供的繪圖函數進行繪制,例如plt.plot(y)繪制折線, plt.imshow((x,y))繪制圖像等
- 調用show()函數顯示圖形:plt.show()
系列文章:
- opencv常用邊緣檢測算子示例
- 圖像顏色空間對比(Opencv)
- 圖像變換方式區別對比(Opencv)
- 常用圖像濾波及色彩調節操作(Opencv)
- 圖像形態學操作對比(Opencv)