【发布时间】:2022-01-16 23:23:17
【问题描述】:
我尝试测量单个砾石颗粒的宽度。我需要这个来识别它是细砾石还是粗砾石。你能帮我吗,我怎样才能找到砾石轮廓的两个极端部分? 到目前为止,我试图只从图片中获取轮廓。 (代码下的照片) 我当前的代码:
import cv2
import numpy as np
def empty(a):
pass
path = "materials/gr2.jpeg"
path2 = "materials/gr1.jpeg"
cv2.namedWindow("TrackBars")
#cv2.resizeWindow("TrackBars",740,280)
cv2.createTrackbar("Hue Min", "TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max", "TrackBars",179,179,empty)
cv2.createTrackbar("Sat Min", "TrackBars",0,255,empty)
cv2.createTrackbar("Sat Max", "TrackBars",255,255,empty)
cv2.createTrackbar("Val Min", "TrackBars",147,255,empty)
cv2.createTrackbar("Val Max", "TrackBars",255,255,empty)
img = cv2.imread(path)
img2 = cv2.imread(path2)
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
imgHSV2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
while True:
h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min,h_max,s_min,s_max,v_min,v_max)
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(imgHSV,lower,upper)
mask2 = cv2.inRange(imgHSV2,lower,upper)
cv2.imshow("Mask2", mask2)
cv2.imshow("Mask", mask)
cv2.waitKey(1)
【问题讨论】:
-
你需要“纹理分析”。你可能从傅立叶变换中得到一些东西。您还需要知道相机的视野和到砾石的距离,或者保持这两个因素不变。 -- 你提供的代码在估计图片中砾石的粒度方面没有任何作用。
-
我没有在傅立叶中看到立即有用的东西,但是高斯的差异(带通)可以帮助对其进行分类。无论如何,纹理分析。广阔的领域,大量的出版物。
-
我认为这些图片不适合测量单个颗粒的大小。
-
在一张图片中测量平均粒度还不够吗?
-
您可以尝试“超像素”作为其近似值。这是一种纹理敏感的分割,除了它比“对象”更进一步地分解事物。对于这些砾石的照片,它可能会起作用。看到结果会很有趣。 docs.opencv.org/3.4/df/d6c/group__ximgproc__superpixel.html
标签: python opencv object-detection