計算機視覺(三) 形態學處理

2021-08-21 08:00:19 字數 2590 閱讀 9133

上期我們提到了乙個做摳車牌的案例,得到了一幅這樣的圖。

但我們需要做進一步的細處理,讓我們得到比較好的白色的車牌區域掩碼。

本期就是要處理這個問題,先來仔細分析這個問題。我們想要得到的區域是「遼h….」這一塊白色的區域,這個區域有什麼特點呢?第

一、連貫,不像其他地方很多小小的白點;第

二、整個區域近似乙個矩形,不像車窗前那些區域,雖然連貫,但是形狀比較蛇皮。這兩個特點可以作為篩選的突破口,我們將介紹一些手段能夠根據這些特點進行處理。

腐蝕顧名思義,是把每乙個白色區域都往內縮,有些小的噪點就會縮沒了。膨脹則相反。可以看看這裡的圖感受一下。腐蝕的原理是:對於乙個點,觀察它的周圍(鄰域)的畫素點哪個值最小,就把當前點的值替換成最小值;膨脹則替換成最大值。

比如當前要處理的點是p點,鄰域大小是3x3,也就是我們要看看p點周圍的8個點和它本身,共9個點,如果是腐蝕操作則把p點的值換成最小值,p點周圍有黑色的點,值為0,則p點會變成黑色;如果是膨脹操作p點不發生改變。

對於車牌的掩碼圖上的雜訊,我們就可以用腐蝕操作去掉一些,但車牌區域也會受到影響,所以腐蝕完以後還要膨脹回去,但是雜訊已經消失了,所以雜訊不會被膨脹回來。先腐蝕後膨脹,這個叫開運算,如果是先膨脹再腐蝕就叫閉運算,是用來填充白色區域內的黑洞的。下面是這個操作的**。

# 腐蝕

kernel = cv2.getstructuringelement(cv2.morph_rect, (3, 3)) # 矩形結構

mask = cv2.erode(mask, kernel)

# 膨脹

mask = cv2.dilate(mask, kernel)

kernel是乙個3x3的矩陣,值全為1,這個叫矩形核,cv2.getstructuringelement的第乙個引數正是指定用哪種形狀的核,除了矩形核,還有十字架核cv2.morph_cross和橢圓核cv2.morph_ellipse。

效果如下:

3x3的十字架核是這樣的:

不同形狀的核的區別是:腐蝕膨脹的最小最大值是從核的值為1的地方找的,值為0的地方則不理會。

濾波是訊號處理中減少雜訊的方法,影象濾波的方法有很多種:中值濾波、高斯濾波、均值濾波等等,不一而足。

個人常用的是中值濾波,下面介紹這個。

中值是中位數,有序數列中位於中間位置的值,比如[1,2,3,3,6]裡的中位數就是3。跟腐蝕膨脹類似,我們的處理也是基於乙個核,對於每個畫素的處理都是把這個核的中心挪到這個畫素的位置再進行處理,這是影象處理中很常見的操作,叫影象卷積

對於乙個3x3的圖,中間有乙個白色噪點的情況,使用中值濾波則會把這個白點塗黑,從而達到去除雜訊的目的。下面是乙個示例**:

mask =cv2.medianblur(mask, 7)
用7x7的核對影象做中值濾波,效果如下:

其他型別的濾波器基本上只是核裡面填充的值不一樣,對影象卷積後就產生了不同的作用,如索貝爾運算元卷積後能得到影象的梯度。這些濾波器的值都是經過了人為設計,而近幾年很火的深度學習技術中有一種卷積神經網路(cnn),它的原理就是各種濾波器的疊加,這些濾波器的值是靠它自己根據訓練資料學習後自己填充的。

影象卷積操作的耗時與核的大小成正相關,假如影象大小是nxn,核大小是kxk,則時間複雜度接近o(n*n*k*k)。

我了解到在用十字架核對影象做膨脹操作時有一種快速的方法,複雜度是o(n*n)。具體請參考這裡。大概原理是先求每乙個點離最近的白色點的曼哈頓距離,然後再遍歷一次存放距離的圖,把小於k的地方都設為白色。我在macbook pro的i5-5257u cpu上測試了11x11的十字架核在640x360的圖上用opencv處理的用時是20-30ms,但使用上面的方法用時與核大小無關,用時穩定在2-3ms。

對於有些濾波器還可以採用一種叫可分離卷積的方法加速。數學上的原理可以參考維基,本質是利用了線性操作的結合性,卷積是線性操作,矩陣乘法也是,因此可以把某些可拆分成兩個向量相乘的濾波器從原來的直接卷積變成兩個向量分別卷積。以下是索貝爾運算元求x方向梯度拆分的樣子。

複雜度從o(n*n*k*k)變成o(n*n*k)。

計算機視覺(十) 形態學特徵

數學形態運算中,最常見的基本運算有七種,分別為 腐蝕 膨脹 開運算 閉運算 擊中 細化和粗化 它們是全部形態學的基礎。腐蝕和膨脹,看上去好像是一對互逆的操作,實際上,這兩種操作不具有互逆的關係 開運算和閉運算正是依據腐蝕和膨脹的不可逆性,演變而來的。先腐蝕後膨脹的過程就稱為開運算 閉運算是通過對腐蝕...

形態學處理

腐蝕,膨脹 效果就是暗的地方侵入亮的地方 使用 給乙個結構元 二維陣列 結構元中有乙個錨點,計算過程就是如果結構元對應的區域有暗的,那錨點就變為暗的 記作 import cv2 as cv import numpy as np s cv.getstructuringelement cv.morph ...

opencv 形態學處理

影象形態學中的幾個基本操作 腐蝕 膨脹 開操作 閉操作。1.1 腐蝕 結構a被結構b腐蝕的定義為,a b a b 可以理解為,移動結構b,如果結構b與結構a的交集完全屬於結構a的區域內,則儲存該位置點,所有滿足條件的點構成結構a被結構b腐蝕的結果。1.2 膨脹 結構a被結構b膨脹的定義為,a b a...