av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何利用Python 進(jìn)行邊緣檢測(cè)

瀏覽:2日期:2022-07-08 13:34:20

為何檢測(cè)邊緣?

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

如何利用Python 進(jìn)行邊緣檢測(cè)

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

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

如何進(jìn)行邊緣檢測(cè) —— 數(shù)學(xué)

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

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

如何利用Python 進(jìn)行邊緣檢測(cè)

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

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

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

如何利用Python 進(jìn)行邊緣檢測(cè)

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

下一步是對(duì)過(guò)濾結(jié)果中的所有像素值求和,得到 -4。請(qǐng)注意,-4 其實(shí)是我們應(yīng)用這個(gè)過(guò)濾器可獲得的“最小”值(因?yàn)樵紙D片中的像素值只能在 0 到 1 之間)。因此,當(dāng)獲得 -4 這個(gè)最小值的時(shí)候,我們就能知道,對(duì)應(yīng)的像素點(diǎn)是圖像中正方形頂部豎直方向邊緣的一部分。

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

如何利用Python 進(jìn)行邊緣檢測(cè)

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

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

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

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

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

如何進(jìn)行邊緣檢測(cè) —— 代碼

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

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as plt# 定義縱向過(guò)濾器vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]]# 定義橫向過(guò)濾器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”替換成其它你想要找出邊緣的圖片文件!需要確保此文件和代碼在同一工作目錄中。

接著編寫(xiě)邊緣檢測(cè)代碼本身:

%matplotlib inlineimport numpy as npimport matplotlib.pyplot as plt# 定義縱向過(guò)濾器vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]]# 定義橫向過(guò)濾器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)建一個(gè) 3x3 的小方框local_pixels = img[row-1:row+2, col-1:col+2, 0]# 應(yīng)用縱向過(guò)濾器vertical_transformed_pixels = vertical_filter*local_pixels# 計(jì)算縱向邊緣得分vertical_score = vertical_transformed_pixels.sum()/4# 應(yīng)用橫向過(guò)濾器horizontal_transformed_pixels = horizontal_filter*local_pixels# 計(jì)算橫向邊緣得分horizontal_score = horizontal_transformed_pixels.sum()/4# 將縱向得分與橫向得分結(jié)合,得到此像素總的邊緣得分edge_score = (vertical_score**2 + horizontal_score**2)**.5# 將邊緣得分插入邊緣圖像中edges_img[row, col] = [edge_score]*3# 對(duì)邊緣圖像中的得分值歸一化,防止得分超出 0-1 的范圍edges_img = edges_img/edges_img.max()

有幾點(diǎn)需要注意:

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

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

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

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

如何利用Python 進(jìn)行邊緣檢測(cè)

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

如何利用Python 進(jìn)行邊緣檢測(cè)

以上就是本文的全部?jī)?nèi)容了!希望你了解到了一點(diǎn)新知識(shí)

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 欧美另类视频 | 国产精品理论 | 欧美日韩一区二区三区视频 | 欧美一级视频 | 99精品在线 | aaa黄色片| 成人做爰69片免费 | 中文字幕免费观看 | 国产日韩在线播放 | 亚洲视频不卡 | 中文一级片| 亚洲成人一区二区三区 | 成人一级片 | 国产成人91 | 久久综合久 | 欧美一级在线视频 | 无遮挡在线观看 | www中文字幕 | 欧美成人a| 精品视频免费 | a在线播放 | 成人av一区二区三区在线观看 | 欧美国产日韩一区二区 | 免费成年人视频 | 精品粉嫩小bbwbbwbbw | 天堂网中文| 成人免费在线观看网站 | 亚洲久久视频 | 欧美区在线 | 天堂√ | 成人a毛片| 亚洲免费视频观看 | 国产成人一区二区 | 欧美日韩少妇 | 国产视频中文字幕 | 一区二区免费视频 | 午夜福利毛片 | 日韩激情网站 | 一区视频 | 国产精品久久久久久中文字 | 欧美精品网站 |