外國人做的網(wǎng)站嗎滄州百度推廣公司
一、邊緣檢測算子
邊緣檢測算子是用于檢測圖像中物體邊界的工具。邊緣通常表示圖像中灰度值或顏色發(fā)生顯著變化的地方。邊緣檢測有助于識別圖像中的物體形狀、輪廓和結(jié)構(gòu)。這些算子通過分析圖像的灰度或顏色梯度來確定圖像中的邊緣。
梯度算子
要得到一幅圖像的梯度,則要求在圖像的每個像素點位置處計算偏導(dǎo)數(shù)。 一階微分算子能夠檢測圖像中的亮度變化,因此在邊緣位置通常有較大的梯度值。通過檢測梯度的變化,可以找到圖像中的邊緣。
對應(yīng)的卷積模板
1、Roberts 算子
原理: 基于交叉差分的梯度算法,通過局部差分計算檢測邊緣線
通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低噪聲圖像,當(dāng)圖像邊緣接近于正45度或負(fù)45度時,該算法處理效果更理想。其缺點是對邊緣的定位不太準(zhǔn)確,提取的邊緣線條較粗。
import cv2
import numpy as np
import matplotlib.pyplot as pltimage = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
# 1.定義 Roberts 算子的卷積核
roberts_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
roberts_y = np.array([[0, 1], [-1, 0]], dtype=np.float32)
# 2.二維卷積操作
# 使用 filter2D 函數(shù)應(yīng)用 Roberts 算子卷積核
gradient_x = cv2.filter2D(image, cv2.CV_64F, roberts_x)
gradient_y = cv2.filter2D(image, cv2.CV_64F, roberts_y)# 3.計算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)# 轉(zhuǎn)換結(jié)果為8位圖像
gradient_magnitude = np.uint8(gradient_magnitude)# 顯示原圖、Roberts算子的結(jié)果和應(yīng)用結(jié)果
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis("off")plt.subplot(1, 4, 2)
plt.imshow(gradient_x, cmap='gray')
plt.title("Roberts X")
plt.axis("off")plt.subplot(1, 4, 3)
plt.imshow(gradient_y, cmap='gray')
plt.title("Roberts Y")
plt.axis("off")plt.subplot(1, 4, 4)
plt.imshow(gradient_magnitude, cmap='gray')
plt.title("Magnitude")
plt.axis("off")plt.show()
2、Prewitt 算子
Prewitt算子使用中心差分法計算梯度
相比Roberts 2×2 模板考慮更多的相鄰像素,更好地捕捉到圖像中的局部變化
import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像
img = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)# 1.使用Prewitt算子
kernelx = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtype=int)
kernely = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
# 2.卷積
gradient_x = cv2.filter2D(img, cv2.CV_64F, kernelx)
gradient_y = cv2.filter2D(img, cv2.CV_64F, kernely)
# 3
# 計算梯度幅值
gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)# 轉(zhuǎn)換結(jié)果為8位圖像
gradient_magnitude = np.uint8(gradient_magnitude)# 顯示原圖、水平梯度、垂直梯度、Prewitt算子的結(jié)果
plt.subplot(141), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
plt.subplot(142), plt.imshow(gradient_x, cmap='gray'), plt.title('X'), plt.axis('off')
plt.subplot(143), plt.imshow(gradient_y, cmap='gray'), plt.title('Y'), plt.axis('off')
plt.subplot(144), plt.imshow(gradient_magnitude, cmap='gray'), plt.title('Prewitt Operator'), plt.axis('off')
plt.show()
3、Laplace
拉普拉斯算子 Laplacian算子是基于二階導(dǎo)數(shù)的邊緣檢測算子。二階微分算子主要用于檢測圖像中的灰度變化的變化率,或者說是梯度的變化率。在邊緣處,梯度的變化率最大,因此二階微分算子會在邊緣位置產(chǎn)生較大的響應(yīng)。
import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像
img = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)# 使用拉普拉斯算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)# 轉(zhuǎn)換結(jié)果為8位圖像
laplacian = np.uint8(np.absolute(laplacian))# 顯示原圖和拉普拉斯算子的結(jié)果
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
plt.subplot(122), plt.imshow(laplacian, cmap='gray'), plt.title('Laplacian Operator'), plt.axis('off')
plt.show()
4、Canny算子
Canny基本步驟:
1.去噪:應(yīng)用高斯濾波來平滑圖像
2.找圖像的梯度,先將卷積模板分別作用x和y方向,再計算梯度幅值和方向(
)
3.非極大值抑制:保留梯度方向上的局部極大值,細(xì)化邊緣
4.確定邊緣。使用雙閾值算法確定最終的邊緣信息
import cv2
import numpy as np
import matplotlib.pyplot as plt# 讀取圖像
image = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)
# 高斯濾波降噪
gaussian = cv2.GaussianBlur(image, (5, 5), 0)
# 使用Canny算子進行邊緣檢測
edges = cv2.Canny(gaussian, 50, 150) # 50和150是Canny算子的兩個閾值,可調(diào)整# 顯示原始圖像和邊緣檢測結(jié)果
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])plt.show()
5、四種算子的比較
二、角點檢測
在角上 不管你把它朝哪個方向移動,像素值都會發(fā)生很大變化。
1.Moravec
注:權(quán)重函數(shù)當(dāng)像素位置 (x,y) 位于滑動窗口內(nèi)時,權(quán)重函數(shù)為1,否則為0。
E(u,v)越大 越可能是角點
2.harris
在Moravec 基礎(chǔ)上 泰勒展開
角點響應(yīng)函數(shù)R
3.Shi-Tomasi
Shi-Tomasi 角點檢測改進了Harris角點檢測算法的R響應(yīng)函數(shù),R響應(yīng)函數(shù)更加簡單高效。