国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV-Python中的圖像處理-霍夫變換

這篇具有很好參考價(jià)值的文章主要介紹了OpenCV-Python中的圖像處理-霍夫變換。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

霍夫變換

  • 霍夫(Hough)變換在檢測(cè)各種形狀的技術(shù)中非常流行,如果要檢測(cè)的形狀可以用數(shù)學(xué)表達(dá)式描述,就可以是使用霍夫變換檢測(cè)它。即使要檢測(cè)的形狀存在一點(diǎn)破壞或者扭曲也是可以使用。

霍夫直線變換

  1. Hough直線變換,可以檢測(cè)一張圖像中的直線
  2. cv2.HoughLines(image, rho, theta, threshold)
    • return:返回值就是( ρ, θ)。 ρ 的單位是像素, θ 的單位是弧度。
    • image:是一個(gè)二值化圖像,所以在進(jìn)行霍夫變換之前要首先進(jìn)行二值化,或者進(jìn)行Canny 邊緣檢測(cè)。
    • rho:代表 ρ 的精確度。
    • theta:代表θ 的精確度。
    • threshold:閾值,只有累加其中的值高于閾值時(shí)才被認(rèn)為是一條直線,也可以把它看成能檢測(cè)到的直線的最短長(zhǎng)度(以像素點(diǎn)為單位)。
  3. cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)
    • return :返回值就是直線的起點(diǎn)和終點(diǎn)(x1,y1,x2,y2)。
    • rho:代表 ρ 的精確度。
    • theta:代表θ 的精確度。
    • threshold:閾值,只有累加其中的值高于閾值時(shí)才被認(rèn)為是一條直線,也可以把它看成能檢測(cè)到的直線的最短長(zhǎng)度(以像素點(diǎn)為單位)。
    • minLineLength:直線的最短長(zhǎng)度。比這個(gè)短的線都會(huì)被忽略。
    • maxLineGap- 兩條線段之間的最大間隔,如果小于此值,這兩條直線就被看成是一條直線。
  4. 一條直線可以用數(shù)學(xué)表達(dá)式 y = mx + c 或者 ρ = x cos θ + y sin θ 表示。ρ 是從原點(diǎn)到直線的垂直距離, θ 是直線的垂線與橫軸順時(shí)針?lè)较虻膴A角(如果使用的坐標(biāo)系不同,方向也可能不同,這里是按 OpenCV 使用的坐標(biāo)系描述的)。如下圖所示:
    OpenCV-Python中的圖像處理-霍夫變換,OpenCV Python,python,opencv,圖像處理
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

for i in range(len(lines)):
# for rho, thetha in lines[10]:
    rho = lines[i][0][0]
    thetha = lines[i][0][1]
    a = np.cos(thetha)
    b = np.sin(thetha)
    x0 = a*rho
    y0 = b*rho
    line_length = 1000 # 線長(zhǎng)
    x1 = int(x0 + line_length*(-b))
    y1 = int(y0 + line_length*(a))
    x2 = int(x0 - line_length*(-b))
    y2 = int(y0 - line_length*(a))
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

# 因?yàn)間ray和edges都是單通道的,為了可以和原圖拼接合并,需要merge成3通道圖像數(shù)據(jù)
gray = cv2.merge((gray, gray, gray))
edges = cv2.merge((edges,edges,edges))

# 圖像拼接
res = np.hstack((gray,edges,img))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-Python中的圖像處理-霍夫變換,OpenCV Python,python,opencv,圖像處理
漸進(jìn)概率式霍夫變換
cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 150, apertureSize=3)

minLineLength = 100
maxLineGap = 10
# HoughLinesP(image: Mat, rho, theta, threshold, lines=..., minLineLength=..., maxLineGap=...) 
lines = cv2.HoughLinesP(canny, 1, np.pi/180, 100, minLineLength, maxLineGap)

print(lines.shape)
print(lines[0])

for i in range(len(lines)):
    for x1,y1,x2,y2 in lines[i]:
        cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

gray = cv2.merge((gray, gray, gray))
canny = cv2.merge((canny,canny,canny))

res = np.hstack((gray, canny, img))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-Python中的圖像處理-霍夫變換,OpenCV Python,python,opencv,圖像處理
在含有坐標(biāo)點(diǎn)集合中尋找是否存在直線:
cv2.HoughLinesPointSet(_point, lines_max, threshold, min_rho, max_rho, rho_step, min_theta, max_theta, theta_step, _lines=…)

  • _point:輸入點(diǎn)的集合,必須是平面內(nèi)的2D坐標(biāo),數(shù)據(jù)類型必須是CV_32FC2或CV_32SC2。
  • lines_max:檢測(cè)直線的最大數(shù)目。
  • threshold:累加器的閾值,即參數(shù)空間中離散化后每個(gè)方格被通過(guò)的累計(jì)次數(shù)大于閾值時(shí)則被識(shí)別為直線,否則不被識(shí)別為直線。
  • min_rho:檢測(cè)直線長(zhǎng)度的最小距離,以像素為單位。
  • max_rho:檢測(cè)直線長(zhǎng)度的最大距離,以像素為單位。
  • rho_step::以像素為單位的距離分辨率,即距離 離散化時(shí)的單位長(zhǎng)度。
  • min_theta:檢測(cè)直線的最小角度值,以弧度為單位。
  • max_theta:檢測(cè)直線的最大角度值,以弧度為單位。
  • theta_step:以弧度為單位的角度分辨率,即夾角 離散化時(shí)的單位角度。
  • _lines:在輸入點(diǎn)集合中可能存在的直線,每一條直線都具有三個(gè)參數(shù),分別是權(quán)重、直線距離坐標(biāo)原點(diǎn)的距離 和坐標(biāo)原點(diǎn)到直線的垂線與x軸的夾角 。

霍夫圓環(huán)變換

  1. 圓形的數(shù)學(xué)表達(dá)式為 (x ? xcenter)2+(y ? ycenter)2 = r2,其中( xcenter,ycenter)為圓心的坐標(biāo), r 為圓的直徑。從這個(gè)等式中我們可以看出:一個(gè)圓環(huán)需要 3個(gè)參數(shù)來(lái)確定。所以進(jìn)行圓環(huán)霍夫變換的累加器必須是 3 維的,這樣的話效率就會(huì)很低。所以 OpenCV 用來(lái)一個(gè)比較巧妙的辦法,霍夫梯度法,它可以使用邊界的梯度信息。
  2. cv2.HoughCircles(image, method, dp, minDist, circles=…, param1=…, param2=…, minRadius=…, maxRadius=…)
    • return:存儲(chǔ)檢測(cè)到的圓的輸出矢量。
    • image:輸入圖像,數(shù)據(jù)類型一般用Mat型即可,需要是8位單通道灰度圖像
    • method:使用的檢測(cè)方法,cv2.HOUGH_GRADIENT,cv2.HOUGH_GRADIENT_ALT。
    • dp:double類型的dp,用來(lái)檢測(cè)圓心的累加器圖像的分辨率于輸入圖像之比的倒數(shù),且此參數(shù)允許創(chuàng)建一個(gè)比輸入圖像分辨率低的累加器。上述文字不好理解的話,來(lái)看例子吧。例如,如果dp= 1時(shí),累加器和輸入圖像具有相同的分辨率。如果dp=2,累加器便有輸入圖像一半那么大的寬度和高度。
    • minDist:為霍夫變換檢測(cè)到的圓的圓心之間的最小距離。
    • circles:可以忽略,存儲(chǔ)檢測(cè)到的圓的輸出矢量。
    • param1:它是第三個(gè)參數(shù)method設(shè)置的檢測(cè)方法的對(duì)應(yīng)的參數(shù)。它表示傳遞給canny邊緣檢測(cè)算子的高閾值,而低閾值為高閾值的一半。
    • param2:也是第三個(gè)參數(shù)method設(shè)置的檢測(cè)方法的對(duì)應(yīng)的參數(shù),它表示在檢測(cè)階段圓心的累加器閾值。它越小的話,就可以檢測(cè)到更多根本不存在的圓,而它越大的話,能通過(guò)檢測(cè)的圓就更加接近完美的圓形了。
    • minRadius:表示圓半徑的最小值。
    • maxRadius:表示圓半徑的最大值。
import numpy as np
import cv2

img = cv2.imread('./resource/opencv/image/logo/opencv-logo2.png', cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=30, maxRadius=0)

print(circles)
circles = np.uint16(circles)
print(circles)

for i in circles[0, :]:
    cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
    cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV-Python中的圖像處理-霍夫變換,OpenCV Python,python,opencv,圖像處理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-651740.html

到了這里,關(guān)于OpenCV-Python中的圖像處理-霍夫變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • OpenCV-Python中的圖像處理-傅里葉變換

    OpenCV-Python中的圖像處理-傅里葉變換

    傅里葉變換經(jīng)常被用來(lái)分析不同濾波器的頻率特性。我們可以使用 2D 離散傅里葉變換 (DFT) 分析圖像的頻域特性。實(shí)現(xiàn) DFT 的一個(gè)快速算法被稱為快速傅里葉變換( FFT)。 對(duì)于一個(gè)正弦信號(hào):x (t) = A sin (2πft), 它的頻率為 f,如果把這個(gè)信號(hào)轉(zhuǎn)到它的頻域表示,我們會(huì)在頻率

    2024年02月12日
    瀏覽(23)
  • OpenCV-Python中的圖像處理-GrabCut算法交互式前景提取

    OpenCV-Python中的圖像處理-GrabCut算法交互式前景提取

    cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode=…) img:輸入圖像 mask:掩模圖像,用來(lái)確定那些區(qū)域是背景,前景,可能是前景/背景等。 可以設(shè)置為: cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,或者直接輸入 0,1,2,3 也行。 rect :包含前景的矩形,格式為

    2024年02月12日
    瀏覽(21)
  • OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提?。℅rabCut算法)

    OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提取(GrabCut算法)

    ??上一節(jié)我們介紹了OpenCV中傅里葉變換和模板匹配,這一部分我們來(lái)聊一聊霍夫線/圈變換的原理和應(yīng)用、使用分水嶺算法實(shí)現(xiàn)圖像分割和使用GrabCut算法實(shí)現(xiàn)交互式前景提取 ??哈嘍大家好,這里是ErrorError!,一枚某高校大二本科在讀的♂同學(xué),希望未來(lái)在機(jī)器視覺(jué)領(lǐng)域能夠有

    2023年04月08日
    瀏覽(31)
  • OpenCV-Python學(xué)習(xí)(10)—— OpenCV 圖像二值化處理(cv.threshold)

    OpenCV-Python學(xué)習(xí)(10)—— OpenCV 圖像二值化處理(cv.threshold)

    1. 學(xué)習(xí)目標(biāo) 理解圖像的分類,不同類型的圖像的區(qū)別; 對(duì)圖像進(jìn)行二值化處理,對(duì)【 cv.threshold 】函數(shù)的理解。 2. 圖像分類 2.1 不同類型圖像說(shuō)明 按照顏色對(duì)圖像進(jìn)行分類,可以分為二值圖像、灰度圖像和彩色圖像。 二值圖像: 只有黑色和白色兩種顏色的圖像。 每個(gè)像素

    2024年02月03日
    瀏覽(103)
  • 數(shù)字圖像處理(實(shí)踐篇)二十九 OpenCV-Python在圖像中檢測(cè)矩形、正方形和三角形的實(shí)踐

    數(shù)字圖像處理(實(shí)踐篇)二十九 OpenCV-Python在圖像中檢測(cè)矩形、正方形和三角形的實(shí)踐

    目錄 1 方案 2 實(shí)踐 1 方案 ①檢測(cè)矩形和正方形 ⒈檢測(cè)圖像中的所有輪廓。 ⒉循環(huán)檢查所有檢測(cè)到的輪廓。 ⒊為每個(gè)輪廓找到近似的輪廓。如果近似輪廓中的頂點(diǎn)數(shù)為4,則計(jì)算 寬高比 用來(lái)區(qū)分 矩形 和 正方形 。如果寬高比在0.9到1.1之間,則認(rèn)為為正方形,否則的話,則為

    2024年01月25日
    瀏覽(99)
  • Python-OpenCV中的圖像處理-圖像平滑

    Python-OpenCV中的圖像處理-圖像平滑

    使用低通濾波器可以達(dá)到圖像模糊的目的。這對(duì)與去除噪音很有幫助。其實(shí)就是去除圖像中的高頻成分(比如:噪音,邊界)。所以邊界也會(huì)被模糊一點(diǎn)。(當(dāng)然,也有一些模糊技術(shù)不會(huì)模糊掉邊界)。 這是由一個(gè)歸一化卷積框完成的。他只是用卷積框覆蓋區(qū)域所有像素的平

    2024年02月13日
    瀏覽(23)
  • Python-OpenCV中的圖像處理-圖像梯度

    Python-OpenCV中的圖像處理-圖像梯度

    圖像梯度,圖像邊界等 使用到的函數(shù)有: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 等 原理:梯度簡(jiǎn)單來(lái)說(shuō)就是求導(dǎo)。OpenCV 提供了三種不同的梯度濾波器,或者說(shuō)高通濾波器: Sobel,Scharr 和 Laplacian。Sobel, Scharr 其實(shí)就是求一階或二階導(dǎo)數(shù)。 Scharr 是對(duì) Sobel(使用小的卷積核求解

    2024年02月13日
    瀏覽(99)
  • Python-OpenCV中的圖像處理-圖像輪廓

    Python-OpenCV中的圖像處理-圖像輪廓

    輪廓可以簡(jiǎn)單認(rèn)為成將連續(xù)的點(diǎn)(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測(cè)和識(shí)別中很有用。 為了更加準(zhǔn)確,要使用二值化圖像。在尋找輪廓之前,要進(jìn)行閾值化處理或者 Canny 邊界檢測(cè)。 查找輪廓的函數(shù)會(huì)修改原始圖像。如果你

    2024年02月13日
    瀏覽(29)
  • Python-OpenCV中的圖像處理-圖像閥值

    Python-OpenCV中的圖像處理-圖像閥值

    與名字一樣,這種方法非常簡(jiǎn)單。但像素值高于閾值時(shí),我們給這個(gè)像素賦予一個(gè)新值(可能是白色),否則我們給它賦予另外一種顏色(也許是黑色)。這個(gè)函數(shù)就是 cv2.threshhold()。這個(gè)函數(shù)的第一個(gè)參數(shù)就是原圖像,原圖像應(yīng)該是灰度圖。第二個(gè)參數(shù)就是用來(lái)對(duì)像素值進(jìn)

    2024年02月13日
    瀏覽(19)
  • Python-OpenCV中的圖像處理-圖像直方圖

    Python-OpenCV中的圖像處理-圖像直方圖

    通過(guò)直方圖你可以對(duì)整幅圖像的灰度分布有一個(gè)整體的了解。直方圖的 x 軸是灰度值( 0 到 255), y 軸是圖片中具有同一個(gè)灰度的點(diǎn)的數(shù)目。 BINS:上面的直方圖顯示了每個(gè)灰度值對(duì)應(yīng)的像素?cái)?shù)。如果像素值為 0到255,你就需要 256 個(gè)數(shù)來(lái)顯示上面的直方圖。但是,如果你不需

    2024年02月12日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包