亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何利用Python 進行邊緣檢測

 更新時間:2020年10月14日 10:25:26   作者:lscih  
本文主要介紹了關(guān)于邊緣檢測的知識,包括邊緣檢測的理論以及如何使用 Python 實現(xiàn)邊緣檢測,希望對您的學(xué)習(xí)有所幫助。

為何檢測邊緣?

我們首先應(yīng)該了解的問題是:“為什么要費盡心思去做邊緣檢測?”除了它的效果很酷外,為什么邊緣檢測還是一種實用的技術(shù)?為了更好地解答這個問題,請仔細思考并對比下面的風(fēng)車圖片和它的“僅含邊緣的圖”:

可以看到,左邊的原始圖像有著各種各樣的色彩、陰影,而右邊的“僅含邊緣的圖”是黑白的。如果有人問,哪一張圖片需要更多的存儲空間,你肯定會告訴他原始圖像會占用更多空間。這就是邊緣檢測的意義:通過對圖片進行邊緣檢測,丟棄大多數(shù)的細節(jié),從而得到“更輕量化”的圖片。

因此,在無須保存圖像的所有復(fù)雜細節(jié),而 “只關(guān)心圖像的整體形狀” 的情況下,邊緣檢測會非常有用。

如何進行邊緣檢測 —— 數(shù)學(xué)

在討論代碼實現(xiàn)前,讓我們先快速瀏覽一下邊緣檢測背后的數(shù)學(xué)原理。作為人類,我們非常擅長識別圖像中的“邊”,那如何讓計算機做到同樣的事呢?

首先,假設(shè)有一張很簡單的圖片,在白色背景上有一個黑色的正方形:

在這個例子中,由于處理的是黑白圖片,因此我們可以考慮將圖中的每個像素的值都用 0(黑色) 或 1(白色) 來表示。除了黑白圖片,同樣的理論也完全適用于彩色圖像。

現(xiàn)在,我們需要判斷上圖中綠色高亮的像素是不是這個圖像邊緣的一部分。作為人類,我們當(dāng)然可以認出它是圖像的邊緣;但如何讓計算機利用相鄰的像素來得到同樣的結(jié)果呢?

我們以綠色高亮的像素為中心,設(shè)定一個 3 x 3 像素大小的小框,在圖中以紅色示意。接著,對這個小方框“應(yīng)用”一個過濾器(filter):

上圖展示了我們將要“應(yīng)用”的過濾器。乍一看上去很神秘,讓我們仔細研究它做的事情:當(dāng)我們說 “將過濾器應(yīng)用于一小塊局部像素塊” 時,具體是指紅色框中的每個像素與過濾器中與之位置對應(yīng)的像素進行相乘。因此,紅色框中左上角像素值為 1,而過濾器中左上角像素值為 -1,它們相乘得到 -1,這也就是結(jié)果圖中左上角像素顯示的值。結(jié)果圖中的每個像素都是用這種方式得到的。

下一步是對過濾結(jié)果中的所有像素值求和,得到 -4。請注意,-4 其實是我們應(yīng)用這個過濾器可獲得的“最小”值(因為原始圖片中的像素值只能在 0 到 1 之間)。因此,當(dāng)獲得 -4 這個最小值的時候,我們就能知道,對應(yīng)的像素點是圖像中正方形頂部豎直方向邊緣的一部分。

為了更好地掌握這種變換,我們可以看看將此過濾器應(yīng)用于圖中正方形底邊上的一個像素會發(fā)生什么:

可以看到,我們得到了與前文相似的結(jié)果,相加之后得到的結(jié)果是 4,這是應(yīng)用此過濾器能得到的最大值。因此,由于我們得到了 4 這一最大值,可以知道這個像素是圖像中正方形底部豎直方向邊緣的一部分。

為了把這些值映射到 0-1 的范圍內(nèi),我們可以簡單地給其加上 4 再除以 8,這樣就能把 -4 映射成 0(黑色),把 4 映射成 1(白色)。因此,我們將這種過濾器稱為縱向 Sobel 過濾器,可以用它輕松檢測圖像中垂直方向的邊緣。

那如何檢測水平方向的邊緣呢?只需簡單地將縱向過濾器進行轉(zhuǎn)置(按照其數(shù)值矩陣的對角線進行翻轉(zhuǎn))就能得到一個新的過濾器,可以用于檢測水平方向的邊緣。

如果需要同時檢測水平方向、垂直方向以及介于兩者之間的邊緣,我們可以把縱向過濾器得分和橫向過濾器得分進行結(jié)合,這個步驟在后面的代碼中將有所體現(xiàn)。

希望上文已經(jīng)講清楚了這些理論!下面看一看代碼是如何實現(xiàn)的。

如何進行邊緣檢測 —— 代碼

首先進行一些設(shè)置:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# 定義縱向過濾器
vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]]
# 定義橫向過濾器
horizontal_filter = [[-1,0,1], [-2,0,2], [-1,0,1]]

# 讀取紙風(fēng)車的示例圖片“pinwheel.jpg”
img = plt.imread('pinwheel.jpg')

# 得到圖片的維數(shù)
n,m,d = img.shape

# 初始化邊緣圖像
edges_img = img.copy()

你可以把代碼中的“pinwheel.jpg”替換成其它你想要找出邊緣的圖片文件!需要確保此文件和代碼在同一工作目錄中。

接著編寫邊緣檢測代碼本身:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# 定義縱向過濾器
vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]]
# 定義橫向過濾器
horizontal_filter = [[-1,0,1], [-2,0,2], [-1,0,1]]
# 讀取紙風(fēng)車的示例圖片“pinwheel.jpg”
img = plt.imread('pinwheel.jpg')
# 得到圖片的維數(shù)
n,m,d = img.shape
# 初始化邊緣圖像
edges_img = img.copy()
# 循環(huán)遍歷圖片的全部像素
for row in range(3, n-2):
for col in range(3, m-2):

# 在當(dāng)前位置創(chuàng)建一個 3x3 的小方框
local_pixels = img[row-1:row+2, col-1:col+2, 0]

# 應(yīng)用縱向過濾器
vertical_transformed_pixels = vertical_filter*local_pixels
# 計算縱向邊緣得分
vertical_score = vertical_transformed_pixels.sum()/4

# 應(yīng)用橫向過濾器
horizontal_transformed_pixels = horizontal_filter*local_pixels
# 計算橫向邊緣得分
horizontal_score = horizontal_transformed_pixels.sum()/4

# 將縱向得分與橫向得分結(jié)合,得到此像素總的邊緣得分
edge_score = (vertical_score**2 + horizontal_score**2)**.5

# 將邊緣得分插入邊緣圖像中
edges_img[row, col] = [edge_score]*3
# 對邊緣圖像中的得分值歸一化,防止得分超出 0-1 的范圍
edges_img = edges_img/edges_img.max()

有幾點需要注意:

在圖片的邊界像素上,我們無法創(chuàng)建完整的 3 x 3 小方框,因此在圖片的四周會有一個細邊框。

既然是同時檢測水平方向和垂直方向的邊緣,我們可以直接將原始的縱向得分與橫向得分分別除以 4(而不像前文描述的分別加 4 再除以 8)。這個改動無傷大雅,反而可以更好地突出圖像的邊緣。

將縱向得分與橫向得分結(jié)合起來時,有可能會導(dǎo)致最終的邊緣得分超出 0-1 的范圍,因此最后還需要重新對最終得分進行標(biāo)準化。

在更復(fù)雜的圖片上運行上述代碼:

得到邊緣檢測的結(jié)果:

以上就是本文的全部內(nèi)容了!希望你了解到了一點新知識

到此這篇關(guān)于如何利用Python 進行邊緣檢測的文章就介紹到這了,更多相關(guān)python 邊緣檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python腳本實現(xiàn)datax全量同步mysql到hive

    Python腳本實現(xiàn)datax全量同步mysql到hive

    這篇文章主要和大家分享一下mysql全量同步到hive自動生成json文件的python腳本,文中的示例代碼講解詳細,有需要的小伙伴可以參加一下
    2024-10-10
  • python中IO流和對象序列化詳解

    python中IO流和對象序列化詳解

    大家好,本篇文章主要講的是python中IO流和對象序列化詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • python自動導(dǎo)入包的實現(xiàn)

    python自動導(dǎo)入包的實現(xiàn)

    本文主要介紹了python自動導(dǎo)入包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • python 2.7 檢測一個網(wǎng)頁是否能正常訪問的方法

    python 2.7 檢測一個網(wǎng)頁是否能正常訪問的方法

    今天小編就為大家分享一篇python 2.7 檢測一個網(wǎng)頁是否能正常訪問的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python FTP批量下載/刪除/上傳實例

    python FTP批量下載/刪除/上傳實例

    今天小編就為大家分享一篇python FTP批量下載/刪除/上傳實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python光學(xué)仿真通過菲涅耳公式實現(xiàn)波動模型

    python光學(xué)仿真通過菲涅耳公式實現(xiàn)波動模型

    這篇文章主要介紹了python光學(xué)仿真通過菲涅耳公式實現(xiàn)波動模型的示例解析原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python將dict中的unicode打印成中文實例

    python將dict中的unicode打印成中文實例

    這篇文章主要介紹了python將dict中的unicode打印成中文實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容(推薦)

    Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容(推薦)

    獲取文章中指定開頭、指定結(jié)尾中所夾的內(nèi)容。其中,開頭和結(jié)尾均有多種,但最多也就十幾種,所以代碼還是具有可行性的,今天小編給大家介紹通過Python?獲取指定開頭指定結(jié)尾所夾中間內(nèi)容,感興趣的朋友一起看看吧
    2023-02-02
  • NLTK 3.2.4 環(huán)境搭建教程

    NLTK 3.2.4 環(huán)境搭建教程

    這篇文章主要為大家詳細介紹了NLTK 3.2.4 環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 命令行運行Python腳本時傳入?yún)?shù)的三種方式詳解

    命令行運行Python腳本時傳入?yún)?shù)的三種方式詳解

    這篇文章主要介紹了命令行運行Python腳本時傳入?yún)?shù)的三種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論