图像分割
图像分割
实验目的
掌握基于openCV的图像分割方法,理解图像分割的处理
实验原理
边缘检测方法、霍尔变换
实验内容或步骤
对“lena.jpg”及“车牌.jpg” 的灰度图像分别进行如下操作:
1)先平滑滤波,进行Canny边缘检测[尝试使用不同参数,调试效果],显示并合并为一张图像保存;
Canny算法所采用的方法
在本文实现的Canny算法中所采用的卷积算子比较简单,表达如下:
其x向、y向的一阶偏导数矩阵,梯度幅值以及梯度方向的数学表达式为:
求出这几个矩阵后,就可以进行下一步的检测过程。
Canny算法介绍-五步:
- 高斯模糊
- 灰度计算
- 计算梯度
- 非最大信号抑制
- 高低阈值输出二值图像
首先使用高斯滤波去除一定的噪声,后进行canny边缘检测。
可以看到图像平滑了挺多
使用滑动条不断调节得到边缘检测最佳效果,记录参数后把canny参数设置为定值
2)在1)的基础上,进行Hough直线变换(尝试使用不同参数,调试效果) ,描绘显示并合并为一张图像保存。
参考:
实验报告
HoughLines( )函数详解
此函数可以找出采用标准霍夫变换的二值图像线条。在OpenCV中,我们可以用其来调用标准霍夫变换SHT和多尺度霍夫变换MSHT的OpenCV内建算法。
C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
- 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
- 第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0
垂直线,π/2水平线)。 - 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 。
- 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
- 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
- 第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
- 第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。
1、初始化(θ,p)空间,N(θ,p)=0 (N(θ,p)表示在该参数表示的直线上的像素点的个数)
2、对于每一个像素点(x,y),在参数空间中找出令 xcosθ+ysinθ=p 的(θ,p)坐标,N(θ,p)+=1
3、统计所有N(θ,p)的大小,取出N(θ,p)>threasold的参数 (threadsold是预设的阈值)
当你使用滑动条来改变 阈值 的时候会观察到检测到线的数目的改变. 这是因为: 如果你设置了一个更大的阈值, 能检测到的线的数目将更少 (你需要更多的点来表示一条能检测到的直线).
使用滑动条不断调节得到边直线测最佳效果,记录参数后把houghlines参数设置为定值,但一开始没起作用,一片红,可能for循环导致了不能随时更换,后来直接把变量设置为三个定值(80,100,120),得到直线检测的效果
这次实验的边缘检测想过不太理想,没有很精确,可能是因为边缘检测的效果设置太严格,亦可能是houghline参数设置得不够精确
源代码
1 |
|
本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议
本文链接:https://zyhang8.github.io/2019/11/21/cv-exp4/