1. 程式人生 > >影象腐蝕與影象膨脹(Python篇)

影象腐蝕與影象膨脹(Python篇)

        在大學期間積累過一定的影象處理經驗,OCR技術在我的日常工作中偶爾會用到,還是比較重要的。本文介紹影象的膨脹和腐蝕的基本概念及其各自的程式碼實現。

        1.膨脹和腐蝕的基本概念

        影象的膨脹(Dilation)和腐蝕(Erosion)是兩種基本的形態學運算,主要用來尋找影象中的極大區域和極小區域。其中膨脹類似於“領域擴張”,將影象中的高亮區域或白色部分進行擴張,其執行結果圖比原圖的高亮區域更大;腐蝕類似於“領域被蠶食”,將影象中的高亮區域或白色部分進行縮減細化,其執行結果圖比原圖的高亮區域更小。

        1.1影象膨脹

膨脹的運算子是”⊕”,其定義如下:

                                          Python影象處理:影象腐蝕與影象膨脹!

         該公式表示用B來對影象A進行膨脹處理,其中B是一個卷積模板或卷積核,其形狀可以為正方形或圓形,通過模板B與影象A進行卷積計算,掃描影象中的每一個畫素點,用模板元素與二值影象元素做“與”運算,如果都為0,那麼目標畫素點為0,否則為1。從而計算B覆蓋區域的畫素點最大值,並用該值替換參考點的畫素值實現膨脹。下圖是將左邊的原始影象A膨脹處理為右邊的效果圖A⊕B。

        1.2影象腐蝕

腐蝕的運算子是“-”,其定義如下:

                                               Python影象處理:影象腐蝕與影象膨脹!

        該公式表示影象A用卷積模板B來進行腐蝕處理,通過模板B與影象A進行卷積計算,得出B覆蓋區域的畫素點最小值,並用這個最小值來替代參考點的畫素值。如圖所示,將左邊的原始影象A腐蝕處理為右邊的效果圖A-B。

        2.實現過程

        2.1影象腐蝕

影象腐蝕的過程:

       a.影象二值化,將影象的灰度值根據閾值進行0,1處理得到的影象;

       b.卷積核,對應訊號處理中的高低頻濾波器。常用numpy去設定,np.ones((m,n), np.uint8) 表示指定m*n的卷積核;

       c.影象的腐蝕,cv2.erode(二值化影象, 卷積核, 迭代次數)

程式碼處理過程:

import cv2
import numpy as np

## 測試圖片,為反斜槓
pic = 'C:/1.jpg'

## a.影象的二值化 ,這裡沒有做閾值處理
src = cv2.imread(pic,cv2.IMREAD_UNCHANGED)


## b.設定卷積核5*5
kernel = np.ones((5,5),np.uint8)

## c.影象的腐蝕,預設迭代次數
erosion = cv2.erode(src,kernel)

## 效果展示
cv2.imshow('origin',src)

## 腐蝕後
cv2.imshow('after erosion',erosion)

圖片處理效果對比:

        2.2影象膨脹

影象膨脹時腐蝕的逆過程,往往先通過腐蝕使圖片線條變窄,然後腐蝕可以去除噪聲。影象膨脹的處理過程:

a.影象二值化,將影象的灰度值根據閾值進行0,1處理得到的影象;

b.卷積核,對應訊號處理中的高低頻濾波器。常用numpy去設定,np.ones((m,n), np.uint8) 表示指定m*n的卷積核;

c.影象的腐蝕,cv2.dilate(二值化影象, 卷積核, 迭代次數)

程式碼處理過程:

import cv2
import numpy as np

## 測試圖片,為反斜槓
pic = 'C:/1.jpg'

## a.影象的二值化 ,這裡沒有做閾值處理
src = cv2.imread(pic,cv2.IMREAD_UNCHANGED)


## b.設定卷積核5*5
kernel = np.ones((5,5),np.uint8)

## c.影象的腐蝕,預設迭代次數
erosion = cv2.erode(src,kernel)

## 影象的膨脹
dst = cv2.dilate(erosion,kernel)

## 效果展示
cv2.imshow('origin',src)

## 腐蝕後
cv2.imshow('after erosion',erosion)

## 膨脹後
cv2.imshow('after dilate',dst)

圖片效果對比: