使用opencv相關(guān)函數(shù)確定圖片中的直線問(wèn)題
使用opencv相關(guān)函數(shù)確定圖片中的直線
#pip install opencv-python==4.4.0.42 opencv-contrib-python==4.4.0.42 import cv2 import numpy as np from matplotlib import pyplot as plt import matplotlib.image as mpimg import matplotlib as mpl from PIL import Image mpl.rcParams['figure.dpi'] = 200 #加載圖像 img = cv2.imread('test.png') plt.axis('off') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show() #灰度圖像 img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #cornerHarris要求img是flaot32位 img1 = np.float32(img1) #Harris角點(diǎn)檢測(cè)函數(shù) # ? img - 數(shù)據(jù)類型為 float32 的輸入圖像。 # ? blockSize - 角點(diǎn)檢測(cè)中要考慮的領(lǐng)域大小。 # ? ksize - Sobel 求導(dǎo)中使用的窗口大小 # ? k - Harris 角點(diǎn)檢測(cè)方程中的自由參數(shù),取值參數(shù)為 [0,04,0.06]. dst = cv2.cornerHarris(img1,10,3,0.04) plt.axis('off') plt.imshow(dst, cmap='gray') plt.show() #膨脹 dst = cv2.dilate(dst,None) plt.axis('off') plt.imshow(dst, cmap='gray') plt.show() #顯示經(jīng)過(guò)處理后的圖片 threshold = 0.01*dst.max() img[dst>threshold]=[255,0,0] #[255,0,0] - 點(diǎn)的顏色:藍(lán)色, [0,255,0] - 綠色, [0,0,255] - 紅色, #[0,0,0] -白色, [255,255,255] - 黑色 plt.axis('off') plt.imshow(img, cmap='gray') plt.show() #使用另一種角點(diǎn)檢測(cè)函數(shù) corners = cv2.goodFeaturesToTrack(gray, 6, 0.01, 5) corners = np.int0(corners) for i in corners: x, y = i.ravel() cv2.circle(img, (x, y), 5, [0,0,0], -1) plt.axis('off') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show() #直線檢測(cè) img = cv2.imread("road.jpeg") plt.axis('off') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show() #canny 方法檢測(cè)邊緣 返回二值圖像 edges = cv2.Canny(gray, 150, 300) plt.axis('off') plt.imshow(edges, cmap='gray') plt.show() #HoughLinesP方法判斷哪些邊緣是直線 lines = cv2.HoughLinesP(edges, rho=1.0,theta=np.pi/180,threshold=20,minLineLength=30,maxLineGap=10) line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) line_color = [0, 255, 0] line_thickness = 2 dot_color = [0, 255, 0] dot_size = 3 #講檢測(cè)的直線疊加到原圖 for line in lines: for x1, y1, x2, y2 in line: cv2.line(line_img, (x1, y1), (x2, y2), line_color, line_thickness) cv2.circle(line_img, (x1, y1), dot_size, dot_color, -1) cv2.circle(line_img, (x2, y2), dot_size, dot_color, -1) final = cv2.addWeighted(img, 0.8, line_img, 1.0, 0.0) plt.axis('off') plt.imshow(cv2.cvtColor(final, cv2.COLOR_BGR2RGB)) plt.show()
OpenCV:直線檢測(cè)
主要介紹OpenCV自帶的直線檢測(cè)函數(shù)HoughLines()的用法,這個(gè)函數(shù)的第一個(gè)參數(shù)是一個(gè)二值化圖像,所以在進(jìn)行霍夫變換之前要首先進(jìn)行二值化,或者進(jìn)行Canny 邊緣檢測(cè)。第二和第三個(gè)值分別代表β 和 θ 的精確度。
第四個(gè)參數(shù)是閾值,只有累加其中的值高于閾值時(shí)才被認(rèn)為是一條直線,也可以把它看成能檢測(cè)到的直線的最短長(zhǎng)度(以像素點(diǎn)為單位)。返回值就是(β; θ)。β 的單位是像素,θ的單位是弧度。
看代碼
#直線檢測(cè) #使用霍夫直線變換做直線檢測(cè),前提條件:邊緣檢測(cè)已經(jīng)完成 import cv2 as cv import numpy as np import matplotlib.pylab as plt #標(biāo)準(zhǔn)霍夫線變換 def line_detection(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize參數(shù)默認(rèn)其實(shí)就是3 cv.imshow("edges", edges) lines = cv.HoughLines(edges, 1, np.pi/180, 80) for line in lines: rho, theta = line[0] #line[0]存儲(chǔ)的是點(diǎn)到直線的極徑和極角,其中極角是弧度表示的。 a = np.cos(theta) #theta是弧度 b = np.sin(theta) x0 = a * rho #代表x = r * cos(theta) y0 = b * rho #代表y = r * sin(theta) x1 = int(x0 + 1000 * (-b)) #計(jì)算直線起點(diǎn)橫坐標(biāo) y1 = int(y0 + 1000 * a) #計(jì)算起始起點(diǎn)縱坐標(biāo) x2 = int(x0 - 1000 * (-b)) #計(jì)算直線終點(diǎn)橫坐標(biāo) y2 = int(y0 - 1000 * a) #計(jì)算直線終點(diǎn)縱坐標(biāo) 注:這里的數(shù)值1000給出了畫出的線段長(zhǎng)度范圍大小,數(shù)值越小,畫出的線段越短,數(shù)值越大,畫出的線段越長(zhǎng) cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #點(diǎn)的坐標(biāo)必須是元組,不能是列表。 cv.imshow("image-lines", image) #統(tǒng)計(jì)概率霍夫線變換 def line_detect_possible_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize參數(shù)默認(rèn)其實(shí)就是3 lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5) for line in lines: x1, y1, x2, y2 = line[0] cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) cv.imshow("line_detect_possible_demo",image) src = cv.imread(r'..\edge.jpg') print(src.shape) cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) cv.imshow('input_image', src) line_detection(src) src = cv.imread(r'..\edge.jpg') #調(diào)用上一個(gè)函數(shù)后,會(huì)把傳入的src數(shù)組改變,所以調(diào)用下一個(gè)函數(shù)時(shí),要重新讀取圖片 line_detect_possible_demo(src) cv.waitKey(0) cv.destroyAllWindows()
看效果
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python自動(dòng)化操作之動(dòng)態(tài)驗(yàn)證碼、滑動(dòng)驗(yàn)證碼的降噪和識(shí)別
很多網(wǎng)站登錄都需要輸入驗(yàn)證碼,如果要實(shí)現(xiàn)自動(dòng)登錄就不可避免的要識(shí)別驗(yàn)證碼,下面這篇文章主要給大家介紹了關(guān)于python自動(dòng)化操作之動(dòng)態(tài)驗(yàn)證碼、滑動(dòng)驗(yàn)證碼的降噪和識(shí)別,需要的朋友可以參考下2021-08-08Python實(shí)現(xiàn)隨機(jī)森林算法的示例代碼
隨機(jī)森林的英文是 Random Forest,英文簡(jiǎn)寫是 RF,也是常用的人工智能算法,本文為大家介紹了Python實(shí)現(xiàn)隨機(jī)森林算法的示例代碼,希望對(duì)大家有所幫助2023-06-06Python操作excel的方法總結(jié)(xlrd、xlwt、openpyxl)
這篇文章主要給大家介紹了關(guān)于Python操作excel的一些方法,其中包括xlrd、xlwt、openpyxl的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09pyqt 實(shí)現(xiàn)QlineEdit 輸入密碼顯示成圓點(diǎn)的方法
今天小編就為大家分享一篇pyqt 實(shí)現(xiàn)QlineEdit 輸入密碼顯示成圓點(diǎn)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06pycharm中TensorFlow調(diào)試常見(jiàn)問(wèn)題小結(jié)
本文主要介紹了在pycharm下調(diào)用tensorflow庫(kù)時(shí)會(huì)出現(xiàn)的問(wèn)題,在本文做個(gè)小結(jié),也給自己留個(gè)筆記,感興趣的可以了解一下2021-06-06Python?Pandas聚合函數(shù)的應(yīng)用示例
Pandas是當(dāng)前Python數(shù)據(jù)分析中最為重要的工具,其提供了功能強(qiáng)大且靈活多樣的API,可以滿足使用者在數(shù)據(jù)分析和處理中的多種選擇和實(shí)現(xiàn)方式,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas聚合函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-07-07通過(guò)python連接Linux命令行代碼實(shí)例
這篇文章主要介紹了通過(guò)python連接Linux命令行代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02一個(gè)基于flask的web應(yīng)用誕生(1)
這篇文章主要為大家詳細(xì)介紹了基于flask的web應(yīng)用誕生,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Python學(xué)習(xí)筆記之自定義函數(shù)用法詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之自定義函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了自定義函數(shù)的功能、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-06-06