欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python利用OpenCV和skimage實現(xiàn)圖像邊緣檢測

 更新時間:2022年12月28日 08:56:52   作者:葉庭云  
提取圖片的邊緣信息是底層數(shù)字圖像處理的基本任務之一。本文將通過OpenCV和skimage的?Canny?算法實現(xiàn)圖像邊緣檢測,感興趣的可以了解一下

一、簡介

提取圖片的邊緣信息是底層數(shù)字圖像處理的基本任務之一。邊緣信息對進一步提取高層語義信息有很大的影響。大部分邊緣檢測算法都是上個世紀的了,OpenCV 的使用的算法是 Canny 邊緣檢測算法,大概是在 1986 年由 John F. Canny 提出了,似乎說明邊緣檢測算法的研究已經到達了瓶頸期。跟人眼系統(tǒng)相比,邊緣檢測算法仍然遜色不少。

Canny 邊緣檢測算法是比較出色的算法,也是一種多步算法,可用于檢測任何輸入圖像的邊緣。利用它檢測圖像邊緣時主要有以下步驟:

  • 應用高斯濾波來平滑圖像,目的是去除噪聲。
  • 計算高斯濾波器的導數(shù),計算圖像像素的梯度,得到沿x和y維度的梯度。
  • 應用非最大抑制(non-maximum suppression)技術來消除邊緣誤檢(本來不是但檢測出來是)
  • 應用雙閾值的方法來決定可能的(潛在的)邊界
  • 利用滯后閾值方法保留高于梯度幅值的像素,忽略低于低閾值的像素,實現(xiàn)邊緣追蹤。

Canny 的目標是找到一個最優(yōu)的邊緣檢測算法,最優(yōu)邊緣檢測的含義是:

  • 最優(yōu)檢測:算法能夠盡可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都盡可能小;
  • 最優(yōu)定位準則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由于噪聲影響引起檢測出的邊緣偏離物體的真實邊緣的程度最??;
  • 檢測點與邊緣點一一對應:算子檢測的邊緣點與實際邊緣點應該是一一對應。

為了滿足這些要求 Canny 使用了變分法(calculus of variations),這是一種尋找優(yōu)化特定功能的函數(shù)的方法。最優(yōu)檢測使用四個指數(shù)函數(shù)項表示,它可以由高斯函數(shù)的一階導數(shù)來近似。

二、opencv 實踐

cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None):
# 用自定義梯度
cv2.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
  • image:參表示8位輸入圖像
  • threshold1:設置的低閾值
  • threshold2:設置的高閾值
  • edges:輸出邊緣圖像,單通道8位圖像
  • apertureSize:Sobel算子的大小
  • L2gradient:一個布爾值,如果為真,則使用更精確的 L2 范數(shù)進行計算(即兩個方向的倒數(shù)的平方和再開方),否則使用 L1 范數(shù)(直接將兩個方向導數(shù)的絕對值相加)。
def opencv_canny(image):
    # 高斯模糊  降低噪聲
    blurred = cv.GaussianBlur(image, (5, 5), 0)
    # 轉為灰度圖像
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    # 計算x y 方向梯度
    grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
    edge_output = cv.Canny(grad_x, grad_y,  60, 120)
    # 英文字體   Times New Roman
    plt.rcParams['font.sans-serif'] = ['Times New Roman']

    # 可視化結果
    plt.figure(figsize=(8, 4), dpi=500)
    plt.subplot(121)
    plt.imshow(gray, cmap='gray')
    plt.title('Original Image', fontsize=18)
    plt.xticks([]), plt.yticks([])
    plt.subplot(122)
    plt.imshow(edge_output, cmap='gray')
    plt.title('Edge Image', fontsize=18)
    plt.xticks([]), plt.yticks([])
    plt.savefig("002.png", dpi=500)
    plt.show()


if __name__ == "__main__":
    # 讀取圖像  傳入
    src = cv.imread("Lenna.png")
    opencv_canny(src)

結果如下:

三、skimage 實踐

import numpy as np
from skimage.io import imread
from skimage.feature import canny
import matplotlib.pyplot as plt

# 讀取圖像
img = imread("Lenna.png", as_gray=True)
# 高斯模糊  降低噪聲
img = cv.GaussianBlur(img, (5, 5), 0)

# Canny邊緣檢測
edges = canny(img, sigma=1.6)

# 可視化結果
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.figure(figsize=(8, 4), dpi=500)
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('Original Image', fontsize=18)
plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.imshow(edges, cmap='gray')
plt.title('Edge Image', fontsize=18)
plt.xticks([]), plt.yticks([])

plt.show()

結果如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import feature


# 產生帶有噪聲的舉行圖案
im = np.zeros((128, 128))
im[32:-32, 32:-32] = 1
im = ndi.rotate(im, 15, mode='constant')  # 旋轉一定角度
im = ndi.gaussian_filter(im, 4)
im += 0.2 * np.random.random(im.shape)

# Compute the Canny filter for two values of sigma
edges1 = feature.canny(im, sigma=1)
edges2 = feature.canny(im, sigma=3)

# display results
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3, figsize=(8, 4),
                                    sharex=True, sharey=True, dpi=500)

ax1.imshow(im, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('Noisy image', fontsize=20)

ax2.imshow(edges1, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title(r'Canny filter, $\sigma=1$', fontsize=20)

ax3.imshow(edges2, cmap=plt.cm.gray)
ax3.axis('off')
ax3.set_title(r'Canny filter, $\sigma=3$', fontsize=20)

fig.tight_layout()

plt.show()

結果如下:

skimage 庫中函數(shù)

skimage.feature.canny(image, sigma=1.0,
                      low_threshold=None, high_threshold=None,
                      mask=None, use_quantiles=False)
  • sigma:高斯濾波器的標準差
  • low_threshold:Canny算法最后一步中,小于該閾值的像素直接置為0
  • high_threshold:Canny算法最后一步中,大于該閾值的像素直接置為255

以上就是Python利用OpenCV和skimage實現(xiàn)圖像邊緣檢測的詳細內容,更多關于Python圖像邊緣檢測的資料請關注腳本之家其它相關文章!

相關文章

最新評論