日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(计算机视觉课程-笔记1)图像边缘检测

發布時間:2024/1/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (计算机视觉课程-笔记1)图像边缘检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖像邊緣檢測

1. sobel 算子

Sobel算子是一種常用于圖像處理和計算機視覺中的邊緣檢測算法。它用于識別圖像中的邊緣區域,即圖像中灰度值發生劇烈變化的地方。Sobel算子基于圖像的灰度梯度,通過計算每個像素點周圍像素的灰度值差異,來確定邊緣的位置和方向。

Sobel算子主要由兩個3x3的矩陣組成,分別用于計算圖像在水平和垂直方向的梯度。這兩個矩陣通常被稱為Sobel算子模板或卷積核。下面是水平和垂直方向的Sobel算子模板示例:

水平方向Sobel算子模板(Gx):

-1 0 1 -2 0 2 -1 0 1

垂直方向Sobel算子模板(Gy):

-1 -2 -10 0 01 2 1

Sobel算子的計算過程如下:

首先,將Sobel算子模板與圖像的每個像素進行卷積操作。對于每個像素,將其與周圍的8個像素進行乘法運算,然后將乘積相加得到一個結果。對于水平方向的Sobel算子,將像素與模板進行乘法運算后相加的結果表示圖像在水平方向上的梯度。對于垂直方向的Sobel算子,將像素與模板進行乘法運算后相加的結果表示圖像在垂直方向上的梯度。在水平和垂直方向上的梯度計算完成后,可以通過以下公式來計算圖像中每個像素的梯度幅值和梯度方向:梯度幅值(G):G = sqrt(Gx^2 + Gy^2) 梯度方向(θ):θ = atan2(Gy, Gx) 最后,可以根據梯度幅值進行邊緣檢測。一般來說,梯度幅值越大的像素點,很可能是圖像中的邊緣點。

Sobel算子是一種簡單而有效的邊緣檢測算法,常用于圖像處理任務中。它可以幫助我們在圖像中找到邊緣信息,并在計算機視覺領域中的對象檢測、圖像分割等任務中發揮重要作用。

1. 2sobel 算子(cv2實現)

import cv2 import numpy as np# 讀取圖像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 計算水平方向和垂直方向上的Sobel梯度 sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)# 將梯度值轉換為絕對值 sobel_x = np.absolute(sobel_x) sobel_y = np.absolute(sobel_y)# 將梯度值縮放到0-255范圍內 sobel_x = np.uint8(sobel_x) sobel_y = np.uint8(sobel_y)# 將水平和垂直方向上的梯度值合并 sobel_combined = cv2.bitwise_or(sobel_x, sobel_y)# 顯示原始圖像和Sobel邊緣檢測結果 cv2.imshow('Original Image', image) cv2.imshow('Sobel X', sobel_x) cv2.imshow('Sobel Y', sobel_y) cv2.imshow('Sobel Combined', sobel_combined) cv2.waitKey(0) cv2.destroyAllWindows()# 函數cv2.Sobel()用于計算圖像的Sobel梯度。下面是該函數的參數及其含義的解釋:# image:輸入圖像。這應該是一個單通道灰度圖像(如使用參數cv2.IMREAD_GRAYSCALE加載的圖像),或者可以是多通道圖像,其中僅考慮一個通道進行邊緣檢測。# cv2.CV_64F:輸出圖像的數據類型。這里我們使用cv2.CV_64F表示64位浮點型數據,以便在計算梯度時能夠保留負數值。# 1:x方向上的差分階數。這指定了在x方向上計算梯度時使用的差分階數,設置為1表示使用一階導數。# 0:y方向上的差分階數。這指定了在y方向上計算梯度時使用的差分階數,設置為0表示不在y方向上計算梯度。# ksize=3:Sobel算子的卷積核大小。它定義了在計算梯度時要使用的卷積核的大小。在這種情況下,ksize=3表示使用一個3x3的卷積核。# 請注意,Sobel算子可以在x方向和y方向上分別計算梯度,通過使用不同的差分階數來指定。在上述示例中,我們選擇在x方向上計算一階導數(水平方向) # ,而在y方向上不計算梯度。這是因為Sobel算子通常用于檢測圖像中的水平邊緣。如果您希望檢測垂直邊緣,可以將x和y方向的差分階數進行交換。

2. Prewitt算子

Prewitt算子是一種常用于圖像處理和計算機視覺中的邊緣檢測算法,類似于Sobel算子。它也用于檢測圖像中的邊緣區域,即圖像中灰度值發生劇烈變化的地方。Prewitt算子基于圖像的灰度梯度,通過計算每個像素點周圍像素的灰度值差異來確定邊緣的位置和方向。

Prewitt算子與Sobel算子類似,都使用兩個3x3的矩陣來計算圖像的梯度。下面是水平和垂直方向的Prewitt算子模板示例:

水平方向Prewitt算子模板(Gx):

-1 0 1 -1 0 1 -1 0 1

垂直方向Prewitt算子模板(Gy):

-1 -1 -10 0 01 1 1

Prewitt算子的計算過程與Sobel算子類似:

首先,將Prewitt算子模板與圖像的每個像素進行卷積操作。對于每個像素,將其與周圍的8個像素進行乘法運算,然后將乘積相加得到一個結果。對于水平方向的Prewitt算子,將像素與模板進行乘法運算后相加的結果表示圖像在水平方向上的梯度。對于垂直方向的Prewitt算子,將像素與模板進行乘法運算后相加的結果表示圖像在垂直方向上的梯度。可以通過以下公式計算圖像中每個像素的梯度幅值和梯度方向:梯度幅值(G):G = sqrt(Gx^2 + Gy^2) 梯度方向(θ):θ = atan2(Gy, Gx) 最后,可以根據梯度幅值進行邊緣檢測。梯度幅值較大的像素點可能表示圖像中的邊緣點。

Prewitt算子與Sobel算子相比,差別較小。它們的模板略有不同,因此在某些情況下,Prewitt算子可能產生略微不同的邊緣檢測結果。在實際應用中,您可以根據任務的要求選擇使用Sobel算子還是Prewitt算子。

2.2 Prewitt算子(cv2實現)

import cv2 import numpy as np# 讀取圖像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 構建Prewitt算子的卷積核 kernel_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32) kernel_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32)# 使用filter2D函數進行卷積運算 prewitt_x = cv2.filter2D(image, -1, kernel_x) prewitt_y = cv2.filter2D(image, -1, kernel_y)# 將梯度值轉換為絕對值 prewitt_x = np.absolute(prewitt_x) prewitt_y = np.absolute(prewitt_y)# 將梯度值縮放到0-255范圍內 prewitt_x = np.uint8(prewitt_x) prewitt_y = np.uint8(prewitt_y)# 將水平和垂直方向上的梯度值合并 prewitt_combined = cv2.bitwise_or(prewitt_x, prewitt_y)# 顯示原始圖像和Prewitt邊緣檢測結果 cv2.imshow('Original Image', image) cv2.imshow('Prewitt X', prewitt_x) cv2.imshow('Prewitt Y', prewitt_y) cv2.imshow('Prewitt Combined', prewitt_combined) cv2.waitKey(0) cv2.destroyAllWindows()

2.3 Prewitt算子與sobel算子對比

Sobel算子和Prewitt算子是兩種常用的邊緣檢測算子,它們在計算邊緣梯度時略有不同。下面是Sobel算子和Prewitt算子之間的主要差別:
1 模板差異:
Sobel算子的水平方向和垂直方向的模板分別為:

Gx = [[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]]Gy = [[-1, -2, -1],[ 0, 0, 0],[ 1, 2, 1]]

Prewitt算子的水平方向和垂直方向的模板分別為:

Gx = [[-1, 0, 1],[-1, 0, 1],[-1, 0, 1]]Gy = [[-1, -1, -1],[ 0, 0, 0],[ 1, 1, 1]]

2 靈敏度差異:
Sobel算子的模板在中心位置權重較大,因此對中心像素的梯度響應更為敏感。
Prewitt算子的模板在水平和垂直方向上的權重相等,對中心像素和周圍像素的梯度響應相對均衡。
3 梯度估計:
由于Sobel算子的模板權重較大,它更適合在邊緣具有較高對比度的圖像中進行梯度估計。
Prewitt算子在邊緣具有較弱對比度的圖像中也能提供較好的梯度估計。
4 計算效率:
由于Sobel算子的模板中存在更多非零權重,計算Sobel算子的梯度可能稍微更為耗時。
Prewitt算子的模板中非零權重較少,計算Prewitt算子的梯度相對較快。

3. canny算子

Canny算子是一種常用的邊緣檢測算法,由John F. Canny于1986年提出。它被廣泛應用于計算機視覺和圖像處理領域,用于檢測圖像中的邊緣。Canny算子在邊緣檢測中具有較高的準確性和良好的噪聲抑制能力。

Canny算子的邊緣檢測過程包括以下幾個步驟:

1:噪聲抑制: 首先,對輸入圖像進行高斯濾波以減少噪聲的影響。高斯濾波平滑圖像,通過計算每個像素周圍鄰域內像素的加權平均值來達到這一目的。

2:梯度計算: 然后,使用Sobel算子計算圖像的梯度。Sobel算子分別在水平和垂直方向上對圖像進行卷積操作,得到每個像素點的梯度強度和梯度方向。

3:非極大值抑制: 接下來,執行非極大值抑制來細化邊緣。對于每個像素點,根據其梯度方向,檢查它是否為該方向上局部梯度的極大值。如果不是極大值,則被抑制。

4:雙閾值處理: 通過雙閾值處理來確定真正的邊緣。設置兩個閾值:低閾值和高閾值。根據像素的梯度強度,將像素分為強邊緣、弱邊緣和非邊緣三類。只有當像素的梯度強度超過高閾值時,才被認為是強邊緣。如果像素的梯度強度低于低閾值,則被視為非邊緣。位于兩個閾值之間的像素被認為是弱邊緣。可以選擇執行邊緣連接來連接強邊緣與與之相鄰的弱邊緣。

5:邊緣連接: 可選的邊緣連接步驟可以通過將弱邊緣與相鄰的強邊緣連接起來,從而形成完整的邊緣。這可以通過在弱邊緣的鄰域內查找強邊緣來實現。

Canny算子的輸出結果是二進制圖像,其中邊緣像素被標記為白色(255),非邊緣像素被標記為黑色(0)。

3.2 非極大值抑制

非極大值抑制(Non-Maximum Suppression,簡稱NMS)是Canny邊緣檢測算法中的一個重要步驟,用于細化邊緣并保留邊緣的細節信息。該步驟通過在梯度方向上進行比較,僅保留局部梯度的極大值,將非極大值抑制。

以下是非極大值抑制的詳細步驟:

梯度計算: 首先,在Canny算子的邊緣檢測過程中,通過應用Sobel算子計算圖像的梯度。這會得到每個像素點的梯度強度(Gradient Magnitude)和梯度方向(Gradient Direction)。

梯度方向量化: 將梯度方向量化為四個主要方向之一:0°(垂直)、45°(對角線)、90°(水平)和135°(對角線)。這樣可以將梯度方向劃分為四個離散的方向。

非極大值抑制: 對于每個像素點,沿著梯度方向的正負兩個方向上比較其梯度強度。如果該像素點的梯度強度大于其兩側的像素點(在梯度方向上)的梯度強度,則保留該像素點。否則,將其抑制為非邊緣點。

具體步驟如下:

對于每個像素點P,找到其相鄰的兩個像素點(在梯度方向上),即正方向像素點和負方向像素點。
檢查像素點P的梯度強度是否大于這兩個相鄰像素點的梯度強度。如果是,則保留像素點P為邊緣點。否則,將像素點P抑制為非邊緣點。
這個過程將會細化邊緣,并保留了局部梯度的極大值,去除了不符合極大值條件的非邊緣像素。

非極大值抑制的結果是一個二值圖像,其中只有邊緣像素被標記為白色(255),非邊緣像素被標記為黑色(0)。

通過應用非極大值抑制,Canny算子可以在梯度方向上細化邊緣,使其變得更細,并保留了邊緣的細節信息。這一步驟對于提高邊緣檢測的準確性和保留重要邊緣特征至關重要。

3.3canny算子cv代碼

import cv2# 讀取圖像 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 高斯濾波 blurred = cv2.GaussianBlur(image, (5, 5), 0)# 計算梯度 gradient = cv2.Canny(blurred, 50, 150) # 低閾值和高閾值# 顯示結果 cv2.imshow('Original Image', image) cv2.imshow('Canny Edge Detection', gradient) cv2.waitKey(0) cv2.destroyAllWindows() 使用cv2.imread()函數讀取圖像,并將其轉換為灰度圖像(使用cv2.IMREAD_GRAYSCALE參數)。對圖像進行高斯濾波,通過cv2.GaussianBlur()函數實現。這一步驟可以減少噪聲對邊緣檢測的影響。函數的第二個參數是濾波器的大小,這里設置為(5, 5),第三個參數是高斯核的標準差,設置為0表示根據濾波器大小自動計算。使用cv2.Canny()函數進行Canny邊緣檢測。函數的第二個和第三個參數是低閾值和高閾值,根據圖像的特性可以調整這兩個閾值。一般來說,低閾值用于邊緣連接,高閾值用于邊緣起始。最后,使用cv2.imshow()函數顯示原始圖像和Canny邊緣檢測結果。注意:在運行代碼之前,需要將image.jpg替換為實際的圖像文件路徑。

4 Roberts算子

Roberts算子是一種經典的邊緣檢測算子,用于在圖像中檢測邊緣。它是由Lawrence Roberts于1963年提出的。Roberts算子基于離散微分的概念,通過計算像素點與其鄰域像素之間的差異來確定邊緣的存在。

Roberts算子使用兩個2×2的卷積核來計算圖像的水平和垂直梯度。這兩個卷積核如下:

水平梯度卷積核(Gx):

1 00 -1

垂直梯度卷積核(Gy):

0 1 -1 0

Roberts算子的邊緣檢測步驟如下:

將輸入圖像轉換為灰度圖像(如果不是灰度圖像)。

對灰度圖像分別使用水平梯度卷積核(Gx)和垂直梯度卷積核(Gy)進行卷積操作,得到水平梯度圖像和垂直梯度圖像。

計算邊緣強度圖像。可以使用以下公式計算每個像素點的邊緣強度:

edge_strength = sqrt(Gx^2 + Gy^2)

其中,Gx和Gy分別為水平梯度圖像和垂直梯度圖像中的像素值。

可選的閾值處理:根據設定的閾值,將邊緣強度圖像進行閾值處理,將高于閾值的像素標記為邊緣點,低于閾值的像素標記為非邊緣點。

Roberts算子的輸出結果是一個二值圖像,其中邊緣像素被標記為白色(255),非邊緣像素被標記為黑色(0)。

盡管Roberts算子是邊緣檢測的一種基礎算子,但由于其簡單性和計算效率,仍然在某些場景下使用。然而,它對于噪聲敏感,并且在邊緣檢測的準確性和連續性方面可能不如其他更高級的算子(如Sobel、Prewitt和Canny等)。

總結

以上是生活随笔為你收集整理的(计算机视觉课程-笔记1)图像边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。