数字图像处理课程作业1

您所在的位置:网站首页 level1619 数字图像处理课程作业1

数字图像处理课程作业1

2023-12-18 16:06| 来源: 网络整理| 查看: 265

写在最前

这是我大学课程的数字图像处理的实验报告,代码大部分是从网上直接复制使用,小部分是我自己改写的(例如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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3