计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验

目录

Hi,大家好,我是半亩花海。 本实验旨在利用 Python 和 OpenCV 库,通过图像处理边缘检测算法实现黄豆图像的自动识别和计数,并在图像上标记每个黄豆的轮廓序号

一、实验原理

  • 灰度转换:将彩色图像转换为灰度图像,减少计算复杂度。
  • 高斯平滑:使用高斯模糊来减少图像噪声。
  • Canny边缘检测:检测图像中的边缘。
  • 轮廓查找:使用OpenCV的findContours函数检测图像中的轮廓。
  • 绘制轮廓和标记:在原始图像上绘制检测到的轮廓,并标记每个轮廓的序号。

二、实验步骤

1. 图像读取与预处理

python 复制代码
import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('soybean.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 平滑处理
blurred = cv2.GaussianBlur(gray, (11, 11), 0)

soybean.jpg 图片如下所示,可自取:

2. 边缘检测

  • cv2.Canny(blurred, 30, 150):使用Canny算法进行边缘检测,参数30和150分别是低阈值和高阈值。
python 复制代码
# 使用Canny边缘检测
edges = cv2.Canny(blurred, 30, 150)

3. 轮廓检测

  • cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE):查找图像中的轮廓。RETR_EXTERNAL表示只检测外部轮廓,CHAIN_APPROX_SIMPLE表示使用简单的链式近似方法。
python 复制代码
# 查找轮廓
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

4. 标记轮廓序号

  • cv2.boundingRect(contour):计算轮廓的边界框,用于确定标注位置。
  • cv2.drawContours(image, contour, -1, (0, 255, 0), 2):绘制轮廓,绿色线条,线宽为2像素。
  • cv2.putText(image, str(i + 1), (x + w // 2, y + h // 2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2):在每个轮廓的中心位置标注序号,红色字体,字体大小为0.5,线宽为2像素。
python 复制代码
# 绘制轮廓并标记序号
for i, contour in enumerate(contours):
    # 计算轮廓的边界框,用于确定标注位置
    x, y, w, h = cv2.boundingRect(contour)

    # 绘制轮廓
    cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)

    # 在轮廓内标注序号
    cv2.putText(image, str(i + 1), (x + w // 2, y + h // 2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

三、实验结果

  • plt.figure(figsize=(10, 10)):创建一个显示窗口,大小为10x10英寸。
  • plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)):将处理后的图像转换为RGB格式并显示。
  • plt.axis('off'):关闭坐标轴显示。
  • plt.show():显示图像。
  • print(f"黄豆数量: {len(contours)}"):输出检测到的黄豆数量。
python 复制代码
# 显示结果图像
plt.figure(figsize=(10, 10))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

# 输出黄豆数量
print(f"黄豆数量: {len(contours)}")

实验结果表明:图像中的所有18个黄豆都被成功识别和标记,每个黄豆的轮廓被绿色线条清晰绘制,序号标记在轮廓中心位置附近。

四、完整代码

python 复制代码
import cv2
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('soybean.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 平滑处理
blurred = cv2.GaussianBlur(gray, (11, 11), 0)

# 使用Canny边缘检测
edges = cv2.Canny(blurred, 30, 150)

# 查找轮廓
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓并标记序号
for i, contour in enumerate(contours):
    # 计算轮廓的边界框,用于确定标注位置
    x, y, w, h = cv2.boundingRect(contour)

    # 绘制轮廓
    cv2.drawContours(image, [contour], -1, (0, 255, 0), 2)

    # 在轮廓内标注序号
    cv2.putText(image, str(i + 1), (x + w // 2, y + h // 2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

# 显示结果图像
plt.figure(figsize=(10, 10))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()

# 输出黄豆数量
print(f"黄豆数量: {len(contours)}")
相关推荐
这张生成的图像能检测吗1 小时前
(论文速读)SphereFormer:用径向窗口解决 LiDAR 远距离稀疏点的信息断连
计算机视觉·点云·3d技术·三维感知
YOLO数据集集合3 小时前
Anti-UAV 可见光与红外无人机检测数据集| 反无人机 可见光红外 多模态检测 小目标检测 Anti-UAV9076期
人工智能·目标检测·计算机视觉·目标跟踪·无人机识别·反无人机·灾害救援
工具派3 小时前
视频场景检测是怎么找到切镜头位置的?三种思路与实测
算法·计算机视觉·视频
AI棒棒牛3 小时前
YOLO26最新创新改进系列:融合 E3AD 认知注意力 Neck:具身认知增强的 FPN/PAN 特征选择机制,高效创新!
人工智能·yolo·计算机视觉·yolo26
hhzz5 小时前
OpenCV 入门到精通 09】特征检测与匹配:从 Harris 到 ORB 图像配准
人工智能·opencv·计算机视觉·开源·交互
PixelBai11 小时前
图片格式转换与 Base64 编码:JPG/PNG/WebP 选型与前端场景
图像处理
matlab代码1 天前
基于matlab模板匹配的手写体数字识别【源码78期】
人工智能·计算机视觉
AiNightVision1 天前
AI-ISP微光全彩夜视技术深度解析:如何在0.001Lux下实现全彩成像
人工智能·计算机视觉·车载系统·自动驾驶·无人机·智能家居·智能硬件
岁月蹉跎的一杯酒1 天前
ISP 黑电平校正(BLC, Black Level Calibration/Correction)
论文阅读·图像处理·isp
JAI科研1 天前
YOLO 完全指南(七):YOLO识别工程化 (上)
人工智能·深度学习·神经网络·yolo·目标检测·计算机视觉·transformer