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