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

Python+OpenCV實現(xiàn)邊緣檢測與角點檢測詳解

 更新時間:2023年02月03日 08:39:56   作者:編程愛好者-阿新  
這篇文章主要為大家詳細介紹了如何通過Python+OpenCV實現(xiàn)邊緣檢測與角點檢測,文中的示例代碼講解詳細,對我們學(xué)習(xí)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、圖像轉(zhuǎn)換成灰度圖像

圖像轉(zhuǎn)換成灰度圖像的代碼如下所示

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

1.3、Sobel算子

Sobel算子的代碼如下所示

'''
    Sobel算子
'''
x = cv.Sobel(grayImage, cv.CV_16S, 1, 0)     # 對x求一階導(dǎo)數(shù)
y = cv.Sobel(grayImage, cv.CV_16S, 0, 1)    # 對y求一階導(dǎo)數(shù)

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、邊緣檢測結(jié)果

邊緣檢測運行結(jié)果結(jié)果如下所示

Sobel與Canny邊緣檢測的優(yōu)缺點

sobel:

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

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

canny:

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

2、canny缺點:圖像中的邊緣只能標識一次,并且可能存在的圖像噪聲不應(yīng)標識為邊緣。

二、角點檢測

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、圖像轉(zhuǎn)換成灰度圖像

圖像轉(zhuǎn)換成灰度圖像的代碼如下所示

# 圖像轉(zhuǎn)換成灰度圖像
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、設(shè)置閾值

設(shè)置閾值的代碼如下所示

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

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

2.5、Susan算子

Susan算子的代碼如下所示

'''
    Susan算子
'''
def img_extraction(image):
    """
        img_extraction 函數(shù)利用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 函數(shù)用于對角點處理后的圖像,進行非極大值抑制修正
    """

    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、圖像轉(zhuǎn)換成灰度圖像

圖像轉(zhuǎn)換成灰度圖像的代碼如下所示

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

2.7、調(diào)用susan角點檢測算法

調(diào)用susan角點檢測算法的代碼如下所示

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

2.8、調(diào)用img_revise()非極大值抑制修正

調(diào)用img_revise()非極大值抑制修正的代碼如下所示

# 調(diào)用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、角點檢測結(jié)果

角點檢測運行結(jié)果結(jié)果如下所示

Susan與Harris角點檢測算子的優(yōu)缺點

Harris:

Harris優(yōu)點:

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

2 對于圖像灰度的仿射變化具有部分的不變性,由于僅僅使用了圖像的一介導(dǎo)數(shù),對于圖像灰度平移變化不變;對于圖像灰度尺度變化不變

Harris缺點:

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

2 提取的角點是像素級的

Susan:

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

以上就是Python+OpenCV實現(xiàn)邊緣檢測與角點檢測詳解的詳細內(nèi)容,更多關(guān)于Python OpenCV邊緣 角點檢測的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)批量讀取圖片并存入mongodb數(shù)據(jù)庫的方法示例

    Python實現(xiàn)批量讀取圖片并存入mongodb數(shù)據(jù)庫的方法示例

    這篇文章主要介紹了Python實現(xiàn)批量讀取圖片并存入mongodb數(shù)據(jù)庫的方法,涉及Python文件讀取及數(shù)據(jù)庫寫入相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • Python利用pangu模塊實現(xiàn)文本格式化小工具

    Python利用pangu模塊實現(xiàn)文本格式化小工具

    其實使用pangu做文本格式標準化的業(yè)務(wù)代碼在之前就實現(xiàn)了,主要能夠?qū)⒅形奈谋疚臋n中的文字、標點符號等進行標準化。但是為了方便起來我們這里使用了Qt5將其做成了一個可以操作的頁面應(yīng)用,需要的可以了解一下
    2022-10-10
  • python實時分析日志的一個小腳本分享

    python實時分析日志的一個小腳本分享

    這篇文章主要給大家分享了一個實時分析日志的python小腳本,文中給出了詳細的介紹和示例代碼供大家參考學(xué)習(xí),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • python學(xué)習(xí) 流程控制語句詳解

    python學(xué)習(xí) 流程控制語句詳解

    下面小編就為大家?guī)硪黄猵ython學(xué)習(xí) 流程控制語句詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • python學(xué)習(xí)筆記之列表(list)與元組(tuple)詳解

    python學(xué)習(xí)筆記之列表(list)與元組(tuple)詳解

    List(列表)是Python中使用最頻繁的數(shù)據(jù)類型,而元組是另一個數(shù)據(jù)類型,類似于List(列表)。這篇文章主要給大家介紹了python學(xué)習(xí)筆記之列表(list)與元組(tuple)的相關(guān)資料,文中不僅詳細介紹了兩者的使用,還分享了list和tuple的相互轉(zhuǎn)換的方法,需要的朋友可以參考下
    2017-11-11
  • python實現(xiàn)機器學(xué)習(xí)之元線性回歸

    python實現(xiàn)機器學(xué)習(xí)之元線性回歸

    這篇文章主要為大家詳細介紹了python實現(xiàn)機器學(xué)習(xí)之元線性回歸,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python日期與時間模塊(datetime+time+Calendar+dateuil?)相關(guān)使用講解

    Python日期與時間模塊(datetime+time+Calendar+dateuil?)相關(guān)使用講解

    這篇文章主要介紹了Python日期與時間模塊(datetime+time+Calendar+dateuil?)相關(guān)使用講解,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例

    Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例

    下面小編就為大家分享一篇Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Python3多線程詳解

    Python3多線程詳解

    使用多線程,可以同時進行多項任務(wù),可以使用戶界面更友好,還可以后臺執(zhí)行某些用時長的任務(wù),同時具有易于通信的優(yōu)點。python3中多線程的實現(xiàn)使用了threading模塊,它允許同一進程中運行多個線程,本文介紹的非常詳細,,需要的朋友可以參考下
    2023-05-05
  • Django框架實現(xiàn)的普通登錄案例【使用POST方法】

    Django框架實現(xiàn)的普通登錄案例【使用POST方法】

    這篇文章主要介紹了Django框架實現(xiàn)的普通登錄案例,結(jié)合實例形式分析了Django框架使用POST方法進行頁面登錄、校驗等相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05

最新評論