当前位置: 首页 > news >正文

Opencv计算机视觉编程攻略-第五节 用形态学运算变换图像

Opencv计算机视觉编程攻略-第五节 用形态学运算变换图像

  • 1.用形态学滤波器腐蚀和膨胀图像
  • 2.用形态学滤波器开启和闭合图像
  • 3.在灰度图像中应用形态学运算
  • 4.用分水岭算法实现图像分割
  • 5.用MSER 算法提取特征区域

数学形态学是一门20 世纪60 年代发展起来的理论,用于分析和处理离散图像。它定义了一系列运算,用预先定义的形状元素探测图像,从而实现图像的转换。这个形状元素与像素邻域的相交方式决定了运算的结果。本章将介绍几种最重要的形态学运算,并探讨用基于形态学运算的算法进行图像分割和特征检测的问题。
形态学滤波器的应用过程就包含了用这个结构元素探测图像中每个像素的操作过程。把某个像素设为结构元素的原点后,结构元素和图像重叠部分的像素集(下图的九个阴影像素)就是特定形态学运算的应用对象。结构元素原则上可以是任何形状,但通常是一个简单形状,如正方形、圆形或菱形,并且把中心点作为原点。自定义结构元素可用于强化或消除特殊形状。

在这里插入图片描述

1.用形态学滤波器腐蚀和膨胀图像

腐蚀就是把当前像素替换成所定义像素集合中的最小像素值;膨胀是腐蚀的反运算,它把当前像素替换成所定义像素集合中的最大像素值。由于输入的二值图像只包含黑色(值为0)和白色(值为255)像素,因此每个像素都会被替换成白色或黑色像素。

// 读取输入图像
cv::Mat image= cv::imread("binary.bmp");
// 腐蚀图像
// 采用默认的3×3 结构元素
cv::Mat eroded; // 目标图像
// cv::Mat element(7,7,CV_8U,cv::Scalar(1));
cv::erode(image,eroded,cv::Mat());
// 膨胀图像
cv::Mat dilated; // 目标图像
cv::dilate(image,dilated,cv::Mat());

OpenCV 默认使用3×3 正方形结构元素,在调用函数时,参考前面的例子将第三个参数指定为空矩阵(即cv::Mat()),可替换为7,7等其他形状,同完整参数控制如下:
// 腐蚀图像三次
cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);
参数cv::Point(-1,-1)表示原点是矩阵的中心点(默认值),也可以定义在结构元素上的其他位置,3表示迭代三次。
在这里插入图片描述

2.用形态学滤波器开启和闭合图像

开启和闭合滤波器的定义只与基本的腐蚀和膨胀运算有关:闭合的定义是对图像先膨胀后腐蚀,开启的定义是对图像先腐蚀后膨胀,因此可以用以下方法对图像做闭合运算:

在这里插入代码片

调换这两个函数的调用次序,就能得到开启滤波器。
查看闭合滤波器的结果,可看到白色的前景物体中的小空隙已经被填满。闭合滤波器也会把
邻近的物体连接起来。基本上,所有小到不能容纳完整结构元素的空隙或间隙都会被闭合滤波器
消除。
与闭合滤波器相反,开启滤波器消除了背景中的几个小物体。所有小到不能容纳完整结构元
素的物体都会被移除。
在这里插入图片描述

3.在灰度图像中应用形态学运算

形态学梯度运算可以提取出图像的边缘,具体方法为使用cv::morphologyEx 函数,代码
如下所示:

// 用3×3 结构元素得到梯度图像
cv::Mat result;
cv::morphologyEx(image, result,cv::MORPH_GRADIENT, cv::Mat());
得到图像中物体的轮廓(为方便观察,对图像做了反色处理)。

在这里插入图片描述

// 使用7×7 结构元素做黑帽变换
cv::Mat element7(7, 7, CV_8U, cv::Scalar(1));
cv::morphologyEx(image, result, cv::MORPH_BLACKHAT, element7);

在这里插入图片描述
顶帽运算也基于图像比对,它使用了开启和闭合运算。因为灰度图像进行形态学开启运算时会先对图像进行腐蚀,局部的尖锐部分会被消除,其他部分则将保留下来。因此,原始图像和经过开启运算的图像的比对结果就是局部的尖锐部分。这些尖锐部分就是我们需要提取的前景物体。对于本书的照片来说,前景物体就是页面上的文字。因为书本为白底黑字,所以我们采用它的互补运算,即黑帽算法。它将对图像做闭合运算,然后从得到的结果中减去原始图像。这里采用7×7 的结构元素,它足够大了,能确保移除文字。

4.用分水岭算法实现图像分割

分水岭变换是一种流行的图像处理算法,用于快速将图像分割成多个同质区域。它基于这样的思想:如果把图像看作一个拓扑地貌,那么同类区域就相当于陡峭边缘内相对平坦的盆地。分水岭算法通过逐步增高水位,把地貌分割成多个部分。

class WatershedSegmenter {
private:
cv::Mat markers;
public:
void setMarkers(const cv::Mat& markerImage) {
// 转换成整数型图像
markerImage.convertTo(markers,CV_32S);
}
cv::Mat process(const cv::Mat &image) {
// 应用分水岭
cv::watershed(image,markers);
return markers;
}

在这里插入图片描述

5.用MSER 算法提取特征区域

最大稳定外部区域(MSER)算法也用相同的水淹类比,以便从图像中提取有意义的区域。创建这些区域时也使用逐步提高水位的方法,但是这次我们关注的是在水淹过程中的某段时间内,保持相对稳定的盆地。可以发现,这些区域对应着图像中某些物体的特殊部分。

// 基本的MSER 检测器
cv::Ptr<cv::MSER> ptrMSER=
cv::MSER::create(5, // 局部检测时使用的增量值
200, // 允许的最小面积
2000); // 允许的最大面积

在这里插入图片描述

在这里插入图片描述

相关文章:

  • Git团队开发命令总结
  • 数字人训练数据修正解释
  • java 并发编程-ReentrantLock
  • python识别扫描版PDF文件,获取扫描版PDF文件的文本内容
  • 二叉树搜索树与双向链表
  • hackmyvm-flossy
  • AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置
  • Android: Fragment 的使用指南
  • 004 健身房个性化训练计划——金丹期(体态改善)
  • 汇编学习之《数据传输指令》
  • 远程装个Jupyter-AI协作笔记本,Jupyter容器镜像版本怎么选?安装部署教程
  • Rust 语言语法糖深度解析:优雅背后的编译器魔法
  • VoIP技术及其与UDP的关系详解
  • 五类线和六类线
  • 洛谷: P1825 [USACO11OPEN] Corn Maze S
  • 揭秘:父子组件之间的传递
  • Redis批量操作详解
  • Scala的基本语法(二)
  • Python第七章03:文件写入操作
  • JS判断对象是否为空的方法
  • 做电子请帖的网站/金昌网站seo
  • 中国建筑有限公司官网/搜索引擎优化是指什么意思
  • 建设网站的收费/搜索引擎优化内容包括哪些方面
  • 做网站一般几个人/广告联盟推广
  • 聊城做网站的公司新闻/国外搜索引擎排名
  • 国内做网站哪家公司好/手机网页制作软件