2017-12-16 11:29:52 sinat_39805237 阅读数 2195
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158232 人正在学习 去看看 李晓鹏

三边缘连接和边界检测

通常情况下,检测出的像素并不能完全描述边缘特性,需要紧接连接算法,才能组合成有意义的边缘或区域边界。

1局部处理


2区域处理


按给出的顺序追踪这些点

3使用霍夫变换的全局处理

通常所说的霍夫线变换和圆变换,将直角坐标系转换到极坐标系下,在极坐标系下相交的直线在直角坐标系系下表示通过一条直线的点。

四阈值处理

包括全局阈值处理,在整幅图片设定阈值,对每个像素点判断就叫全局;阈值可变的情况有事叫局部阈值处理;如果阈值取决于空间坐标(x,y)本身,称为动态阈值处理或自适应阈值处理。

噪声对阈值处理的影响还是很大的,所以要进行预处理。

光照和反射起到了核心作用,如果控制不了这些参数时。


基本的全局阈值处理


用otsu方法的最佳全局阈值处理

用图像平滑改善全局阈值处理,就是在处理之前滤除噪声。(一点点深入,解析方法)

利用边缘改进全局阈值处理

多个全局阈值的处理(即设置几个阈值给出不同区域的结果像素值)

可变阈值处理

将图像分块,然后分别进行otsu全局方法,对分割有帮助。基于局部图像特征的可变阈值处理,使用移动平均。

如果对你有所帮助,谢谢您的鼓励^_^

(一块不少,五块更好)

红包还不收?


2019-10-15 23:00:39 liubing8609 阅读数 40
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158232 人正在学习 去看看 李晓鹏

图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny)

不同图像灰度不同,边界处一般会有明显边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。

在实际的图像分割中,往往只用到一阶和二阶导数,虽然原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。

各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位;

Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。

Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

Sobel算子Sobel算子和Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。

在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的。Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的,另一个是检测垂直平边沿的。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。

由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

上面的算子是利用一阶导数的信息,属于梯度算子范畴。

Laplacian算子:这是二阶微分算子。其具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。

Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。

微分算子在图像处理中扮演重要的角色,其算法实现简单,而且边缘检测的效果又较好,因此这些基本的微分算子是学习图像处理过程中的必备方法,下面着重讨论几种常见的微分算子。

Sobel算子:其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意,算法具体实现很简单,就是3*3的两个不同方向上的模板运算,这里不再写出。

Robert算子:根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素之差。

Prewitt算子:该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。

Laplacian算子:拉普拉斯算子是一种二阶微分算子,若只考虑边缘点的位置而不考虑周围的灰度差时可用该算子进行检测。对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁的像素的二阶导数异号。

Canny算子:该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

2014-02-24 17:37:50 u012627502 阅读数 11176
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158232 人正在学习 去看看 李晓鹏

★边缘(灰度过渡的地方)检测

●边缘检测是所有基于边界的分割方法的第一步(串行、并行)。

●两个具有不同灰度值的相邻区域之间总存在边缘。

●边缘是灰度值不连续的结果,这种不连续常可利用求导数方便检测到,一般常用一阶和二阶导数来检测边缘。(河、岸存在落差)


常用的边缘剖面有三种:

●阶梯状:对应于图像中两个具有不同灰度值的相邻区域之间;(通过检测一阶导数的峰值或二阶导数的零值,可以找到边界)

●脉冲状:对应于细条状的灰度值突变区域的边缘;

●屋顶状:对应于上升下降沿都比较缓慢的边缘。(一阶导数和二阶导数分别对应脉冲导数一阶导数和二阶导数的拉伸)

由于采样的缘故,数字图像中的边缘总有些模糊,所以在垂直上下的边缘剖面上都表示成有一定的坡度。


★边缘与导数

(a)一阶导数:在图像由暗变明的位置处有一个向上的阶跃,而在其他位置为零。可用一阶导数的幅值来检测边缘的存在,幅度峰值一般对应边缘位置。

  二阶导数:在一阶导数的阶跃上升区有一个向上的脉冲,而在一阶导数的阶跃下降区有一个向下的脉冲。在这两个阶跃之间有一个零点,它的位置正对原图像中边缘的位置。可用二阶导数在过零点附近的符号确定边缘像素在图像边缘的暗区或明区。

(b)这个图像是由明变暗,所以与(a)图比,剖面左右对换,一阶导数上下对换,二阶导数左右对称。

(c)脉冲状的剖面边缘与(a)一阶导数形状相同。所以(c)的一阶导数形状与(a)的二阶导数形状相同。而它的二阶导数过零点正好分别对应脉冲的上升沿和下降沿。通过检测脉冲剖面的二阶导数过零点可确定脉冲的范围。

(d)屋顶状边缘的剖面可看作是将脉冲边缘底部展开得到的,所以它的一阶导数是将(c)脉冲剖面的一阶导数的上升沿和下降沿展开得到的,而它的二阶导数的上升沿和下降沿拉开得到的。   通过检测屋顶状边缘剖面的一阶导数过零点可以确定屋顶位置。无法确定屋顶的宽度。


★微分算子

1、梯度算子:梯度对应一阶导数,梯度算子是一阶导数算子。(矢量、x,y方向求导)

☞对一个连续函数f(x,y),它的位置(x,y)的梯度可表示为一个矢量:


●梯度矢量的幅度(常简称梯度):

●方向角:


☞离散用模板实现。

●偏导数需对每个像素位置计算,在实际中常用小区域模板卷积运算进行来近似计算。对GxGy各用一个模板(水平和垂直模板),所以需要两个模板组合起来以构成一个梯度算子。

●常用的有Roberts cross算子,Prewitt算子,Sobel算子,其中Sobel算子是效果比较好的一种。

●算子运算时是采取类似卷积的方式。

●在边缘灰度值过渡比较尖锐且图像中噪声比较小时,梯度算子工作效果较好。(白色表示大梯度,黑色表示小梯度)


2、拉普拉斯(Laplacian)算子:是一种二阶导数算子(检测明暗)。

☞对一个连续函数f(x,y),它的位置(x,y)的拉普拉斯定义如下:



☞在数字图像中,计算函数的拉普拉斯值也可借助各种模板实现。

●拉普拉斯算子是一种二阶导数算子,所以对图像中的噪声相当敏感。

●它常产生双象素宽的边缘(由于二阶导数的两个峰值点(明和暗)造成的,中间过零点为真正的边界),且也不能提供边缘方向的信息。

●由于以上原因,拉普拉斯算子很少直接用于检测边缘(一般用一阶导数),而主要用于边缘像素后,确定该像素是在图像的暗区或明区一边。(过明点的正负位置)


3、综合正交算子:边缘的存在是图像中灰度值不连续一般表现,图像中的孤立点和直线段也可看做边缘。直线段可看作两个相邻的边缘构成,所以也可很方便地用特殊设计的正交模板设计。综合算子是由9个模板组成的,既可以检测边缘,也可以检测直线。

      


★边界闭合—将边缘像素连接起来

●用梯度算子对图像处理可得到像素两方面的信息:

(1)梯度的幅度(2)梯度的方向

●根据边缘像素梯度在这两方面的相似性可把它们连接起来。

●如果像素(s,t)在像素(x,y)的领域内且它们的梯度幅度和梯度方向分别满足以下两个条件(其中T是幅度阀值,A是角度阀值),那么就可将在(s,t)的像素与在(x,y)的像素连接起来。

●如对所有边缘像素都进行这样的判断和连接就有希望得到闭合的边界。

●边界连接可并行地完成。

●利用数学形态学的一些操作也可以连接或闭合边界,这里边界的连接也可并行地完成。



2019-01-15 14:09:33 qq_42887760 阅读数 685
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158232 人正在学习 去看看 李晓鹏

卷积边缘问题

在这里插入图片描述

  • 图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。

处理边缘

在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在
四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之
后再去掉这些边缘。openCV中的处理方法常用的有如下几种:

  • BORDER_DEFAULT - 用倒影的方式填充(默认是这种方式)
  • BORDER_CONSTANT – 填充边缘用指定像素值
  • BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。
  • BORDER_WRAP – 用另外一边的像素来补偿填充

API说明 – 给图像添加边缘API

API说明 – 给图像添加边缘API
copyMakeBorder(
Mat src, // 输入图像
Mat dst, // 添加边缘图像
int top, // 边缘长度,一般上下左右都取相同值,
int bottom,
int left,
int right,
int borderType, // 定义应用的边框类型。
Scalar value // 边缘类型为 BORDER_CONSTANT 时,有效。如果borderType为BORDER_CONSTANT,则这是用于填充边框像素的值。

代码示例

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;


int main( int, char** argv )
{
	
	Mat src, dst1, dst2;
	//1.加载源图像src
	src=imread("E:/Experiment/OpenCV/Pictures/paint1.jpg");
	imshow("src", src);
	//2.现在我们初始化定义边框大小(顶部,底部,左侧和右侧)的参数。 我们给它们的值是src大小的5%。
	int top = 0.05 * src.rows;
	int bottom = 0.05 * src.rows;
	int left = 0.05 * src.cols;
	int right = 0.05 * src.cols;

	RNG rng(12345); // 随机数种子
	int borderType = BORDER_DEFAULT; // 倒影的方式填充(默认是这种方式)

	int c = 0;
	
	//3.程序开始一个while循环。 如果用户按下'c'或'r',则borderType变量分别取值BORDER_CONSTANT或BORDER_REPLICATE:
	while (true)
	{
		if ((c = waitKey(500)) == 27) // Esc 键
			break;
		if (c == 'r'){
			borderType = BORDER_REPLICATE; // 填充边缘像素用已知的边缘像素值。
		}
		else if (c == 'w'){
			borderType = BORDER_WRAP; // 用另外一边的像素来补偿填充
		}
		else if (c == 'c'){
			borderType = BORDER_CONSTANT; // 填充边缘用指定像素值
		}
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//颜色随机
		
		copyMakeBorder(src, dst1, top, bottom, left, right, borderType, color);
		imshow("borderType", dst1);

		if (borderType == BORDER_WRAP) 
			continue;
		//按 w 这里会报错,GaussianBlur 不支持 BORDER_WRAP
		GaussianBlur(src, dst2, Size(5, 5), 0, 0, borderType);// BORDER_DEFAULT 是默认的
		imshow("GaussianBlur", dst2);
	}

}

运行截图

  • BORDER_DEFAULT // 倒影的方式填充(默认是这种方式)
    在这里插入图片描述
  • BORDER_WRAP // 用另外一边的像素来补偿填充
    在这里插入图片描述
  • BORDER_CONSTANT // 填充边缘用指定像素值
    在这里插入图片描述
  • BORDER_REPLICATE // 填充边缘像素用已知的边缘像素值。
    在这里插入图片描述
2017-08-01 20:22:13 pianzang5201 阅读数 287
  • 软件测试入门视频教程

    软件测试入门视频培训教程:该课程将带你走进“软件测试”的大门,具体内容包括软件测试环境搭建、软件开发模型、产品模型、CMM模型、测试用例、等价类划分、边界值划分、白盒测试、单元测试、bugfree搭建、系统测试、回归测试、验收测试等。本课程以接地气的语言来讲解,让你听的懂,学的会!本课程以全新的方式为你呈现教学内容,清新脱俗独具特色的授课方式将带给你新的体验。

    2158232 人正在学习 去看看 李晓鹏

Canny 边缘检测是一种非常流行的边缘检测算法是 John F.Canny 在 1986 年提出的。

1、噪声去除 

由于边缘检测很容易受到噪声影响,所以第一步是使用 5x5 的高斯滤波器去除噪声。

2、计算图像梯度 

对平滑后的图像使用 Sobel 算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx 和 Gy)。根据得到的这两幅梯度图(Gx 和 Gy)找到边界的梯度和方向,公式如下: 


梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和 两个对角线。

3、非极大值抑制 

在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查看这个点的梯度是不是周围具有相同梯度方向的点中最大的。如下图所示:


现在你得到的是一个包含“窄边界”的二值图像

4、滞后阈值 

现在要确定那些边界才是真正的边界。这时需要设置两个阈值: minVal 和 maxVal。当图像的灰度梯度高于 maxVal时被认为是真的边界, 那些低于 minVal的边界会被抛弃。如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。如下图:


A 高于阈值 maxVal 所以是真正的边界点。

C 虽然低于 maxVal 但高于 minVal 并且与 A 相连,所以也被认为是真正的边界点。

B 会被抛弃,因为它不仅低于 maxVal 而且不与真正的边界点相连。

所以选择合适的 maxVal 和 minVal 对于能否得到好的结果非常重要。 在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段。

OpenCV 中的 Canny 边界检测 

在 OpenCV 中只需要一个函数:cv2.Canny(),就可以完成以上几步。

---这个函数的第一个参数是输入图像

---第二和第三个分别是 minVal 和 maxVal第四个参数设置计算图像梯度的 Sobel 卷积核的大小默认值为 3

---最后一个参数是 L2gradient,它可以用来设定求梯度大小的方程。如果设为 True,就会使用我们上面提到过的方程,否则使用方程:

代替,默认值为 False


#coding:utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('F:/moder.jpg')

b, g, r = cv2.split(img)#转换色彩,由bgr转为rgb
img = cv2.merge([r,g,b])#转换色彩,由bgr转为rgb

edges = cv2.Canny(img, 100, 200)

plt.subplot(121),plt.imshow(img, cmap='gray')
plt.title('Original Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(edges, cmap='gray')
plt.title('Edge Image'),plt.xticks([]),plt.yticks([])


plt.show()

结果图:




没有更多推荐了,返回首页