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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python-opencv图像处理之哈里斯角检测

發(fā)布時(shí)間:2025/3/15 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python-opencv图像处理之哈里斯角检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 理解什么是特征,為什么拐角重要等等
  • 我們將了解"Harris Corner Detection”背后的概念。
  • 我們將看到以下函數(shù):cv.cornerHarris(),cv.cornerSubPix()
    1.我們不妨先看一下下面這張圖片:
    圖像非常簡單。在圖像的頂部,給出了六個(gè)小圖像塊。你的問題是在原始圖像中找到這些補(bǔ)丁的確切位置。你可以找到多少正確的結(jié)果?

A和B是平坦的表面,它們散布在很多區(qū)域上。很難找到這些補(bǔ)丁的確切位置。

C和D更簡單。它們是建筑物的邊緣。你可以找到一個(gè)大概的位置,但是準(zhǔn)確的位置仍然很困難。這是因?yàn)檠刂吘壍拿總€(gè)地方的圖案都是相同的。但是,在邊緣,情況有所不同。因此,與平坦區(qū)域相比,邊緣是更好的特征,但不夠好(在拼圖游戲中比較邊緣的連續(xù)性很好)。

最后,E和F是建筑物的某些角落。而且很容易找到它們。因?yàn)樵诠战翘?#xff0c;無論將此修補(bǔ)程序移動(dòng)到何處,它的外觀都將有所不同。因此,它們可以被視為很好的特征。
我們?cè)趫D像中找到了特征。找到它之后,你應(yīng)該能夠在其他圖像中找到相同的圖像。怎么做?我們圍繞該特征采取一個(gè)區(qū)域,我們用自己的語言解釋它,例如“上部是藍(lán)天,下部是建筑物的區(qū)域,在建筑物上有玻璃等”,而你在另一個(gè)建筑物中搜索相同的區(qū)域圖片?;旧?#xff0c;你是在描述特征。同樣,計(jì)算機(jī)還應(yīng)該描述特征周圍的區(qū)域,以便可以在其他圖像中找到它。所謂的描述稱為特征描述。獲得特征及其描述后,你可以在所有圖像中找到相同的功能并將它們對(duì)齊,縫合在一起或進(jìn)行所需的操作。

2.我們看到角是圖像中各個(gè)方向上強(qiáng)度變化很大的區(qū)域。Chris Harris和Mike Stephens在1988年的論文《組合式拐角和邊緣檢測器》中做了一次嘗試找到這些拐角的嘗試,所以現(xiàn)在將其稱為哈里斯拐角檢測器。他把這個(gè)簡單的想法變成了數(shù)學(xué)形式。它基本上找到了(u,v)(u,v)(uv)在所有方向上位移的強(qiáng)度差異。表示如下:

E(u,v)=∑x,yw(x,y)?window?function[I(x+u,y+v)?shifted?intensity?I(x,y)?intensity]2E(u,v) = \sum_{x,y} \underbrace{w(x,y)}\text{window function} \, [\underbrace{I(x+u,y+v)}\text{shifted intensity}-\underbrace{I(x,y)}_\text{intensity}]^2E(u,v)=x,y?w(x,y)?window?function[I(x+u,y+v)?shifted?intensity?intensityI(x,y)??]2

窗口函數(shù)要么是一個(gè)矩形窗口,要么是高斯窗口,它在下面賦予了值。
我們必須最大化這個(gè)函數(shù)E(u,v)E(u,v)E(u,v)用于角檢測。這意味著,我們必須最大化第二個(gè)項(xiàng)。將泰勒擴(kuò)展應(yīng)用于上述方程,并使用一些數(shù)學(xué)步驟(請(qǐng)參考任何你喜歡的標(biāo)準(zhǔn)文本書),我們得到最后的等式:

E(u,v)≈[uv]M[uv]E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \ v \end{bmatrix}E(u,v)[u?v?]M[u?v?]

其中

M=∑x,yw(x,y)[IxIxIxIyIxIyIyIy]M = \sum_{x,y} w(x,y) \begin{bmatrix}I_x I_x & I_x I_y \ I_x I_y & I_y I_y \end{bmatrix}M=x,y?w(x,y)[Ix?Ix??Ix?Iy??Ix?Iy??Iy?Iy??]

在此,IxI_xIx?IyI_yIy?分別是在x和y方向上的圖像導(dǎo)數(shù)。(可以使用cv.Sobel()輕松找到)。

然后是主要部分。之后,他們創(chuàng)建了一個(gè)分?jǐn)?shù),基本上是一個(gè)等式,它將確定一個(gè)窗口是否可以包含一個(gè)角。

R=det(M)?k(trace(M))2R = det(M) - k(trace(M))^2R=det(M)?k(trace(M))2

其中

det(M)=λ1λ2det(M)=\lambda_1\lambda_2det(M)=λ1?λ2?
trace(M)=λ1+λ2trace(M)=\lambda_1+\lambda_2trace(M)=λ1?+λ2?
λ1\lambda_1λ1? and λ2\lambda_2λ2?MMM 的特征值
因此,這些特征值的值決定了區(qū)域是拐角,邊緣還是平坦。
當(dāng)∣R∣|R|R較小,這在λ1\lambda_1λ1?λ2\lambda_2λ2?較小時(shí)發(fā)生,該區(qū)域平坦。
當(dāng)R<0R<0R<0時(shí)(當(dāng)λ1>>λ2\lambda_1 >>\lambda_2λ1?>>λ2?時(shí)發(fā)生,反之亦然),該區(qū)域?yàn)檫叀?br /> 當(dāng)RRR很大時(shí),這發(fā)生在λ1\lambda_1λ1?λ2\lambda_2λ2?大且λ1\lambda_1λ1?~λ2\lambda_2λ2?時(shí),該區(qū)域是角。
可以用如下圖來表示:

因此,Harris Corner Detection的結(jié)果是具有這些分?jǐn)?shù)的灰度圖像。合適的閾值可為您提供圖像的各個(gè)角落。我們將以一個(gè)簡單的圖像來完成它。
OpenCV中的哈里斯角檢測

為此,OpenCV具有函數(shù)cv.cornerHarris()。其參數(shù)為: - img - 輸入圖像,應(yīng)為灰度和float32類型。 - blockSize - 是拐角檢測考慮的鄰域大小 - ksize - 使用的Sobel導(dǎo)數(shù)的光圈參數(shù)。 - k - 等式中的哈里斯檢測器自由參數(shù)。

請(qǐng)參閱以下示例:

`import numpy as np import cv2 as cv filename = 'chessboard.png' img = cv.imread(filename) gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) gray = np.float32(gray) dst = cv.cornerHarris(gray,2,3,0.04) #result用于標(biāo)記角點(diǎn),并不重要 dst = cv.dilate(dst,None) #最佳值的閾值,它可能因圖像而異。 img[dst>0.01*dst.max()]=[0,0,255] cv.imshow('dst',img) if cv.waitKey(0) & 0xff == 27:cv.destroyAllWindows()`

總結(jié)

以上是生活随笔為你收集整理的python-opencv图像处理之哈里斯角检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。