干货 | 用Python做图像处理:图像导数实战
導讀:數量龐大的圖像和視頻充斥著我們的生活。我們需要對圖片進行檢索、分類等操作時,利用人工手段顯然是不現實的。于是,計算機視覺相關技術便應運而生,并且得到了快速的發展。本文以時下最流行的Python語言為工具,對圖像處理技術的具體操作進行詳細講述,旨在讓零基礎的讀者也可以輕松上手!
01 SciPy
SciPy是建立在NumPy基礎上,用于數值運算的開源工具包。SciPy提供很多高效的操作,可以實現數值積分、優化、統計、信號處理,以及對我們來說最重要的圖像處理功能。接下來,本節會介紹SciPy中大量有用的模塊。SciPy是一個開源工具包,可以從http://scipy.org/Download?下載。
02 圖像導數
在整個圖像處理的學習過程中可以看到,在很多應用中圖像強度的變化情況是非常重要的信息。強度的變化可以用灰度圖像I(對于彩色圖像,通常對每個顏色通道分別計算導數)的x和y的方向導數和進行描述。
圖像的梯度向量為:
梯度有兩個重要的屬性,一個是梯度的大小:
它描述了圖像變化的強弱,一是梯度的角度:
它描述了圖像中在每個點(像素)上強度變化最大的方向。NumPy中的arctan2()函數返回弧度表示的有符號角度,角度的變化區間為。
我們可以用離散近似的方式來計算圖像的導數。圖像的導數大多可以通過卷積簡單地實現:
對于和,通常選擇Prewitt濾波器:
Prewitt邊緣算子是一種邊緣樣板算子,利用像素點上下,左右鄰點灰度差,在邊緣處達到極值檢測邊緣,對噪聲具有平滑作用。由于邊緣點像素的灰度值與其領域點像素的灰度值有顯著不同,在實際應用中通常采用微分算子和模板配匹方法檢測圖像的邊緣。
或者使用Sobel濾波器,Sobel算法是一種較成熟的微分邊緣檢測算法,它計算簡單,且能產生較好的檢測效果,對噪聲具有平滑作用,可以提供較為精確的邊緣方向信息。
Sobel算子是一階導數的邊緣檢測算子,使用兩個方向算子(垂直算子和水平算子),對圖像進行卷積運算,得到兩個矩陣,再求這兩個矩陣對應位置的兩個數的均方根,得到一個新的矩陣,即為灰度圖像矩陣中各個像素點的梯度值。在算法實現過程中,通過3×3模板作為核與圖像中的每個像素點做卷積和運算,然后選取合適的閾值以提取邊緣。
其實圖像的梯度可以用一階導數和二階偏導數來求解。但是圖像以矩陣的形式存儲的,不能像數學理論中對直線或者曲線求導一樣,對一幅圖像的求導相當于對一個平面、曲面求導。對圖像的操作,我們采用模板對原圖像進行卷積運算,從而達到我們想要的效果。而獲取一幅圖像的梯度就轉化為:模板(Roberts、Prewitt、Sobel、Lapacian算子)對原圖像進行卷積,不過這里的模板并不是隨便設計的,而是根據數學中求導理論推導出來的。
這些導數濾波器可以使用scipy.ndimage.filters模塊的標準卷積操作來簡單地實現。
代碼為:
輸出結果為:
▲上述輸出結果分別是原始灰度圖像、x導數圖像、y導數圖像、梯度大小圖像
這種計算圖像導數的方法有一些缺陷,在該方法中,濾波器的尺度需要隨著圖像分辨率的變化而變化。為了在圖像噪聲方面更穩健,以及在任意尺度上計算導數,我們使用高斯導數濾波器:
其中和表示在x和y方向上的導數,為標準差為σ的高斯函數。
我們之前用于模糊的filters.gaussian_filter()函數可以接受額外的參數,用來計算高斯導數。可以簡單的按照下面的方式來處理:
輸出結果為:
(a)
(b)
上面輸出結果(a)、(b)中圖片依次為:原始灰度圖像,x導數圖像,y導數圖像,而(a),(b)的區別為設置不同的標準差之后的高斯濾波處理圖像。
作者:Hui
來源:專知(ID:Quan_Zhuanzhi),關于“用Python做圖像處理”的更多圖文,可在專知查看
參考文獻:
python計算機視覺編程:
http://yongyuan.name/pcvwithpython/
推薦閱讀
日本老爺爺堅持17年用Excel作畫,我可能用了假的Excel···
看完此文再不懂區塊鏈算我輸:手把手教你用Python從零開始創建區塊鏈
為什么要學數學?因為這是一場戰略性的投資
180頁PPT,講解人工智能技術與產業發展
Q:?關于圖像處理,你有哪些想法和經驗?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯系:baiyu@hzbook.com
更多精彩文章,請在公眾號后臺點擊“歷史文章”查看
總結
以上是生活随笔為你收集整理的干货 | 用Python做图像处理:图像导数实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android bitmap对比,And
- 下一篇: 吐血推荐 | 那些提升开发人员工作效率的