在我的工作中,我使用 TLC,它给了我像这张照片上的物体。它是一张纸,上面有精确高度的斑点。
我需要检测板本身并进行测量。 然后我需要将其转换为这张图片:
我想我可以生成第二张图片,但我在斑点检测方面遇到了麻烦。我使用下面的代码和许多不同的参数,但我无法检测到它们。您有什么想法吗?
import numpy
import cv2
image_path="C:/Users/jules/Downloads/Start.jpg"
image = cv2.imread(image_path)
img = cv2.resize(img, (950, 1480))
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
hist = cv2.equalizeHist(gray)
blur = cv2.GaussianBlur(hist, (31,31), cv2.BORDER_DEFAULT)
_, thresh_image = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
height, width = thresh_image.shape[:2]
minR = round(width/65)
maxR = round(width/11)
minDis = round(width/7)
circles = cv2.HoughCircles(thresh_image, cv2.HOUGH_GRADIENT, 1, minDis, param1=14, param2=25, minRadius=minR, maxRadius=maxR)
if circles is not None:
circles = numpy.round(circles[0, :]).astype("int")
for (x, y, r) in circles:
cv2.circle(output, (x, y), r, (0, 255, 0), 2)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.imshow("result", numpy.hstack([image, output]))
预先感谢您的帮助!
我理解你想使用 OpenCV (cv2) 在 TLC 图像中检测斑点并测量它们。你当前的代码似乎是在寻找圆形斑点,而 TLC 斑点通常形状不规则。这就是你的 Hough 圆变换方法难以检测到它们的原因。
让我们试试一种不同的方法来检测不同形状的 TLC 斑点:
1. 图像预处理:
-
转换到灰度:
你的代码已经这样做了 (
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
)。 -
阈值化:
你需要尝试不同的阈值方法和值,以获得最佳结果。你目前使用的是二值阈值化,这可能太苛刻,并且可能会丢失信息。考虑使用自适应阈值化 (
cv2.adaptiveThreshold
),该方法可以根据图像区域更好地处理光照变化:
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
- 形态学操作: 你可以使用形态学操作(如腐蚀和膨胀)来减少噪声并改善斑点的形状。例如,要使用腐蚀去除小噪声,你可以使用:
kernel = numpy.ones((3,3), numpy.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)
2. 斑点检测:
-
轮廓检测:
Zamiast
HoughCircles
,使用cv2.findContours
检测斑点的轮廓。这将更适合不同形状的斑点。
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
- 过滤轮廓: 你可能想根据大小或纵横比等条件过滤检测到的轮廓,以去除不想要的噪声或伪影。
for c in cnts:
area = cv2.contourArea(c)
if area > 100: # 忽略太小的区域(调整此值)
cv2.drawContours(image, [c], -1, (0,255,0), 2)
3. 测量和可视化:
-
边界框: 你可以使用
cv2.boundingRect(c)
获取每个轮廓的边界框,并使用它来测量斑点高度和位置。 -
绘制: 使用
cv2.rectangle
和cv2.putText
将检测到的斑点、它们的边界框和测量值绘制在图像上,如你的目标图像中所示。
代码示例:
import cv2
import numpy
image_path = "C:/Users/jules/Downloads/Start.jpg"
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
kernel = numpy.ones((3,3), numpy.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 100:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x,y), (x+w, y+h), (0,255,0), 2)
cv2.putText(image, f"H: {h}", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)
cv2.imshow("result", image)
cv2.waitKey(0)
这只是一个起点,你可能需要根据你的特定图像和要求调整参数和步骤。例如,如果你的图像有很大的照明变化,你可能需要更先进的阈值化技术,或者如果你的斑点有非常不规则的形状,你可能需要使用不同的特征进行检测。
标签:python,opencv,geometry,shapes,detection From: 78780860