【问题标题】:how can I count the number of grains in this image我如何计算这张图片中的谷物数量
【发布时间】:2021-08-26 00:00:23
【问题描述】:

我需要返回图像中存在的谷物数量。有很多谷物存在,它们都是重叠的。有人可以帮我解决这个问题吗?提前致谢。

这里的目标是使用 OpenCV 和 Python 创建一些分割算法来分割每个颗粒并计算图像中的颗粒数量。

【问题讨论】:

  • 您可以尝试使用 canny 过滤器和 open cv,并寻找圆圈。这是一个很好的起点:pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny
  • 别用canny,这里没用。物理上确保这些颗粒不重叠。您需要图片的分段。使用普通阈值,看看它是否足够好。然后使用cv.findContours 或查找连接的组件。如果不能确保颗粒是分开的,则需要 DNN 来很好地解决这个问题。
  • 你可以尝试如下post的分水岭分割。

标签: python opencv image-processing


【解决方案1】:

这不是一个完整的算法;并且肯定有错误,并且可能不适用于所有测试用例。但这可能是一个很好的起点。你必须花时间;探索不同的想法;查看不同的测试用例;学习和探索图像处理技术以实现更好的输出。

import sys
import cv2
import numpy as np

# Load image
im = cv2.imread(sys.path[0]+'/im.png', cv2.IMREAD_GRAYSCALE)
H, W = im.shape[:2]

# Remove noise
im = cv2.medianBlur(im, 9)
im = cv2.GaussianBlur(im, (11, 11), 21)

# Find outlines
im = cv2.adaptiveThreshold(
    im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 61, 2)
top1 = im.copy()

# Fill area with black to find seeds
cv2.floodFill(im, np.zeros((H+2, W+2), np.uint8), (0, 0), 0)
im = cv2.erode(im, np.ones((5, 5)))
top2 = im.copy()

# Find seeds
cnts, _ = cv2.findContours(im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# Convert GRAY instances to BGR
top1 = cv2.cvtColor(top1, cv2.COLOR_GRAY2BGR)
top2 = cv2.cvtColor(top2, cv2.COLOR_GRAY2BGR)
im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)

# Draw circle around detected seeds
c = 0
for cnt in cnts:
    x, y, w, h = cv2.boundingRect(cnt)
    cv2.circle(im, (x+w//2, y+h//2), max(w, h)//2, (c, 150, 255-c), 3)
    c += 5
im=~im

# Print number of seeds
print(len(cnts))

# Save output
cv2.imwrite(sys.path[0]+'/out.png', np.hstack((top1,top2,im)))

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多