opencv-python实现数米粒实验
实验目的
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提供了 contourArea 和 arcLength 两种方法,非常容易得到。
而之后就只剩下简单的从列表中找出最大值和其所在的位置,后通过 drawContours 绘制出最大米粒位置。
但从图中发现最大的米粒是通过两个米粒所共同构成的连通区域,针对这个问题可以利用对所有米粒的面积进行分析,去除奇异值或者其他处理手段解决。
图像处理只有多动手实验才能提升自己的理解,空想算法只是空中楼阁,我们每个人都是调参师!
项目源码github地址
opencv-python实现数米粒实验相关推荐
- 机器视觉-数米粒实验(vc++6.0 + opencv1.0)
机器视觉实验合集: 机器视觉-模板匹配实验(vc++6.0 + opencv1.0) 机器视觉-数米粒实验(vc++6.0 + opencv1.0) 机器视觉-手写数字识别(vc++6.0 + ope ...
- opencv入门之数米粒
要求: 给出一幅米粒图数出图中米粒数目以及最大米粒位置. 在原图上画出最大米粒的位置. 使用otsu.迭代和平均灰度进行二值分割. 声明: 本次实验采用opencv版本为opencv1.0. 编程软件 ...
- matlab数米粒实验报告,文化学习上机实验中遇到的一些Matlab函数.ppt
文化学习上机实验中遇到的一些Matlab函数.ppt 上机实验中遇到的一些Matlab函数,(1)* .* . (2)abc linspace(a,b,c) (3)log log10 (4)exp ( ...
- python猜数游戏实验报告_python实现猜数游戏
本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 一.问题描述: 使用python开发一个猜数小游戏,程序随机产生0~1024之间的数字,用户输入猜测数字,程序告诉用户 ...
- python opencv 数米粒
1.介绍 opencv入门之数米粒:给出一幅米粒图数出图中米粒数目以及最大米粒位置.在原图上画出最大米粒的位置.并输出最大米粒的面积和最大米粒的周长.使用pycharm编码,亲测功能强大. 2.思路 ...
- python opencv学习笔记之数米粒,并返回每一个米粒的位置面积及总个数平均面积
之前曾经写过一道数米粒的作业,当时用的是c++中的opencv,这次用python试了一下. 原图及效果图 咦?水印怎么去啊 程序流程 程序的大致流程为: 1.读取图片 2.灰度化 3.二值化 4.膨 ...
- OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内
OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...
- 毕业设计之 - 题目:基于机器视觉的试卷批改系统 - opencv python 视觉识别
文章目录 0 简介 1 项目背景 2 项目目的 3 系统设计 3.1 目标对象 3.2 系统架构 3.3 软件设计方案 4 图像预处理 4.1 灰度二值化 4.2 形态学处理 4.3 算式提取 4.4 ...
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
最新文章
- oracle创建带参数视图6,Oracle创建带有参数的视图代码介绍
- 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
- hdu 3681(bfs+dfs+状态压缩)
- BZOJ 1055 [HAOI2008]玩具取名
- php 追溯,php 无限分类父子追溯方法
- how is SAP ui5 shell view implemented
- Python 字典删除元素clear、pop、popitem
- smart700iev3 程序下载设置_分享一款Aira2下载工具
- c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
- python 内存释放gc_如何释放内存的python删除对象?
- oracle 中关于 SID db_name、instance_name (转)
- 记录一次日志实现,基于log4j2
- oracle 存储过程 实例 循环 给查询赋值 游标取值
- 克罗内克张量积 Kron 的 OpenCV C++实现
- 求生之路服务器租用配置要求介绍
- R shiny 交互式表格
- zip压缩包解压中文乱码问题
- CPU频率,到底是什么?
- 在linux中使用tcpdump命令 – 监听网络流量
- 数据库理论作业 第八章 29 33
热门文章
- iOS热更新、热修复方案
- python计算时间差代码_Python3显示当前时间、计算时间差及时间加减法示例代码...
- 十大云服务器服务商评测\排名
- 【ORM框架】go语言ORM框架 - gorm快速入门
- c语言程序水准路线,C++语言在水准路线简易平差中的应用实例(17页)-原创力文档...
- 火山小视频服务器维护中,火山小视频整改时间多久 火山小视频整改哪些方面...
- selenium爬取淘宝店铺数据
- 黎明前的黑暗~~~~~~
- 风景类Midjouney prompt提示词
- opencv读取图像的函数