最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python圖像處理之Hough變換檢測直線

 更新時(shí)間:2023年07月27日 16:16:55   作者:菜菜的小粉豬  
霍夫變換是一種特征檢測(feature?extraction),被廣泛應(yīng)用在圖像分析,本文將利用Hough變換實(shí)現(xiàn)直線檢測,感興趣的小伙伴可以了解一下

一、 前言

霍夫變換是一種特征檢測(feature extraction),被廣泛應(yīng)用在圖像分析(image analysis)、計(jì)算機(jī)視覺(computer vision)以及數(shù)位影像處理(digital image processing)。由RichardDuda和PeterHart在公元1972年發(fā)明,并稱之為廣義霍夫變換(generalizedHoughtransform),廣義霍夫變換和更早前1962年的PaulHough的專利有關(guān)。經(jīng)典的霍夫變換是偵測圖片中的直線,之后,霍夫變換不僅能識別直線,也能夠識別任何形狀,常見的有圓形、橢圓形。1981年,因?yàn)镈anaH.Ballard的一篇期刊論文"Generalizing the Hough transform to detect arbitrary shapes",讓霍夫變換開始流行于計(jì)算機(jī)視覺界?;舴蜃儞Q是用來辨別找出物件中的特征,例如:線條。他的算法流程大致如下,給定一個(gè)物件、要辨別的形狀的種類,算法會在參數(shù)空間(parameter space)中執(zhí)行投票來決定物體的形狀,而這是由累加空間(accumulator space)里的局部最大值(local maximum)來決定。

二、Hough 變換

一條直線可由兩個(gè)點(diǎn)A=(x1?,y1?)和B=(x2?,y2?)確定(笛卡爾坐標(biāo))

另一方面,y=kx+b也可以寫成關(guān)于(k,q)的函數(shù)表達(dá)式(霍夫空間):

空間變換過程如下圖:

變換后的空間成為霍夫空間。即:笛卡爾坐標(biāo)系中一條直線,對應(yīng)霍夫空間的一個(gè)點(diǎn)。

反過來同樣成立(霍夫空間的一條直線,對應(yīng)笛卡爾坐標(biāo)系的一個(gè)點(diǎn)):

笛卡爾坐標(biāo)系中兩個(gè)點(diǎn)對應(yīng)霍夫空間兩條線:

如果笛卡爾坐標(biāo)系三個(gè)點(diǎn)共線,對應(yīng)的霍夫空間的三條線相交于一點(diǎn)

霍夫變換的后處理的基本方式:選擇由盡可能多直線匯成的點(diǎn)。但是,按照直角坐標(biāo)系表示的話會出現(xiàn)下圖的情況:當(dāng)圖像空間中點(diǎn)共的線垂直于x軸時(shí),斜率無限大,在霍夫空間無法找到交點(diǎn)。因而,人們最終引入了極坐標(biāo)的表示法。

極坐標(biāo)下的霍夫直線檢測原理與直角坐標(biāo)系下完全一致,唯一需要重新推導(dǎo)的是與霍夫空間的極坐標(biāo)參數(shù)函數(shù):

化簡便可得到:

r=xcosθ+ysinθ

如果對于一個(gè)給定點(diǎn)(x0?,y0?),意味著每一對(r,θ)代表一條通過點(diǎn)(xθ?,yθ?)的直線。我們在極坐標(biāo)對極徑極角平面繪出所有通過它的直線, 將得到一條正弦曲線. 例如, 對于給定點(diǎn)(x0?=8和y0?=6) 我們可以繪出下圖 (在平面):

極坐標(biāo)與笛卡爾坐標(biāo)的轉(zhuǎn)換公式,從極坐標(biāo)轉(zhuǎn)換(r,θ)在笛卡爾坐標(biāo)系(x,y):

從笛卡兒坐標(biāo)轉(zhuǎn)換 (x,y) 到極坐標(biāo)(r,θ):

在極坐標(biāo)系下,其實(shí)是一樣的:極坐標(biāo)的點(diǎn)→霍夫空間的直線,只不過霍夫空間不再是[k,q]的參數(shù),而是(r,θ)。

三、直線檢測

通過上面的介紹可知,畫出x−y坐標(biāo)空間中的點(diǎn)在參數(shù)空間中對應(yīng)的曲線,然后計(jì)算參數(shù)空間中曲線的交點(diǎn),就能求得待求的參數(shù)。但還有一個(gè)問題,當(dāng)參數(shù)空間中的曲線存在多個(gè)交點(diǎn)時(shí),如何挑選出最有可能的解呢?

具體計(jì)算時(shí),可將參數(shù)空間劃分為所謂的累加單元A(θ,ρ)。如圖下圖所示,對于x−y平面的每一個(gè)非背景點(diǎn)(xk?,yk?),令 θ等于每個(gè)可取的細(xì)分值,根據(jù)θ=−xk?θ+yk?計(jì)算出對應(yīng)的ρ值,每計(jì)算出一組 A(θ,ρ),則令A(yù)(θ,ρ)=A(θ,ρ)+1。計(jì)算所有結(jié)果后,找到A(θ,ρ)的峰值對應(yīng)的θ和ρ,即可檢測直線。(θmin?,θmax?)和(ρmin?,ρmax?)是期望的參數(shù)范圍:0°≤θ≤180°和−D≤θ≤D, D是圖像對角線的長度。 θ和ρ的細(xì)分?jǐn)?shù)量決定了檢測結(jié)果的精度。

投票過程可以觀看下面的GIF,

左邊上青色的點(diǎn)代表圖像上的像素點(diǎn),黃色的代表對各個(gè)點(diǎn)不同角度搜索。右半邊是投票盤,顏色越淺代表票數(shù)越多。

四、代碼實(shí)現(xiàn)

1.hough檢測

def lines_detector_hough(img,ThetaDim=None, DistStep=None, threshold=None, halfThetaWindowSize=2,
                         halfDistWindowSize=None):
    '''
    :param img: 經(jīng)過邊緣檢測得到的二值圖
    :param ThetaDim: hough空間中theta軸的刻度數(shù)量(將[0,pi)均分為多少份),反應(yīng)theta軸的粒度,越大粒度越細(xì)
    :param DistStep: hough空間中dist軸的劃分粒度,即dist軸的最小單位長度
    :param threshold: 投票表決認(rèn)定存在直線的起始閾值
    :return: 返回檢測出的所有直線的參數(shù)(theta,dist)和對應(yīng)的索引值,
    '''
    row,col= edge.shape
    if ThetaDim == None:
        ThetaDim = 90
    if DistStep == None:
        DistStep = 1
    # 計(jì)算距離分段數(shù)量
    MaxDist = np.sqrt(row ** 2 + col ** 2)
    DistDim = int(np.ceil(MaxDist / DistStep))
    if halfDistWindowSize == None:
        halfDistWindowSize = int(DistDim /50)
    # 建立投票
    accumulator = np.zeros((ThetaDim, DistDim))  # theta的范圍是[0,pi). 在這里將[0,pi)進(jìn)行了線性映射.類似的,也對Dist軸進(jìn)行了線性映射
    #
    sinTheta = [np.sin(t * np.pi / ThetaDim) for t in range(ThetaDim)]
    cosTheta = [np.cos(t * np.pi / ThetaDim) for t in range(ThetaDim)]
    #計(jì)算距離(rho)
    for i in range(row):
        for j in range(col):
            if not edge[i, j] == 0:
                for k in range(ThetaDim):
                    accumulator[k][int(round((i * cosTheta[k] + j * sinTheta[k]) * DistDim / MaxDist))] += 1
    M = accumulator.max()
#---------------------------------------
    #非極大抑制
    if threshold == None:
        threshold = int(M * 1.369/ 10)
    result = np.array(np.where(accumulator > threshold))  # 閾值化
    #獲得對應(yīng)的索引值
    temp = [[], []]
    for i in range(result.shape[1]):
        eight_neiborhood = accumulator[
                           max(0, result[0, i] - halfThetaWindowSize + 1):min(result[0, i] + halfThetaWindowSize,
                                                                              accumulator.shape[0]),
                           max(0, result[1, i] - halfDistWindowSize + 1):min(result[1, i] + halfDistWindowSize,
                                                                             accumulator.shape[1])]
        if (accumulator[result[0, i], result[1, i]] >= eight_neiborhood).all():
            temp[0].append(result[0, i])
            temp[1].append(result[1, i])
    #記錄原圖所檢測的坐標(biāo)點(diǎn)(x,y)
    result_temp= np.array(temp)
#-------------------------------------------------------------
    result = result_temp.astype(np.float64)
    result[0] = result[0] * np.pi / ThetaDim
    result[1] = result[1] * MaxDist / DistDim
    return result,result_temp

2.畫直線代碼

def drawLines(lines, edge, color=(255, 0, 0), err=3):
    '''
    :param lines: 檢測后的直線參數(shù)
    :param edge: 原圖
    :param color: 直線的顏色
    :param err:檢測的可接受的誤差值
    :return: 無
    '''
    if len(edge.shape) == 2:
        result = np.dstack((edge, edge, edge))
    else:
        result = edge
    Cos = np.cos(lines[0])
    Sin = np.sin(lines[0])
    for i in range(edge.shape[0]):
        for j in range(edge.shape[1]):
            e = np.abs(lines[1] - i * Cos - j * Sin)
            if (e < err).any():
                result[i, j] = color
    plt.imshow(result, cmap='gray')
    plt.axis('off')
    plt.show()

3.畫hough空間代碼

def data_img(data):
    '''
    :param data: 直線上含有的點(diǎn)(x,y)
    :return: 輸出hough空間圖像
    '''
    fig = plt.figure()  # 新建畫布
    ax = axisartist.Subplot(fig, 111)  # 使用axisartist.Subplot方法創(chuàng)建一個(gè)繪圖區(qū)對象ax
    fig.add_axes(ax)
    ax.axis[:].set_visible(False)  # 隱藏原來的實(shí)線矩形
    ax.axis["x"] = ax.new_floating_axis(0, 0, axis_direction="bottom")  # 添加x軸
    ax.axis["y"] = ax.new_floating_axis(1, 0, axis_direction="bottom")  # 添加y軸
    ax.axis["x"].set_axisline_style("->", size=1.0)  # 給x坐標(biāo)軸加箭頭
    ax.axis["y"].set_axisline_style("->", size=1.0)  # 給y坐標(biāo)軸加箭頭
    t = np.arange(-np.pi / 2, np.pi / 2, 0.1)
    ax.annotate(text='x', xy=(2 * math.pi, 0), xytext=(2 * math.pi, 0.1))  # 標(biāo)注x軸
    ax.annotate(text='y', xy=(0, 1.0), xytext=(-0.5, 1.0))  # 標(biāo)注y軸
    for i in range(data.shape[1]):
        rho = data[0][i] * np.cos(t) + data[1][i] * np.sin(t)
        plt.plot(t, rho)
    plt.show()

4.檢測結(jié)果

以上就是Python圖像處理之Hough變換檢測直線的詳細(xì)內(nèi)容,更多關(guān)于Python檢測直線的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django rest framework工具包簡單用法示例

    Django rest framework工具包簡單用法示例

    這篇文章主要介紹了Django rest framework工具包簡單用法,結(jié)合匿名訪問控制的具體實(shí)例分析了Django rest framework工具包的注冊、路由設(shè)置、視圖、權(quán)限控制、配置等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • Python使用not運(yùn)算符對布爾值取反的方法

    Python使用not運(yùn)算符對布爾值取反的方法

    本文詳細(xì)介紹了Python中布爾值的取反操作,包括基本用法、非布爾值的取反、實(shí)際場景示例、注意事項(xiàng)以及自定義對象的布爾轉(zhuǎn)換,通過not運(yùn)算符,可以高效地進(jìn)行邏輯反轉(zhuǎn),需要的朋友可以參考下
    2026-02-02
  • Python實(shí)現(xiàn)將Json轉(zhuǎn)換為Xml與Markdown

    Python實(shí)現(xiàn)將Json轉(zhuǎn)換為Xml與Markdown

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)將Json轉(zhuǎn)換為Xml與Markdown格式,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解一下
    2025-07-07
  • python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法

    python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法

    本篇文章主要介紹了python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 分享11個(gè)Python自動化操作Excel的方法

    分享11個(gè)Python自動化操作Excel的方法

    這篇文章主要給大家分享的是11個(gè)Python自動化操作Excel的方法,自動化辦公,我相信很多人都有強(qiáng)烈的需求,今天我教大家如何利用Python自動化操作Excel,需要的朋友可以參考一下
    2022-02-02
  • Python如何快速在PDF中添加文字或者圖片水印

    Python如何快速在PDF中添加文字或者圖片水印

    在?PDF?文件中添加水印,是保護(hù)文檔內(nèi)容的一種常見方式,本文將為大家詳細(xì)介紹如何使用?Python?快速為?PDF?添加文字或圖片水印,希望對大家有所幫助
    2025-11-11
  • 使用Python接入OCR文字識別API的全教程

    使用Python接入OCR文字識別API的全教程

    本文介紹了Python調(diào)用OCR API進(jìn)行文字識別的全過程,包括準(zhǔn)備工作、API請求方式、Python接入示例、識別效果示例、常見優(yōu)化技巧、在線體驗(yàn)與多語言文檔等內(nèi)容,幫助讀者快速實(shí)現(xiàn)文字識別功能,需要的朋友可以參考下
    2026-04-04
  • Python pip 安裝與使用(安裝、更新、刪除)

    Python pip 安裝與使用(安裝、更新、刪除)

    pip 是 Python 包管理工具,該工具提供了對Python 包的查找、下載、安裝、卸載的功能,需要的朋友可以參考下
    2019-10-10
  • Flask配置Cors跨域的實(shí)現(xiàn)

    Flask配置Cors跨域的實(shí)現(xiàn)

    這篇文章主要介紹了Flask配置Cors跨域的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Windows下實(shí)現(xiàn)pytorch環(huán)境搭建

    Windows下實(shí)現(xiàn)pytorch環(huán)境搭建

    這篇文章主要介紹了Windows下實(shí)現(xiàn)pytorch環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

廉江市| 宜宾市| 湘乡市| 马鞍山市| 黄大仙区| 名山县| 白水县| 醴陵市| 威宁| 元江| 涿州市| 留坝县| 玉林市| 涟水县| 子长县| 鹤岗市| 黄山市| 岢岚县| 上蔡县| 本溪市| 云浮市| 阿城市| 伊吾县| 新源县| 女性| 云龙县| 定西市| 新干县| 山东省| 宜宾县| 苍梧县| 雅安市| 汉川市| 周口市| 进贤县| 文昌市| 普兰县| 大庆市| 吕梁市| 信阳市| 霍林郭勒市|