百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Canny边缘检测+孔洞填充

bigegpt 2024-09-01 15:22 6 浏览

使用C++、opencv进行边缘检测+空洞填充

相关重要API:

Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));

getStructuringElement函数会返回指定形状和尺寸的结构元素,返回类型为Mat

第一个参数表示内核的形状,有三种形状可以选择:

矩形:MORPH_RECT;

交叉形:MORPH_CROSS;

椭圆形:MORPH_ELLIPSE;

第二和第三个参数分别是内核的尺寸以及锚点的位置。

一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

----------------------------------------------------------

void morphologyEx(InputArray src,//输入图像
OutputArray dst,//输出图像
int op, //标识符,表示形态学运算的类型
InputArray kernel,//结构元素,即用于卷积的内核
Point anchor = Point(-1, -1),//默认值,锚点位于中心
int iterations = 1,//默认值,迭代次数
int borderType = BORDER_CONSTANT,//默认值
const Scalar& borderValue = morphologyDefaultBorderValue());//默认值

第一个参数,输入图像
第二个参数,输出图像
第三个参数,使用的形态学方法,有以下几种:

MORPH_OPEN – 开运算(Opening operation)
开运算是对图像先腐蚀再膨胀,可以排除小团的物体;

MORPH_CLOSE – 闭运算(Closing operation)
闭运算是对图像先膨胀再腐蚀,可以排除小型黑洞;

MORPH_GRADIENT -形态学梯度(Morphological gradient)
返回图片为膨胀图与腐蚀图之差,可以保留物体的边缘轮廓;

MORPH_TOPHAT - “顶帽”(“Top hat”)
返回图像为原图像与开运算结果图之差;

MORPH_BLACKHAT - “黑帽”(“Black hat“)
返回图片为闭运算结果图与原图像之差。

第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。
第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。它有默认值BORDER_ CONSTANT。
第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue()。
------------------------------------------------------

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <vector>
using namespace std;
#define zoom 4 // 缩放因子, 将大图像缩小 n 倍显示

using namespace cv;
using namespace std;

// 填充holes
void fillHole(const Mat srcBw, Mat &dstBw);

int main()
{
	// 【1】读入图像
	Mat srcImage;
	srcImage = imread("D:\\DSC_0506.JPG");
	if (!srcImage.data) { 
		//处理错误
		cout << "读取图片错误!" << endl;
		system("pause");
		return 0;
	}

	//【2】将图片转为灰度图
	cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);

	Mat temp;
	temp = srcImage;
	resize(temp, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
	imshow("灰度图", temp);

	// 【3】canny算子边缘检测
	Mat edge;
	blur(srcImage, edge, Size(3, 3));//3x3内核降噪
	Canny(srcImage, edge, 150, 100, 3);
	temp = edge;
	resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
	imshow("canny算子边缘检测", temp);

	//【4】膨胀操作, 填充边缘缝隙
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	for (int i = 0; i < 3; i++) {
		morphologyEx(edge, edge, MORPH_DILATE,element);
	}
	temp = edge;
	resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
	imshow("膨胀操作效果图", temp);

	// 【5】Holes填充
	for (int i = 0; i < 10; i++) // 填充10次
	{
		fillHole(edge, edge);
	}
	temp = edge;
	resize(edge, temp, Size(temp.cols / zoom, temp.rows / zoom), (0, 0), (0, 0), 3);
	imshow("【Holes填充图】", temp);

	waitKey(0); // 等待按键结束
	return 0;
}

// 填充Holes
void fillHole(const Mat srcBw, Mat &dstBw)
{
	Size m_Size = srcBw.size();
	Mat Temp = Mat::zeros(m_Size.height + 2, m_Size.width + 2, srcBw.type());//延展图像
	srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)));

	floodFill(Temp, Point(0, 0), Scalar(255));

	Mat cutImg;//裁剪延展的图像
	Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg);

	dstBw = srcBw | (~cutImg);
}

原图:


canny边缘检测效果图:

边缘膨胀效果图:

?

空洞填充效果图:

?

相关参考:https://blog.csdn.net/kksc1099054857/article/details/76569718

https://blog.csdn.net/jiangjiao4726/article/details/75571014

相关推荐

一条命令搞定pip国内镜像源设置(pip install 指定镜像)

玩python的同学想必没有不用pip的吧,pip是python包管理工具,和Nodejs的npm、Java的maven类似,这些依靠开源力量建立起的庞大软件库极大提高了开发的效率,不过默认pytho...

Cadence Allegro在PCB中手动或者自动添加差分对属性

设计PCB过程中,若设计中有差分对信号,则需要将是差分的2个信号设置为差分对,设置差分对有2种方式:手动添加及自动添加一、手动添加差分对:1、点击Setup-Constraints-Constrain...

合亿 Gutab 三防|车载工业平板功能介绍,车载工业平板厂家推荐

在商用车队管理迈向智能化、特种车辆作业追求高效化的今天,车载工业平板早已突破传统“车载导航”的单一功能,成为连接车辆、司机与云端管理的核心枢纽。从物流运输的实时调度中枢,到矿山开采的无人驾驶控制器,再...

「探长分享-黑匣子」本田冠道 2020款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】本田冠道2020款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步标...

「探长分享-黑匣子」奥迪A6L 2019款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】奥迪A6L2019款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步...

探长360全景案例分享:奥迪Q7 2011款360全景效果展示

【品牌】DCT360汽车黑匣子【产品型号】3TPro【安装车型】奥迪Q72011款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停...

「探长分享-黑匣子」保时捷Cayenne 2015款

【品牌】探长360汽车黑匣子【产品型号】4TPro【安装车型】保时捷Cayenne2015款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,...

苍蝇再小也是肉,变态电路的大阳巧客S2差点难死大神

这台大阳巧客S2电动四轮车是我家第二台四轮俱全的篷车!哈哈!大阳巧客S2配置4.5Kw永磁同步电机,SVPWM矢量控制正弦波系统,车辆在加速、爬坡上性能有提升,效率高,操控灵敏。这台车前段时间刚更换了...

「探长分享-黑匣子」奥迪Q5L 2020款

360汽车黑匣子【产品型号】4TPro【安装车型】奥迪Q5L2020款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停车监控,一秒一...

「探长分享-黑匣子」丰田兰德酷路泽 2016款

【品牌】探长360汽车黑匣子【产品型号】3TPro【安装车型】丰田兰德酷路泽2016款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小...

驾驶室盲区是酿成重卡事故主因?后视系统:这个锅我不背

小时候家中长辈常常提醒:离大货车远一点!司机根本看不到你!早期的货车可能真的存在驾驶盲区,比如车辆正下方,因驾驶座过高,恰好是司机看不到的视野盲区。而如今的重卡在环视系统上已经非常完善,是否还存在驾驶...

前后双录,360 G580行车记录仪(360行车记录仪g580s)

相信每一位车主都会为爱车安装行车记录仪,行车记录仪的作用不仅能为交通事故还原证据,还能防止碰瓷。传统的单镜头行车记录仪只能拍摄车头方向的行车画面,如果遇到后方车辆故意碰瓷的事故时,没有监控和后摄画面则...

海康威视同轴录像机怎么使用,海康XVR配置说明

海康威视同轴录像机支持模拟、同轴以及数字IP摄像机接入,因此在使用多种类型摄像机、老久监控项目改造等场景广泛使用。首先,新录像机第一次使用需要设置管理密码激活,密码需由8-16位数字、小写字母、大写...

亿道三防2代工业级车载平板电脑震撼登场,农机矿车专用

亿道三防近日推出2024年全新2代车载平板电脑V12R,引领多项技术创新和升级,为农机、矿车等车载领域带来了超越期待与想象的震撼体验。V12R是一款从里到外,性能、功能全线拉满的工业级车载平板电脑!拥...

分析神州十八号返回舱内的摄像机最有可能是什么类型的摄像头

有没有发现,神州十八号返回舱内摄像机的图像虽然清晰度不是很高,但是画面非常干净,没有一点干扰,几乎看不到噪点。图像清晰度不高不太可能是镜头原因,很可能是图像传感器的分辨率比较低的原因,图像传感器分辨率...