用OpenCV提高/优化等高线查找精度

2024-06-01 09:38:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试处理一个简单的应用程序,在培养皿照片上计数细菌菌落。我主要使用python和cv2库。在

我使用上面的代码:

#reading image (reading is fixed for tests) and putting Opening morphological transformation to improve edge visibility
img = cv2.imread("image1.jpg",1)
img = cv2.resize(img,(500,500))
kernel = py.ones((7,7),py.uint8)
open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

#converting colors to GRAY scale, setting threshold and contours. Setting a copy for result comprasion
img_gray = cv2.cvtColor(open, cv2.COLOR_BGR2GRAY)
copy = img.copy()
ret,thresh = cv2.threshold(img_gray,190,255,cv2.THRESH_BINARY)
im2,contours2,hierarchies = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#drawing and counting countours (colonies)
visible_colonies = 0
for contour in (contours2):
  (x,y),radius = cv2.minEnclosingCircle(contour)
  center = (int(x),int(y))
  radius = int(radius)
  if(radius>2 and radius<25):
    cv2.circle(img,center,radius,(255,0,255),2)
    visible_colonies += 1
#showing result
plt.imshow(img)
plt.show()
print(visible_colonies)
plt.imshow(copy)
plt.show()

不重要的是,结果不够精确。提供样品: orginal orginal image, and image with contours

我可以清楚地看到有许多轮廓(菌落)没有被圈起来。同时,也有一些轮廓线什么都没有。在

我所做的:

  1. 噪声处理(使用开放变换)
  2. 调整图像大小以进行标准化
  3. 改变开放核的设置,阈值,寻找轮廓和圆的半径。在
  4. 使用适应阈值

我的怀疑:

  1. 这只是一个关于threshold/kernel/finding-contours设置的试错游戏,我无法跟上
  2. 图像质量太低
  3. 图像上的噪音太大了

最后,我的问题来了——如何尽可能提高轮廓的精确性?我不想用任何简单化的方法,我希望它尽可能准确。在


Tags: and图像imgforthresholdpltcv2kernel
1条回答
网友
1楼 · 发布于 2024-06-01 09:38:25

一个好的方法是使用^{}进行颜色阈值分割。其思想是将图像转换为HSV格式,并使用较低/较高的颜色阈值来分割菌落。我们把检测到的菌落画在面具上,然后在面具上找到轮廓。在


用彩色分割的菌落涂在面膜上

enter image description here

结果

enter image description here

我们还可以记录菌落的数量

244

潜在的优化是提供更高分辨率的图像以获得更精确的结果。其他过滤器将使用cv2.contourArea()和最小阈值区域大小,如果您只想检测中/大型菌落。在

import numpy as np
import cv2

image = cv2.imread('1.png')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

lower = np.array([0, 71, 0], dtype="uint8")
upper = np.array([179, 255, 255], dtype="uint8")
mask = cv2.inRange(hsv, lower, upper)

cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

colonies = []

for c in cnts:
    cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
    colonies.append(c)

print(len(colonies))
cv2.imshow('mask', mask)
cv2.imshow('image', image)
cv2.imwrite('mask.png', mask)
cv2.imwrite('image.png', image)
cv2.waitKey()

使用此脚本可以找到下限和上限

^{pr2}$

相关问题 更多 >