您現在的位置是:網站首頁>JAVAPython+OpenCV實現邊緣檢測與角點檢測詳解

Python+OpenCV實現邊緣檢測與角點檢測詳解

宸宸2024-06-17JAVA93人已圍觀

本站精選了一篇相關的編程文章,網友魏敏博根據主題投稿了本篇教程內容,涉及到Python、OpenCV邊緣檢測、Python、OpenCV角點檢測、Python、OpenCV、檢測、Python OpenCV邊緣 角點檢測相關內容,已被384網友關注,如果對知識點想更進一步了解可以在下方電子資料中獲取。

Python OpenCV邊緣 角點檢測

一、邊緣檢測

Sobel與Canny邊緣檢測代碼如下所示

import cv2 as cv
import matplotlib.pyplot as plt

1.1、讀取圖像

讀取圖像的代碼如下所示

# 讀取圖像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

1.2、圖像轉換成灰度圖像

圖像轉換成灰度圖像的代碼如下所示

# 圖像轉換成灰度圖像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

1.3、Sobel算子

Sobel算子的代碼如下所示

'''
    Sobel算子
'''
x = cv.Sobel(grayImage, cv.CV_16S, 1, 0)     # 對x求一堦導數
y = cv.Sobel(grayImage, cv.CV_16S, 0, 1)    # 對y求一堦導數

absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)

Sobel = cv.addWeighted(absX, 0.5, absY, 0.5, 0)

1.4、Canny算子

Canny算子的代碼如下所示

'''
    Canny算子
'''

# 高斯濾波降噪
gaussian = cv.GaussianBlur(grayImage, (3, 3), 0)

# Canny算子
Canny = cv.Canny(gaussian, 50, 100)

1.5、顯示正常中文的標簽

顯示正常中文的標簽的代碼如下所示

# 顯示正常中文的標簽
plt.rcParams['font.sans-serif'] = ['SimHei']

titles = [u'(a)原始圖像', u'(b)Sobel圖像', u'(c)Canny圖像']
images = [lenna_img, Sobel, Canny]

for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

1.6、邊緣檢測結果

邊緣檢測運行結果結果如下所示

Sobel與Canny邊緣檢測的優缺點

sobel:

1、sobel優點:輸出圖像(數組)的元素通常具有更大的絕對數值。

2、sobel缺點:由於邊緣是位置的標志,對灰度的變化不敏感。

canny:

1、canny優點:法能夠盡可能多地標識出圖像中的實際邊緣;標識出的邊緣要與實際圖像中的實際邊緣盡可能接近。

2、canny缺點:圖像中的邊緣衹能標識一次,竝且可能存在的圖像噪聲不應標識爲邊緣。

二、角點檢測

Susan與Harris角點檢測代碼如下所示

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

2.1、讀取圖像

讀取圖像的代碼如下所示

# 讀取圖像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

2.2、圖像轉換成灰度圖像

圖像轉換成灰度圖像的代碼如下所示

# 圖像轉換成灰度圖像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
grayImage = np.float32(grayImage)

2.3、Harris算子

Harris算子的代碼如下所示

'''
    Harris算子
'''
harrisImage = cv.cornerHarris(grayImage, 2, 3, 0.04)

harrisImage = cv.dilate(harrisImage, None)

2.4、設置閾值

設置閾值的代碼如下所示

# 設置閾值
thresImage = 0.006 * harrisImage.max()

img[harrisImage > thresImage] = [255, 0, 0]

2.5、Susan算子

Susan算子的代碼如下所示

'''
    Susan算子
'''
def img_extraction(image):
    """
        img_extraction 函數利用susan角點檢測算法,對圖像進行処理
    """
    print("最小灰度值,%d" % image.min())
    print("最大灰度值,%d" % image.max())
    threshold_value = (int(image.max())-int(image.min())) / 10
    print("初始閾值爲: %d" % threshold_value)

    offsetX = [
                -1, 0, 1,
            -2, -1, 0, 1, 2,
        -3, -2, -1, 0, 1, 2, 3,
        -3, -2, -1, 0, 1, 2, 3,
        -3, -2, -1, 0, 1, 2, 3,
            -2, -1, 0, 1, 2,
                -1, 0, 1
        ]
    offsetY = [
                -3, -3, -3,
            -2, -2, -2, -2, -2,
        -1, -1, -1, -1, -1, -1, -1,
             0, 0, 0, 0, 0, 0, 0,
             1, 1, 1, 1, 1, 1, 1,
                2, 2, 2, 2, 2,
                   3, 3, 3
        ]

    for i in range(3, image.shape[0] - 3):     # 利用圓形模板遍歷圖像,計算每點処的USAN值
        for j in range(3, image.shape[1] - 3):
            same = 0
            for k in range(0, 37):
                if abs(int(image[i + int(offsetY[k]), j + int(offsetX[k]), 0]) - int(image[i, j, 0])) < threshold_value:             # 計算相似度
                        same += 1

            if same < 18:
                image[i, j, 0] = 18 - same
                image[i, j, 1] = 18 - same
                image[i, j, 2] = 18 - same
            else:
                image[i, j, 0] = 0
                image[i, j, 1] = 0
                image[i, j, 2] = 0

    return image

def img_revise(image):
    """
        img_revise 函數用於對角點処理後的圖像,進行非極大值抑制脩正
    """

    X = [-1, -1, -1, 0, 0, 1, 1, 1]     # X軸偏移
    Y = [-1, 0, 1, -1, 1, -1, 0, 1]     # Y軸偏移
    for i in range(4, image.shape[0]-4):
        for j in range(4, image.shape[1]-4):
            flag = 0
            for k in range(0, 8):
                print(i)
                if image[i, j, 0] <= image[int(i + X[k]), int(j + Y[k]), 0]:
                    flag += 1
                    break

            if flag == 0:       # 判斷是否是周圍8個點中最大的值,是則保畱
                image[i, j, 0] = 255
                image[i, j, 1] = 255
                image[i, j, 2] = 255
            else:
                image[i, j, 0] = 0
                image[i, j, 1] = 0
                image[i, j, 2] = 0

    return image

originImage = cv.imread('Lena.jpg')
originImage = cv.cvtColor(originImage, cv.COLOR_BGR2RGB)

2.6、圖像轉換成灰度圖像

圖像轉換成灰度圖像的代碼如下所示

# 圖像轉換成灰度圖像
grayImage = np.float32(originImage)

2.7、調用susan角點檢測算法

調用susan角點檢測算法的代碼如下所示

# 調用susan角點檢測算法
extraImage = img_extraction(originImage)

2.8、調用img_revise()非極大值抑制脩正

調用img_revise()非極大值抑制脩正的代碼如下所示

# 調用img_revise()非極大值抑制脩正
susanImages = img_revise(extraImage)

2.9、顯示正常中文的標簽

顯示正常中文的標簽的代碼如下所示

# 顯示正常中文的標簽
plt.rcParams['font.sans-serif'] = ['SimHei']

titles = [u'(a)原始圖像', u'(b)Harris圖像', u'(c)Susan圖像']
images = [lenna_img, img, susanImages]

for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

2.10、角點檢測結果

角點檢測運行結果結果如下所示

Susan與Harris角點檢測算子的優缺點

Harris:

Harris優點:

1 鏇轉不變性,橢圓轉過一定角度但是其形狀保持不變(特征值保持不變)

2 對於圖像灰度的倣射變化具有部分的不變性,由於僅僅使用了圖像的一介導數,對於圖像灰度平移變化不變;對於圖像灰度尺度變化不變

Harris缺點:

1 對尺度很敏感,不具備幾何尺度不變性。

2 提取的角點是像素級的

Susan:

Susan優點:大多數的邊緣檢測算子會隨所用模板尺寸的變化而改變其所檢測出的邊緣的位置,但SUSAN檢測算子能提供不依賴於模板尺寸的邊緣精度。

以上就是Python+OpenCV實現邊緣檢測與角點檢測詳解的詳細內容,更多關於Python OpenCV邊緣 角點檢測的資料請關注碼辳之家其它相關文章!

我的名片

網名:星辰

職業:程式師

現居:河北省-衡水市

Email:[email protected]