实验目的

1,通过阈值分割将原图像转变为二值图像
2,找出米粒的连通域,数出米粒的数目
3,找出米粒中最大的面积和周长是多少,并给出在图片的位置

实验过程

openCV提供了非常好用的简单全局阈值分割的函数

cv2.threshold(src, thresh, maxval, type, dst=None)
关于threshold函数详解

对原始灰度图像进行灰度直方图分析,可以明显看出灰度值分布区间较大,并且有三座峰(这里暂时不考虑多阈值分割问题),因此难以通过单一阈值进行有效分割,所以应使用 OTSU 或者 TRIANGLE 的优化方法。

但是如果直接对图像进行二值化处理,得到的效果可能不尽人意(Tips:在二值化之前需要转化为灰度图像,因要使用 OTSU 或者 THRESH 进行算法优化,两种优化策略详情见方法链接。而且该实验场景下灰度图像会大大简化实验操作)。

import cv2 as cv
#原始图像
img = cv.imread("rice.png")
#色彩空间转换
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)ret, otsu = cv.threshold(gray_img, 0, 255,
cv.THRESH_BINARY | cv.THRESH_OTSU)
ret2, triangle = cv.threshold(gray_img, 0, 255,
cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
cv.imshow("otsu", otsu)
cv.imshow("triangle", triangle)
cv.waitKey(0)


受到噪点影响,对后续处理工作将带来极大的不便利,因此首要目标是去除背景噪点。常见的去除噪点的方式有各种滤波器,本次实验中我尝试利用了中值滤波和高斯滤波,虽然能有效去除背景噪点,但是不可避免的会对整个米粒形态造成一定的影响,因此在这里我介绍另外一种方法,通过使用形态学的开操作对图像进行预处理。(关于图像处理中的形态学操作原理有兴趣的可以去查阅 冈萨雷斯版本的数字图像处理 )。

形态学操作其实就是改变物体的形状,比如腐蚀就是”变瘦”,膨胀就是”变胖”

在实验中我将使用开操作(先对图像进行腐蚀再对图像进行膨胀)通过这种方式来获取到理想的图像。

kernels = np.ones((5, 5), np.uint8)
# 腐蚀
img_erode = cv.erode(img, kernels, iterations=5)
cv.imshow("erode_image",img_erode)
# 膨胀
img_dilation = cv.dilate(img_erode, kernels, iterations=5)
cv.imshow("dilation_image", img_dilation)


通过上述操作可以得到原始图片背景(Tips:这里用的是原始图片,循环操作次数为5是因为循环次数较少则无法将米粒完全腐蚀,得不到期望结果,这些都可以通过试验得到)。
之后我们就可以利用原始图像直接减去该背景得到较为理想的图像

将当前图像转化为灰度图像后对其灰度直方图进行分析,可明显看到阈值处于40-70之间,因此很容易选择一个全局阈值对整张图片进行分割处理。

因此直接使用简单的二值化处理,就能得到理想的二值化图像



利用该二值化图像就可以通过opencv提供的 findContours 函数找到轮廓位置,通过 drawContours 画出轮廓


其中 findContours 的返回值contours是List类型,保存了每个连通域的轮廓信息,直接通过 len() 函数就可以得知轮廓个数也就是米粒个数。

而对于面积和周长的求取,opencv提供了 contourAreaarcLength 两种方法,非常容易得到。

而之后就只剩下简单的从列表中找出最大值和其所在的位置,后通过 drawContours 绘制出最大米粒位置。

但从图中发现最大的米粒是通过两个米粒所共同构成的连通区域,针对这个问题可以利用对所有米粒的面积进行分析,去除奇异值或者其他处理手段解决。

图像处理只有多动手实验才能提升自己的理解,空想算法只是空中楼阁,我们每个人都是调参师!

项目源码github地址

opencv-python实现数米粒实验相关推荐

  1. 机器视觉-数米粒实验(vc++6.0 + opencv1.0)

    机器视觉实验合集: 机器视觉-模板匹配实验(vc++6.0 + opencv1.0) 机器视觉-数米粒实验(vc++6.0 + opencv1.0) 机器视觉-手写数字识别(vc++6.0 + ope ...

  2. opencv入门之数米粒

    要求: 给出一幅米粒图数出图中米粒数目以及最大米粒位置. 在原图上画出最大米粒的位置. 使用otsu.迭代和平均灰度进行二值分割. 声明: 本次实验采用opencv版本为opencv1.0. 编程软件 ...

  3. matlab数米粒实验报告,文化学习上机实验中遇到的一些Matlab函数.ppt

    文化学习上机实验中遇到的一些Matlab函数.ppt 上机实验中遇到的一些Matlab函数,(1)* .* . (2)abc linspace(a,b,c) (3)log log10 (4)exp ( ...

  4. python猜数游戏实验报告_python实现猜数游戏

    本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 一.问题描述: 使用python开发一个猜数小游戏,程序随机产生0~1024之间的数字,用户输入猜测数字,程序告诉用户 ...

  5. python opencv 数米粒

    1.介绍 opencv入门之数米粒:给出一幅米粒图数出图中米粒数目以及最大米粒位置.在原图上画出最大米粒的位置.并输出最大米粒的面积和最大米粒的周长.使用pycharm编码,亲测功能强大. 2.思路 ...

  6. python opencv学习笔记之数米粒,并返回每一个米粒的位置面积及总个数平均面积

    之前曾经写过一道数米粒的作业,当时用的是c++中的opencv,这次用python试了一下. 原图及效果图 咦?水印怎么去啊 程序流程 程序的大致流程为: 1.读取图片 2.灰度化 3.二值化 4.膨 ...

  7. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  8. 毕业设计之 - 题目:基于机器视觉的试卷批改系统 - opencv python 视觉识别

    文章目录 0 简介 1 项目背景 2 项目目的 3 系统设计 3.1 目标对象 3.2 系统架构 3.3 软件设计方案 4 图像预处理 4.1 灰度二值化 4.2 形态学处理 4.3 算式提取 4.4 ...

  9. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

最新文章

  1. oracle创建带参数视图6,Oracle创建带有参数的视图代码介绍
  2. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  3. hdu 3681(bfs+dfs+状态压缩)
  4. BZOJ 1055 [HAOI2008]玩具取名
  5. php 追溯,php 无限分类父子追溯方法
  6. how is SAP ui5 shell view implemented
  7. Python 字典删除元素clear、pop、popitem
  8. smart700iev3 程序下载设置_分享一款Aira2下载工具
  9. c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
  10. python 内存释放gc_如何释放内存的python删除对象?
  11. oracle 中关于 SID db_name、instance_name (转)
  12. 记录一次日志实现,基于log4j2
  13. oracle 存储过程 实例 循环 给查询赋值 游标取值
  14. 克罗内克张量积 Kron 的 OpenCV C++实现
  15. 求生之路服务器租用配置要求介绍
  16. R shiny 交互式表格
  17. zip压缩包解压中文乱码问题
  18. CPU频率,到底是什么?
  19. 在linux中使用tcpdump命令 – 监听网络流量
  20. 数据库理论作业 第八章 29 33

热门文章

  1. iOS热更新、热修复方案
  2. python计算时间差代码_Python3显示当前时间、计算时间差及时间加减法示例代码...
  3. 十大云服务器服务商评测\排名
  4. 【ORM框架】go语言ORM框架 - gorm快速入门
  5. c语言程序水准路线,C++语言在水准路线简易平差中的应用实例(17页)-原创力文档...
  6. 火山小视频服务器维护中,火山小视频整改时间多久 火山小视频整改哪些方面...
  7. selenium爬取淘宝店铺数据
  8. 黎明前的黑暗~~~~~~
  9. 风景类Midjouney prompt提示词
  10. opencv读取图像的函数