功能實現(xiàn):利用cv.HoughLines尋找圖像中霍夫直線,然后用cv2.line繪制紅色的直線。
拓展:計算整幅圖像的平均灰度值,以及經(jīng)過篩選的霍夫直線的平均灰度值,并進行比較。
目錄
一、效果圖以及參數(shù)講解?
二、圖解霍夫直線的返回參數(shù)
三、源碼(包含注釋)
四、拓展
一、效果圖以及參數(shù)講解?
?圖1 原圖
?圖2 邊緣處理后的圖像
圖3 繪制紅色霍夫直線的圖像?
lines = cv2.HoughLines(image_edge, 1, np.pi/180, 180)
- image_edge:經(jīng)過圖像邊緣處理后的圖像
- 1:像素之間的距離為1
- np.pi/180:直線角度范圍,2pi/(pi/180) = 360°
- 180:一條預(yù)選直線上的最少像素點個數(shù)
注意:
如果距離是1,180個像素即可生成直線,如果距離是2,至少360個像素才可以生成直線。
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)?
- img:在圖像img上繪制直線
- (x1, y2)、(x2, y2):直線的兩個端點,直接相連便可得到所需直線
- (0, 0, 255):紅色
- 1:設(shè)置直線的寬度為1
注意:
直線的兩個端點可以是負數(shù)。
二、圖解霍夫直線的返回參數(shù)
cv2.HoughLines?的返回參數(shù)?line ==??,其中,第一個參數(shù)表示圖像原點距離直線的長度,第二個參數(shù)表示沿著x軸的角度大小。
如下圖所示,首先通過 cv.HoughLines 得到 line ,此時已經(jīng)確定了直線的位置,然后需要確定直線上的兩個坐標點來充當 cv.line 的輸入?yún)?shù),最后,在源圖像上通過 cv.line 來繪制紅色直線。
?圖4 圖解cv2.HoughLines的返回參數(shù)
# 延長直線的長度,保證在整幅圖像上繪制直線
x1 = int(x0 + 2000 * (-b))
y1 = int(y0 + 2000 * (a))
x2 = int(x0 - 2000 * (-b))
y2 = int(y0 - 2000 * (a))
前面講到, 霍夫直線值僅僅返回兩個參數(shù),并不會直接返回直線上的坐標點,我們在選取直線坐標點的時候,需要盡量選取圖像外部的點(即負數(shù)),這樣才會過整幅圖像繪制直線。
三、源碼(包含注釋)
import cv2
import numpy as np
from numpy import mean
# 讀取圖像以及圖像的寬和高
img = cv2.imread('./img.png')
h = img.shape[0]
w = img.shape[1]
# 求取圖像的平均灰度值
img_gray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)
all_gray = []
for i in range(h):
for j in range(w):
all_gray.append(img_gray[i, j])
print('圖像的平均灰度值:', mean(all_gray))
# Canny算子尋找圖像的邊緣
image_edge = cv2.Canny(img, 200, 200)
# 尋找霍夫直線
lines = cv2.HoughLines(image_edge, 1, np.pi/180, 180)
# 繪畫霍夫直線
if lines is not None:
for n, line in enumerate(lines):
# 沿著左上角的原點,作目標直線的垂線得到長度和角度
rho = line[0][0]
theta = line[0][1]
# if np.pi / 3 < theta < np.pi * (3 / 4):
a = np.cos(theta)
b = np.sin(theta)
# 得到目標直線上的點
x0 = a * rho
y0 = b * rho
# 延長直線的長度,保證在整幅圖像上繪制直線
x1 = int(x0 + 2000 * (-b))
y1 = int(y0 + 2000 * (a))
x2 = int(x0 - 2000 * (-b))
y2 = int(y0 - 2000 * (a))
# 連接兩點畫直線
# print((x1, y1), (x2, y2)) # (-148, 993) (335, -947)
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
# ===============================CAB================================ #
xDis = x2 - x1 # x的增量
yDis = y2 - y1 # y的增量
if (abs(xDis) > abs(yDis)):
maxstep = abs(xDis)
else:
maxstep = abs(yDis)
xUnitstep = xDis / maxstep # x每步驟增量
yUnitstep = yDis / maxstep # y的每步增量
x = x1
y = y1
average_gray = []
for k in range(maxstep):
x = x + xUnitstep
y = y + yUnitstep
# print("x: %d, y:%d" % (x, y))
if 0 < x < h and 0 < y < w:
# print(img_gray[int(x), int(y)])
average_gray.append(img[int(x), int(y)])
print('第{}霍夫直線的平均灰度值:'.format(n), mean(average_gray)) # 平均115,陰影的邊界在125以上,堵料的邊界在105左右
# ================================================================== #
print('直線的數(shù)量:', len(lines))
else:
print('直線的數(shù)量:', 0)
# 可視化圖像
cv2.imshow('0', img)
cv2.imshow('1', image_edge)
cv2.waitKey(0)
四、拓展
因項目的需求,需要比對霍夫直線和整幅圖像的平均灰度值的大小關(guān)系,所以在上面的源碼中,我把此項功能加入到其中,希望對你有所幫助。文章來源:http://www.zghlxwxcb.cn/news/detail-405980.html
>>> 如有疑問,歡迎評論區(qū)一起探討。文章來源地址http://www.zghlxwxcb.cn/news/detail-405980.html
到了這里,關(guān)于圖解 cv2.HoughLines & cv2.line 參數(shù)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!