1 邊緣檢測背景知識
邊緣即指圖像中連接在一起的像素值發(fā)生突變的像素點的集合,故邊緣檢測則為檢測出圖像中所有的邊緣
1.1 處理方法
根據(jù)邊緣像素的像素值突變的特性,可以想象到導(dǎo)數(shù)是一種即為有效的手段。而在圖像中的像素值是離散的值,故在實際邊緣檢測算法中采用差分來近似導(dǎo)數(shù)。
1.2 一階導(dǎo)數(shù)與二階導(dǎo)數(shù)的推導(dǎo)
即一階導(dǎo)數(shù)
而對于二階導(dǎo)數(shù)
又根據(jù)一階導(dǎo)數(shù)的差分公式可得
而對于上式,可知其為關(guān)于的差分,故可得到關(guān)于的差分
綜上可知
2 孤立點的檢測
2.1 拉普拉斯算子
在圖像中,灰度值的變化是雙向的——軸與軸。換句話說,在檢測邊緣像素點時,需要考慮到兩個方向的梯度。而拉普拉斯算子在二維空間的表達(dá)式為
即為兩個方向上的二階導(dǎo)數(shù)之和,而二階導(dǎo)數(shù)相對于一階導(dǎo)數(shù)對于像素點的變化更為敏感,則應(yīng)用拉普拉斯算子可十分有效的檢測到孤立點。當(dāng)然,也正因為拉普拉斯算子對于變化十分敏感,噪聲對其的影響較大。
根據(jù)1.2中二階導(dǎo)數(shù)的推導(dǎo)式,可得拉普拉斯算子如下
2.2 檢測規(guī)則
在點計算的拉普拉斯算子的絕對值大于指定的閾值時(即該點的像素值變化明顯),則認(rèn)為該點為邊緣點;對于輸出圖像中該位置為亮點。否則,為暗點。表達(dá)式如下
2.3 空間濾波器
在計算圖像中的一階導(dǎo)數(shù)與二階導(dǎo)數(shù)時,空間濾波器是常用計算方法。計算過程為模板系數(shù)與在計算點處模板所對應(yīng)的像素點的灰度值的乘積之和。當(dāng)模板系數(shù)之和為時,表示對于恒定灰度區(qū)域計算的模板想要為。
-
為模板系數(shù)的個數(shù)
-
為模板系數(shù)
-
為對于的像素值
例:計算拉普拉斯算子
空間濾波器模板
對應(yīng)灰度值
兩個矩陣元素對應(yīng)相乘相加則為拉普拉斯算子
2.4 Code
import numpy as np
def point(intput_signal, threshold):
'''
點檢測(使用于灰度圖)
:param intput_signal: 輸入圖像
:param threshold: 拉普拉斯算子閾值
:return: 點圖像
'''
intput_signal_cp = np.copy(intput_signal) # 輸入圖像的副本
m, n = intput_signal_cp.shape # 輸入圖像的尺寸(行、列)
output_signal = np.zeros((m, n)) # 檢測點的輸出
# 空間濾波模板
filtering_template = np.array([
[0, 1, 0],
[1, -4, 1],
[0, 1, 0]
])
point_matrix = np.zeros((3, 3)) # 矩陣灰度值,用于計算拉普拉斯算子
for i in range(m):
for j in range(n):
# 該像素點灰度值
point_matrix[1, 1] = intput_signal_cp[i, j]
# 該像素點周圍的點的灰度值,如若已至邊界則視為0
if i - 1 >= 0:
point_matrix[0, 1] = intput_signal_cp[i-1, j]
if i + 1 < m:
point_matrix[2, 1] = intput_signal_cp[i+1, j]
if j - 1 >= 0:
point_matrix[1, 0] = intput_signal_cp[i, j-1]
if j + 1 < n:
point_matrix[1, 2] = intput_signal_cp[i, j+1]
temp = abs(np.sum(point_matrix * filtering_template)) # 拉普拉斯算子值計算
if temp >= threshold:
output_signal[i, j] = 255 # 拉普拉斯算子大于閾值,則為亮點
else:
output_signal[i, j] = 0 #否則為暗點
point_matrix = np.zeros((3, 3)) # 重置,為下一個點做準(zhǔn)備
return output_signal
3 對比實驗
4 GitHub
click me!
|