数字图像处理课程作业1-大米检测
写在最前
这是我大学课程的数字图像处理的实验报告,代码大部分是从网上直接复制使用,小部分是我自己改写的(例如matplotlib的使用),可以直接运行。内容比较详细,但是希望大家能够先理解一下思路再使用,学习图像处理的思路最重要。
1.实验目的:
综合利用滤波、分割、图像分割、特征描述等知识,实现大米实际尺度、整精米的检测
2.实验要求:
检测出图中的碎米,并在相应的米粒上打上标志。
3.实验分析:
①米粒与背景对比不明显,需要用一个阈值对其进行二值化
②背景存在噪声需要对其进行去噪声
③找到对应的米粒需要对其进行轮廓检测
④找到其中的碎米需要对其进行面积阈值处理,找出面积小的碎米
流程图如下
4.核心处理图像函数分析:
4.1 自适应阈值
def adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None):
自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)
参数说明:
- src: InputArray类型的src,输入图像,填单通道,单8位浮点类型Mat即可
- maxValue: 预设满足条件的最大值
- adaptiveMethod: 指定自适应阈值算法。可选择ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C两种
- thresholdType: 指定阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种。(即二进制阈值或反二进制阈值
- blockSize: 表示邻域块大小,用来计算区域阈值,一般选择为3、5、7…等
作用: 因地制宜的二值化处理
4.2 形态学变化
def getStructuringElement(shape, ksize, anchor=None):
参数说明:
- shape:模板形状
- ksize:模板大小
def morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
参数说明:
- src传入的图片
- op进行变化的方式
- kernel表示方框的大小
对图像进行一系列的膨胀腐蚀组合
作用:
腐蚀:删除对象边界的某些像素
膨胀:给图像中的对象边界添加像素
4.3 轮廓检测
def findContours(image, mode, method, contours=None, hierarchy=None, offset=None):
参数说明:
image:单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边 缘检测算子处理过的二值图像
mode:定义轮廓的检索模式,
method:定义轮廓的近似方法
作用: 检测出米粒的轮廓
4.4 绘制椭圆拟合曲线
def fitEllipse(points):
参数说明:
- points: 一个二维点集
作用: 实现椭圆的拟合
def ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None):
参数说明:
- img: 图像
- center:圆心坐标
- axes:轴的长度
- angle:偏转角度
- start_angle:圆弧起始角的角度
- end_angle:圆弧终结角的角度
- color:线条的颜色
作用:椭圆的轮廓绘制
5.实际图像处理代码分析
5.1 二值化处理
cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,103, 1)
adaptiveThreshold这个函数我们采用的是ADAPTIVE_THRESH_MEAN_C为领域内均值,THRESH_BINARY黑白二值化
图1为二值化处理后的图像,可以看到虽然整体已经二值化成功但是,还是有一些白点噪声,因此我们还需要进行开运算去噪
5.2 开运算处理
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3, 3))dst = cv2.morphologyEx(dst,cv2.MORPH_OPEN ,element) #开运算去噪
先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。我们利用3*3的十字形模板对其进行开运算处理去除噪声,得到下图,可以看到相比起二值化的图像,开运算处理后的图像噪声点明显减少了很多,可以为我们接下来绘制轮廓奠定基础。
5.3 绘制轮廓
contours, hierarchy = cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #轮廓检测函数
代码中用的是CV_RETR_EXTERNAL,只检测最外围轮廓,包含在外围轮廓内的内围,CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours,所有米粒轮廓图如图3
5.4 椭圆描边
def find_rices(contours):count=0 #米粒总数ares_avrg=0 #米粒平均#遍历找到的所有米粒# print(contours)for cont in contours:# 用于计算图像轮廓的面积。ares = cv2.contourArea(cont)print(ares)if ares < 5:continue# ares_avrg += aresif 100<ares<430:count += 1# 当得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形rect = cv2.boundingRect(cont)# 绘制椭圆拟合曲线ellipse = cv2.fitEllipse(cont)# 绘制椭圆圆弧cv2.ellipse(img, ellipse,(0xff),2)y = 10 if rect[1] < 10 else rect[1]cv2.putText(img, str(count), (rect[0], y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (247, 247, 25), 1)return count
得到轮廓列表后,对其中的轮廓面积值进行判断,找到面积小的碎米,如下图3
6.完整代码和图像对比
6.1 完整代码
import cv2 #导入opencv模块
import matplotlib.pyplot as plt
from matplotlib import font_manager
font = font_manager.FontProperties(fname=r".\OPPOSans-H.ttf")def origin_image_handle(img):# 转换为灰度图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 使用局部阈值的大津算法进行图像二值化dst = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,103, 1)# cv2.imshow('111',dst)# 返回一个十字形的Mat型矩阵。element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3, 3))dst=cv2.morphologyEx(dst,cv2.MORPH_OPEN ,element) #开运算去噪cv2.imshow('2222',dst)contours, hierarchy = cv2.findContours(dst,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #轮廓检测函数return dst,contoursdef find_rices(contours):count=0 #米粒总数ares_avrg=0 #米粒平均#遍历找到的所有米粒# print(contours)for cont in contours:# 用于计算图像轮廓的面积。ares = cv2.contourArea(cont)print(ares)if ares < 5:continue# ares_avrg += aresif 100<ares<430:count += 1# 当得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形rect = cv2.boundingRect(cont)# 绘制椭圆拟合曲线ellipse = cv2.fitEllipse(cont)# 绘制椭圆圆弧cv2.ellipse(img, ellipse,(0xff),2)y = 10 if rect[1] < 10 else rect[1]cv2.putText(img, str(count), (rect[0], y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (247, 247, 25), 1)# count += 1# # 当得到对象轮廓后,可用boundingRect()得到包覆此轮廓的最小正矩形# rect = cv2.boundingRect(cont)## # 绘制椭圆拟合曲线# ellipse = cv2.fitEllipse(cont)# # 绘制椭圆圆弧# cv2.ellipse(img, ellipse, (0xff), 2)# y = 10 if rect[1] < 10 else rect[1]# cv2.putText(img, str(count), (rect[0], y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (247, 247, 25), 1)return countif __name__ == '__main__':img = cv2.imread("img.png")# 打开一个新的窗口plt.figure()plt.subplot(1, 3, 1,)plt.title('原始图像',fontproperties = font)# 显示原始图像plt.imshow(img)dst, contours= origin_image_handle(img)plt.subplot(1, 3, 2)plt.title('二值化图',fontproperties = font)# 由于opencv和matplotlib的色彩通道不同,由于OpenCV是以BGR模式加载图像,而matplotlib则是以常见的RGB模式显示图像dst1 = cv2.cvtColor(dst, cv2.COLOR_RGB2BGR)# 二值化图plt.imshow(dst1)### 显示标记图count = find_rices(contours)plt.subplot(1,3,3)plt.title('标记图',fontproperties = font)plt.text(s='估计有{}颗碎粒'.format(count), x=130, y=500, fontproperties=font)plt.imshow(img)cv2.imshow('121212',img)plt.show()cv2.waitKey()
6.2 图像对比图
如图5为原始图像,二值化开运算处理图像,碎米标记图的三个对比图,可以估计到碎米的数量为18颗
7. 实验感想
这次实验相比起之前的实验所涉及的图像处理方法丰富了许多,首先利用的到了图像分割的技术,阈值处理,也利用到了滤波对图像的噪声进行滤除,最后通过特征描述找到米粒的轮廓,并且利用米粒的大小进行碎米选择,描绘出轮廓。其中我也遇到了许多的问题,例如碎米阈值的选择,开运算中模板算子的选择,在尝试许多次后才找到最优解
写在最后
如果觉得写的不错的小伙伴记得给个赞哦!欢迎评论与我交流!
数字图像处理课程作业1-大米检测相关推荐
- 数字图像处理课程作业0-骨架图像增强
写在最前 这是我大学课程的数字图像处理的实验报告,可以直接运行.内容比较详细,但是希望大家能够先理解一下思路再使用,学习图像处理的思路最重要. 1.实验目的 掌握各种灰度变换技术,加深对灰度变换的理解 ...
- 数字图像处理课程作业二-车牌识别
写在最前 这是我大学课程的数字图像处理的实验报告,代码大部分是从网上直接复制使用,小部分是我自己改写的(例如matplotlib的使用),可以直接运行.内容比较详细,但是希望大家能够先理解一下思路再使 ...
- 数字图像处理课程(作业+实验+大作业)相关文章 传送门
数字图像处理课程(作业+实验+大作业)相关文章 传送门 博文说明 本文所使用代码或多或少参考了以往博文的同类or相似文章的代码,并非纯原创 本文仅用于记录并提供一种代码思路,供大家参考 文章目录 数字 ...
- 数字图像处理——大作业 基于车道信息的违法车辆车牌识别
数字图像处理--大作业 基于车道信息的违法车辆车牌识别 一.车牌识别研究现状与分析 二.车牌识别算法原理 2.1 车牌定位 2.1.1 基于RGB阈值的车牌区域初定位 2.1.2 基于数学形态学的车牌 ...
- 人工智能与模式识别的意义(模式识别与图像处理课程作业)
人工智能与模式识别的意义(模式识别与图像处理课程作业 一. 人工智能的意义 二. 模式识别的意义 2.1.文字识别 2.2.语音识别 2.3.指纹识别 2.4.遥感 2.5.医学诊断 1.语音识别技术 ...
- (附源码)python数字图像处理课程平台 毕业设计 242339
Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...
- (附源码)Python数字图像处理课程平台 毕业设计242339
Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...
- matlab数字图像处理课程设计报告,数字图像处理课程设计实验报告.doc
数字图像处理课程设计实验报告 数字图像处理课程设计 题 目:数字图像处理及Huufman(或小波变换)编码仿真实现 学生姓名: 学 院:信息工程学院 系 别:电子信息工程系 专 业:电子信息工程 班 ...
- matlab d=sqrt((i-m)^2+(j-n)^2);,硕士研究生《数字图像处理》作业
硕士研究生<数字图像处理>作业 研究生<数字图像处理>考试 1. 编写程序完成不同滤波器的图像频域降噪和边缘增强的算法并进行比较,得出结论. 图像频域降噪的实验原理与算法分析: ...
- 8. 吴恩达机器学习课程-作业8-异常检测和推荐系统
fork了别人的项目,自己重新填写,我的代码如下 https://gitee.com/fakerlove/machine-learning/tree/master/code 代码原链接 文章目录 8. ...
最新文章
- Endnote X3 出现中文乱码
- cesium事件简单全面描述
- 从论文到PPT,一键生成!从此报告不用愁!
- 【连载】如何掌握openGauss数据库核心技术?秘诀二:拿捏执行器技术(2)
- MyBatis插入数据返回插入对象的主键
- 使用Python标准库函数os.listdir()时的4个注意事项
- 鼠标移到元素上 使hover事件不生效
- Lady Gaga Feat. Colby O'Donis - Just Dance
- 大合集!2019-2020年目标跟踪资源全汇总(论文、模型代码、优秀实验室)
- 使用cwRsync实现windows下文件定时同步
- php attr属性,jquery 获取 自定义属性(attr 和 prop)
- Sparse sharing 在ANN实现多任务时的应用
- 30万人追更,年度重磅Go图书出版,百万流量博主带你学习Go底层原理
- 中国人工智能发展主要存在哪些制约因素,有哪些好的建议
- 机器学习深度学习中反向传播之偏导数链式法则
- android 百度地图驾车导航,百度地图API详解之驾车导航
- 在.NET 6中可以期待什么
- 品尝小坚果, Test the nutz ! nutz入门
- 参加论文写作课后心得体会
- [计算流体力学][Matlab] 使用 A,B,C 格式与蛙跳格式求解二维对流问题