我正在嘗試從下圖中提取一些情節線。如您所見,一條線很細。我的想法是消除線條(網格線和文本)周圍的噪音。

到目前為止,我想出了這段代碼來洗掉網格:
import numpy as np
import cv2
gray = cv2.imread('test.png')
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLinesP(image=edges,rho=0.01,theta=np.pi/90, threshold=100,lines=np.array([]), minLineLength=100,maxLineGap=80)
a,b,c = lines.shape
for i in range(a):
cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (255, 255, 255), 3, cv2.LINE_AA)
cv2.imwrite('result.png',gray)
之后我得到以下結果:

如您所見,地塊周圍仍然存在一些噪音,并且它們有點被切斷(不一定是完美的)。有沒有人有更好的解決方案或一些提示我可以如何改進?也許先洗掉單詞?也許直接檢測線條而不是洗掉網格等?
uj5u.com熱心網友回復:
您可以使用HSV 顏色空間分割這兩個圖并尋找藍色和橙色。這會產生一個非常干凈的二進制掩碼。讓我們看看代碼:
# Imports:
import numpy as np
import cv2
# Set image path
path = "D://opencvImages//"
fileName = "graphs.png"
# Reading an image in default mode:
inputImage = readImage(path fileName)
# BGR to HSV:
hsvImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2HSV)
腳本的第一部分將BGR影像轉換為HSV顏色空間。接下來,您需要顏色值來應用簡單的二進制閾值。棘手的部分是獲得正確的HSV 值。對于藍色圖表,適當的Hue閾值似乎來自于[85, 179],而其余通道保持打開狀態,來自[0, 255]。對于橙色,可能的Hue范圍是[11, 30]。我創建了一個包含這兩個閾值的串列:
# Array with HSV values:
hsvValues = []
# Blue range:
lowThreshold = [85, 0, 0]
highThreshold = [179, 255, 255]
# Into the list:
hsvValues.append((lowThreshold, highThreshold))
# Orange range:
lowThreshold = [11, 0, 0]
highThreshold = [30, 255, 255]
# Into the list:
hsvValues.append((lowThreshold, highThreshold))
現在,讓我們創建面具。只需遍歷HSV串列并使用以下cv2.inRange函式應用閾值:
# Create mask:
for i in range(len(hsvValues)):
# Get current thresholds:
currentLowThres = np.array(hsvValues[i][0])
currentHighThres = np.array(hsvValues[i][2])
# Apply HSV threshold:
hsvMask = cv2.inRange(hsvImage, currentLowThres, currentHighThres)
cv2.imshow("Hsv Mask", hsvMask)
cv2.waitKey(0)
這是兩個面具:
藍色情節:
橙色情節:
現在,您想使用這些資訊創建實際的線模型嗎?那是另一個問題。我會謹慎使用Hough's line transform/detection. 盡管掩碼非常干凈,但如果您嘗試通過演算法運行不太相似的影像,霍夫的線引數調整是出了名的反復無常(即困難且不可擴展),此外,我猜您可能對多個線段更感興趣每個情節而不是一條連續線,所以我會尋找一種更特別的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511627.html
