Python中如何识别图片中的小苗数量

朋友种的生石花,想通过 Python 图像识别算出小苗数量,能否给个思路?谢谢


Python中如何识别图片中的小苗数量
21 回复

这个问题挺有意思的,用Python数图片里的小苗,典型的计算机视觉任务。核心思路就是图像处理+目标检测/计数。我直接给你一个基于OpenCV的实用方案,这个对背景相对简单的图片效果不错。

import cv2
import numpy as np

def count_seedlings(image_path):
    """
    统计图片中的小苗数量
    :param image_path: 图片路径
    :return: 检测到的小苗数量
    """
    # 1. 读取图片
    img = cv2.imread(image_path)
    if img is None:
        print("无法读取图片")
        return 0
    
    # 2. 转换为灰度图
    gray = cv2.cvtColor(img, cv2.cvtColor_BGR2GRAY)
    
    # 3. 高斯模糊去噪
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    
    # 4. 自适应阈值二值化(这个比固定阈值更鲁棒)
    binary = cv2.adaptiveThreshold(blurred, 255, 
                                   cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                                   cv2.THRESH_BINARY_INV, 11, 2)
    
    # 5. 形态学操作(可选,用于连接断裂部分或去除小噪点)
    kernel = np.ones((3, 3), np.uint8)
    processed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
    processed = cv2.morphologyEx(processed, cv2.MORPH_OPEN, kernel)
    
    # 6. 查找轮廓
    contours, _ = cv2.findContours(processed, cv2.RETR_EXTERNAL, 
                                   cv2.CHAIN_APPROX_SIMPLE)
    
    # 7. 过滤轮廓(根据面积排除太小的噪点)
    min_area = 50  # 这个值需要根据你的图片调整
    valid_contours = []
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > min_area:
            valid_contours.append(cnt)
    
    # 8. 在原图上绘制检测结果(可选,用于可视化)
    result_img = img.copy()
    cv2.drawContours(result_img, valid_contours, -1, (0, 255, 0), 2)
    
    # 显示结果
    cv2.imshow('Original', img)
    cv2.imshow('Processed', processed)
    cv2.imshow('Result', result_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    return len(valid_contours)

# 使用示例
if __name__ == "__main__":
    count = count_seedlings('your_image.jpg')
    print(f"检测到的小苗数量: {count}")

这个代码做了几件事:先读图转灰度,然后模糊去噪,用自适应阈值做二值化分割,接着用形态学操作清理图像,最后找轮廓并过滤。关键参数是min_area,需要根据你图片里小苗的实际大小调整。

如果图片背景复杂或者小苗之间重叠严重,这个方法可能不准。那种情况得用更高级的方法,比如基于深度学习的实例分割(Mask R-CNN之类的)。不过对于大多数简单场景,上面这个OpenCV方案够用了,而且速度快不需要GPU。

简单说就是:先用这个基础方案试试,不行再上深度学习。

无非就是提取特征

图见回复,谢谢

密集物恐惧症 想打死楼主

不懂识图,只能从图片本身说说。从顶部往下拍,每个苗都拍清晰。上面图里还带虚化人眼都数不准。。

这只是个意思,如果真正做肯定会让他垂直拍,而且要拍正拍清晰

感觉手算更快。。。

想到之前有个 PS 数瓜子数目的…

这只是一小盆,还有几十盆,手算得疯

可以把一堆一堆的大轮廓识别出来,计算面积,除以每个小苗的面积即可。

如果全都是这种图的话 别想着写代码了 老老实实把写代码的时间用来手工数吧

你看你图的上方遮挡和失焦成啥样了 肉眼都难以辨别 你还想让机器有啥作为……真的想代码自动化 先把图片质量给弄好弄稳定了再说(例如拍摄角度、距离、焦距啥的,不能每一张都不一样吧,挑战模型的普适性吗)

很有道理。

几十盆 发个外包,1 张 20 元帮忙数。

买个摄像头,以不同角度对着这个场景拍出来几百张图,手动标一下框(这里就是挺累的了用 DL )。然后选一个轻量级的 image detection 的网络,类似 AlexNet 这种就可以了,对他的 pre-trained 模型做 fine-tuned。最后应该达到的效果是,每个小植物会被框上框,数框的个数就行了。

当然自己做传统的图像算法也不错啊,各种边缘检测什么的都可以试试。

讲道理,这个玩意儿特征很鲜明.随便找个扫黄软件,来识别图中一共有多少个阴唇就可以了.

你是要笑死我。。。

回到顶部