图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace

执行边缘检测的三个基本步骤:
1、为降噪对图像进行平滑处理。(导数对噪声具有敏感性。图像的正负分量检测困难)
2、边缘点的检测。(提取边缘点的潜在候选者)
3、边缘定位。(从候选者中选出真是边缘点成员)
步骤
基本算子:梯度算子(表征某点边缘强度和方向,又称边缘检测子)
梯度
梯度幅值

较为简单的边缘检测算子模板:
水平和竖直分量
45度和135度分量
sobel模板能较好地抑制噪声。
常用绝对值来近似梯度幅值,保持灰度级的相对变化,代价是导致滤波器不再是各向同性的。
近似梯度幅值

sobel计算过程


Opencv库函数调用方法:

void Sobel (
InputArray src,
OutputArray dst,
int ddepth,
int dx, x方向上的差分阶数
int dy, y方向上的差分阶数
int ksize=3, 核的大小,为奇数
double scale=1, 计算导数时的缩放因子
double delta=0, 将结果存入目标图像前可选的值
int borderType=BORDER_DEFAULT ) ;
在这里插入图片描述

int main()
{// Read image 读取图像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色//载入原图Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png",0);	//读取灰度图//判断图像是否加载成功if (srcImage.empty()){cout << "图像加载失败!" << endl;return -1;}elsecout << "图像加载成功!" << endl << endl;Mat gradx, grady;Mat abs_gradx, abs_grady;Mat dstImage;//求x方向的梯度Sobel(srcImage,gradx,CV_16S,1,0,3,1,1,BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(gradx, abs_gradx);		//绝对值//求y方向的梯度Sobel(srcImage, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);//	x方向1阶差分 y方向0 核大小3convertScaleAbs(grady, abs_grady);		//绝对值addWeighted(abs_gradx,0.5, abs_grady,0.5,0,dstImage);imshow("srcImage", srcImage);imshow("x方向", abs_gradx);imshow("y方向", abs_grady);imshow("整体", dstImage);waitKey(0);return 0;
}

效果
总览
经过ImageWatch放大发现,提取出的边缘比较粗。
放大
减少精密细节的两种方法:
1、对图像进行平滑处理(例如用均值滤波,得到主要边缘)
2、对梯度图像进行阈值处理(梯度幅值大于等于阈值为黑白,小于阈值为黑),不过这一方法容易断线。
当为了突出主要边缘并尽可能维护连续性时,平滑处理和阈值处理两者都要使用。
roberts、prewitt,sobel算子都是以一个或多个模板进行滤波,而未对图像特性和噪声内容采取防护措施。

接下来介绍一种最优的边缘检测方法:canny算子

●低错误率:标识出尽可能多的实际边缘,同时尽可能地减少噪声产生的误报。
●高定位性:标识出的边缘要与图像中的实际边缘尽可能接近。
●最小响应:图像中的边缘只能标识-一次,并且可能存在的图像噪声不应标
识为边缘。

canny算子计算过程

描述
Opencv库函数调用方法:

void Canny (InputArray image , OutputArray edges, double threshold1,
double threshold2 , 两个阈值较小的用于边缘连接,较大的用于控制强边缘的初始端,一般比例控制在3:1或者2:1
int apertureSize=3, sobel核大小
bool L2gradient=false )

int main()
{// Read image 读取图像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色//载入原图Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png",0);	//读取灰度图//判断图像是否加载成功if (srcImage.empty()){cout << "图像加载失败!" << endl;return -1;}elsecout << "图像加载成功!" << endl << endl;Mat dstImage;Canny(srcImage,dstImage,100,33,3,false);imshow("srcImage", srcImage);imshow("整体", dstImage);waitKey(0);return 0;
}

效果:
效果
经过ImageWatch放大,可以发现,边缘只有一格
放大
总的看来,canny算子确实具有优越性。

laplace计算过程

1
3*3孔径的模板:
模板
opencv库函数调用:
参数


int main()
{// Read image 读取图像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色//载入原图Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\coin_inv.png", 0);	//读取灰度图//判断图像是否加载成功if (srcImage.empty()){cout << "图像加载失败!" << endl;return -1;}elsecout << "图像加载成功!" << endl << endl;Mat dstImage,abs_dst;GaussianBlur(srcImage,srcImage,Size(3,3),0);	//高斯模糊Laplacian(srcImage,dstImage,CV_16S,3,1,0);convertScaleAbs(dstImage, abs_dst);imshow("srcImage", srcImage);imshow("整体", dstImage);waitKey(0);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

改变Jupyter的默认项目路径

开始接触Jupyter&#xff0c;看见它默认的工作路径是C盘&#xff0c;很难受想换下工作空间路径 管理员身份打开你的Anaconda Prompt 输入jupyter notebook --generate-config&#xff0c;找到你的配置文件位置 修改一下路径即可 一般情况到这一步就已经修改成功了&#xff…

图像分割-LOG检测器和DOG检测器

边缘检测是以较小的算子为基础的&#xff0c;具有两个建议 1、灰度变化与图像尺寸无关&#xff0c;因此检测要求使用不同尺寸的算子。 2、灰度的突然变化会在一阶导数产生波峰波谷&#xff0c;在二阶导数产生零交叉 大的算子检测模糊边缘&#xff0c;小的算子检测锐度集中的细节…

C++——统计多行单个字符类型个数

键盘输入n个字符&#xff0c;请分别统计大写字母、小写字母、数字、其他字符的个数并输出&#xff1b;还需要输出所有数字字符之和 【输入形式】 第一行为一个整数n(100 > n > 0)&#xff0c;接下来n行每行一个字符 【输出形式】 输出第1行为4个整数&#xff0c;分别…

C++——已知a+b、 a+c、b+c、 a+b+c,求a、b、 c

有三个非负整数a、b、 C,现按随机顺序给出它们的两两和以及总和4个整数&#xff0c;即ab、 ac、bc、 abc, 注意,给出的4个数的顺序是随机的&#xff0c;请根据这四个数求出a、b、c是多少? [输入形式] 输入为一-行4个正整数, x1、 x2、x3、 x4 (0≤xi≤10^9) &#xff0c;表示…

表示和描述-边界追踪

边界追踪目标&#xff1a; 输入&#xff1a;某一区域的点 输出&#xff1a;这一区域的点的坐标序列&#xff08;顺时针或逆时针&#xff09; Moore边界追踪法&#xff1a; 两个前提条件&#xff1a; 1、图像为二值化后的图像&#xff08;目标为1&#xff0c;背景为0&#xff0…

图像分割-边缘连接

三种基本方法&#xff1a; 1&#xff1a;局部处理 2&#xff1a;区域处理 3&#xff1a;使用霍夫变换的全局处理 局部处理 根据预定的规则&#xff0c;将所有相似点连接起来。 用于确定边缘像素相似性的两个主要性质&#xff1a;1、梯度向量的幅度2、梯度向量的角度 由于要…

02-对图像进行边界填充

import cv2 import matplotlib.pyplot as pltimg2 cv2.imread("E:\Jupyter_workspace\study\data/cat.png")#读取照片&#xff0c;第二个参数若为0&#xff0c;则灰度图&#xff1b;若不填或者1则彩色图或本身图top_size,bottom_size,left_size,right_size (50,50,…

Windows Phone 7独立存储空间IsolatedStorage

Windows Phone 7的solatedStorage可以用来保存应用程序的数据和设置。结构图如下 一、相关类 1.IsolatedStorageFile类 1&#xff09;描述&#xff1a;表示在独立存储空间中的文件和目录。 2&#xff09;重要属性 long AvailableFreeSpace&#xff1a;IsolatedStorage有效的剩余…

图像分割-阈值处理详解(迭代法、Otsu法、平滑改善法、边缘改进法、分块处理法、局部特性法、移动平均法)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 阈值处理详解基础&#xff1a;基于全局的阈值处理1迭代算法&#xff08;最小概率误…

java 用户控件_C#自定义控件VS用户控件

C#中自定义控件VS用户控件大比拼1 自定义控件与用户控件区别WinForm中&#xff0c;用户控件(User Control)&#xff1a;继承自 UserControl&#xff0c;主要用于开发 Container 控件&#xff0c;Container控件可以添加其他Controls控件自定义控件(Custom Control)&#xff1a;继…

SQL Server存储过程(procedure)应用

用户反映&#xff0c;系统操作日志会使用数据库快速增大&#xff0c;情况可参考下图&#xff0c; 问题分析&#xff0c;整个系统每个页面&#xff0c;都有写记录用户操作代码&#xff0c;修改或禁用这个代码&#xff0c;看来是不可能的。 在原有系统参数表添加一个选项&#xf…

Opencv一维直方图的绘制

下面是我参考《opencv3编程入门》写的绘制一维直方图的代码 using namespace cv; using namespace std; #define byte uchar #define TYEPE_GRAY 0 #define TYEPE_RGB 1 /*--------------------------绘制RGB三色一维直方图-------------------------------------*/ Mat My_R…

颜色缩减 -利用指针、迭代器、动态地址实现访问像素

为什么要使用颜色缩减 在对单通道图像进行处理时&#xff0c;像素的可能值为256个&#xff0c;但处理多通道时&#xff0c;像素的处理就会相当麻烦&#xff0c;其实用这些颜色中具有代表性的一小部分就可以达到同样的效果&#xff0c;所以颜色空间缩减就可以派上用场了。一个信…

PowerShell_9_零基础自学课程_9_高级主题:静态类和类的操作

哈哈&#xff0c;昨天弄了个ubuntu 11.10在虚拟机上运行&#xff0c;发现11.10界面非常绚丽&#xff0c;但是其需要的系统资源非常多&#xff0c;我虚拟机设定内存为512M&#xff0c;1个CPU4个核心&#xff0c; 进入以后发现根本动不了&#xff0c;因此今天我就下载了一个Fedor…

05-图像的平滑处理(不同的滤波操作)

对图像进行平滑处理实则就是对图像进行滤波操作罢了 每张图片都有若干个像素点所构成&#xff0c;滤波操作上就是将照片上的某些部分像素点进行修改从而达到平滑的效果 先展示一下原图 import cv2 img cv2.imread(E:\Jupyter_workspace\study\data/test1.png)cv2.imshow(te…

C++设计模式之Abstract Factory模式

一、功能   提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 二、结构图类厂最基本的结构示意图如下&#xff1a; 在实际应用中&#xff0c;类厂模式可以扩充到很复杂的情况&#xff0c;如下图所示&#xff1a; 三、优缺点 优点&#xff1…

数字图像处理小练习存档1

小练习的题目&#xff1a; 1、读取一张图&#xff0c;分解RGB三个通道 /************练习1**********************/ int main() {Mat img1 imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度图if (img1.empty()){printf("Could not find the imag…

06-对图像进行腐蚀操作

形态学中的腐蚀操作一般处理的图像数据为二值的 cv2.erode(img,kernel,iterations 1) kernel表示拿多大的卷积核去腐蚀 iterations表示迭代次数 可以将一些带有毛毛的图像去毛毛化 原图 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)…

Opencv实现利用滑动条来调整阈值

#include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std; #define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏 //*--------------------------【练习】利用滑动条来调整阈值-----------------------------…