首页 > 其他分享 >OpenCV图像边缘检测(17)

OpenCV图像边缘检测(17)

时间:2023-04-19 19:31:43浏览次数:38  
标签:17 img 边缘 int OpenCV result 图像 CV

边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。图像强度的显著变化可分为:

  • 阶跃变化函数,即图像强度在不连续处的两边的像素灰度值有着显著的差异
  • 线条(屋顶)变化函数,即图像强度突然从一个值变化到另一个值,保持一较小行程后又回到原来的值

图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈.边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。

OpenCV图像边缘检测(17)_差分

ab分别是阶跃函数和屋顶函数的三维图像

cd是阶跃和屋顶函数的函数二维图像

ef对应一阶导数

gh是二阶导数

Sobel算子(索伯)

Sobel算子是一种常用的边缘检测算子,是一阶的梯度算法。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

计算过程

OpenCV图像边缘检测(17)_#include_02

API介绍

void Sobel( InputArray src, OutputArray dst, int ddepth,int dx, int dy, int ksize = 3,double scale = 1, double delta = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 			输入图				
*			dst:	        输出图
*			ddepth:			输出图深度 CV_16S/CV_32F/CV_64F等
*			dx:				x方向上的差分阶数
*			dy:		    	y方向上的差分阶数
*			ksize:  		卷积核大小,一般5*5或3*3
*			scale:			计算导数值时可选的缩放因子
*			delta:			默认为0
*			borderType:		边缘处理模式	
*********************************************************************/

LapLace 算子(拉普拉斯)

拉普拉斯对噪声敏感,会产生双边效果。不能检测出边的方向。通常不直接用于边的检测,只起辅助的角色,检测一个像素是在边的亮的一边还是暗的一边利用零跨越,确定边的位置.

计算过程

OpenCV图像边缘检测(17)_#include_03

API介绍

void Laplacian( InputArray src, OutputArray dst, int ddepth,int ksize = 1, double scale = 1, double delta = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 			输入图				
*			dst:	        输出图
*			ddepth:			输出图深度 CV_16S/CV_32F/CV_64F等
*			ksize:  		核大小,必须是正奇数,默认值是1
*			scale:			计算导数值时可选的缩放因子
*			delta:			可选值,默认为0
*			borderType:		边缘处理模式	
*********************************************************************/

Canny算子(坎尼)

计算过程

  • 用高斯滤波器平滑图像
  • 用一阶偏导的有限差分计算梯度的幅值核方向

OpenCV图像边缘检测(17)_差分_04

  • 对梯度幅值进行非极大值抑制
  • 超过255 用255表示
  • 低于0 用绝对值表示
  • 用双阈值算法检测和连接边缘

API介绍

void Canny( InputArray image, OutputArray edges,double threshold1, double threshold2,int apertureSize = 3, bool L2gradient = false );
/*******************************************************************
*			src: 			输入图				
*			edges:	        输出图
*			threshold1:		第一个阈值
*			threshold2:  	第二个阈值
*			apertureSize:	内核大小
*			L2gradient:		计算图像梯度幅值方法的标志
*********************************************************************/

综合代码

#include <iostream>
#include <string>
#include <map>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class Edge 
{
public:
	Edge() :img(imread("test.jpg")) 
	{
		result["img"] = img;
	}
	void TestSobel() 
	{
		Sobel(img, result["x"], CV_16S, 1, 0);
		//图像增强
		//α*src+β
		convertScaleAbs(result["x"], result["x"]);
		Sobel(img, result["y"], CV_16S, 0, 1);
		convertScaleAbs(result["y"], result["y"]);
		addWeighted(result["x"], 0.5, result["y"], 0.5, 0, result["xy"]);
		Sobel(img, result["sobel"], CV_16S, 1, 1);
		convertScaleAbs(result["sobel"], result["sobel"]);
	}
	void TestLapLacian() 
	{
		Laplacian(img, result["LapLacian"], CV_16S);
		convertScaleAbs(result["LapLacian"], result["LapLacian"]);
	}
	void TestCanny() 
	{
		//高阈值
		Canny(img, result["Canny"], 100, 200);
		//灰度后的高阈值和低阈值
		cvtColor(img, result["Gray"], COLOR_BGR2GRAY);
		Canny(result["Gray"], result["Max"], 100, 200);
		Canny(result["Gray"], result["Min"], 20, 40);
		//高斯模糊后做双阈值
		GaussianBlur(result["Gray"], result["Gauss"], Size(3, 3), 5);
		Canny(result["Gauss"], result["OK"], 100, 200);
	}

	void Show() 
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
protected:
	Mat img;
	map<string, Mat> result;
};

int main() 
{
	unique_ptr<Edge> p(new Edge);
	p->TestSobel();
	p->TestLapLacian();
	p->TestCanny();
	p->Show();

	return 0;
}

OpenCV图像边缘检测(17)_OpenCV_05

标签:17,img,边缘,int,OpenCV,result,图像,CV
From: https://blog.51cto.com/u_15959862/6207249

相关文章

  • VMware17安装Windows10详细记录
    VMware17安装Windows10详细记录1.前置准备VMware软件,这里用的VMware17Windows系统镜像文件(.iso文件)Windows系统官方下载地址:Windows系统官方下载ITellYou旧版站点:MSDN,我告诉你-做一个安静的工具站(itellyou.cn)ITellYou新版站点:NEXT,ITELLYOU2.新建虚拟......
  • Halcon图像中的字体设定 字体颜色设定 显示样式设定 信息显示
    图像中的字体设定set_display_font算子:set_display_font(:: WindowHandle, Size, Font, Bold, Slant :)示例:set_display_font(200000,24,'mono','true','false')200000(输入参数1):输入窗口句柄24(输入参数2):输入字体大小'mono'(输入参数3):输入字体类型'......
  • 图像分割相关算子
      图像分割介绍,先定位一个大的特征->内部特征->分割灰度直方图:如下图所示阈值分割:  threshold全局固定阈值分割算子:threshold(Image : Region : MinGray, MaxGray :)     示例:threshold(GrayImage,Regions,141,214)              ......
  • opencv-python 安装记录
    最近在看网上一个opencv的教程,其中的安装在ubuntu虚拟机下安装,照着安装一直没有成功,今天几个摸索,终于找到一个成功的版本。特此记录下安装过程。1、选择Ubuntu18.04版本的虚拟机(14.04、16.04都没有成功)2、更换阿里云数据源。3、......
  • 图像识别技术原理和神经网络的图像识别技术
    图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息。随着计算机技术的发展,人类对图像识别技术的认识越来越深刻。图像识别技术的过程分为信息的获取、预处理、特征抽取和选择、分类器设计和分类决策。简单分析了图像识别技术的引入、其......
  • OpenCV2 计算机视觉应用编程秘籍:1~5
    原文:OpenCV2ComputerVisionApplicationProgrammingCookbook协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、玩......
  • OpenCV2 计算机视觉应用编程秘籍:6~10
    原文:OpenCV2ComputerVisionApplicationProgrammingCookbook协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。六、过......
  • Python OpenCV 计算机视觉:1~5
    原文:OpenCVComputerVisionwithPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、设置OpenCV本章是设置Py......
  • Python OpenCV 计算机视觉:6~7
    原文:OpenCVComputerVisionwithPython协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。附录A:与Pygame集成本附录显......
  • 用于图像识别的编程语言,你知道几个?
    图像识别是大多数现代设备和程序中部署的主要功能之一。该功能具有广泛的应用程序,最常见的是安全系统。它可以使设备通过图像来识别人员或物体的身份。而面部识别是图像识别的产物。那么,创建具有图像识别功能的应用程序或软件需要些什么?你只需要使用编程语言对其进行编程。当然,有些......