计算机视觉class3

本文详细介绍了图像处理中的边缘检测技术,包括Sobel、Laplace、Scharr和Canny算子,以及二值图像的边界提取和区域骨架提取(细化)的方法。通过对图像的滤波、增强、检测等步骤,实现高质量的边缘识别。同时,讨论了Zhang-Suen细化算法在图像细化中的应用。
摘要由CSDN通过智能技术生成

要点

1.边缘检测
2.二值图像及其边界提取(各分割图像的面积、边界的长度)
3.区域骨架提取(细化)

解释

1.边缘检测
(1)概念:边缘检测的目的是标识数字图像中亮度变化明显的点。
(2)方法:①基于查找—>寻找图像一阶导数信息,通过导数的最大(小)值来检测边缘。
      ②基于零穿越—->寻找图像二阶导数信息,通过二阶导数零穿越来寻找边界。
 核心的思想都是利用灰度值的不连续性和相似性。
 
(3)流程:1)Filter 对噪声有强敏感性,常用的滤波方法是高斯,用离散化的高斯函数产生归一化的高斯核。
2)Enhancement 确定各点邻域强度的变化值,目的是将局部强度值有显著变化的点凸显出来。
3)Detection(Location) 对凸显出来的显著点进行处理(过滤),工程中,常用阈值法。

(4)几种算法
Sobel算子
反映的是一阶导数信息,在离散域上表现为差分算子,在图像上运用Sobel算子能够得到对应的灰度矢量。
转换成核卷积的方式:(3×3)
这里写图片描述
这里写图片描述

如果梯度G大于某一阈值,则认为该点(x,y)为边缘点。

Summary:Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

Laplace算子
反映的是二阶导数信息,一个二维图像函数的Laplace变换是各向同性的二阶导数。
这里写图片描述

转换成模板的形式:
这里写图片描述这里写图片描述

Tips:由Laplace算子获得图像锐化效果,由mask中心系数负正分为:
这里写图片描述

Summary:从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用Laplace运算就会使这个亮点变得更亮。用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。

Scharr滤波器
Scharr滤波器其实相当于Sobel算子,相当于Sobel算子采取固定核大小的实现。在程序编写中,也是基于Sobel算子,只不过把核的大小选取这一步骤给省略了。

Canny算子
state-of-art technology,Canny于1986年开发出,并创立了边缘检测计算理论,解释了边缘检测技术是如何工作的。他提出了最优边缘检测的三个主要评价标准。
1)低错误率。标识出尽可能多的边缘,并减小噪声误报。
2)高定位性。标识的边缘与实际边缘尽可能接近。
3)最小响应。图像的边缘只能标识一次,可能存在的图像噪声不应标识为边缘。

操作步骤:1)Denoise. 利用高斯平滑滤波器卷积降噪。
2)Sobel算子。按照Sobel算子的步骤来操作,计算梯度幅值和方向。
在方向选取上取4个角度之一进行量化。以45度为限。
3)Restriction. 非极大值抑制,滤除非边缘像素,寻找像素点局部最大值,将非极大值点所对应的灰度值置为0。
4)Threshold. 使用滞后阈值,即有一个高阈值和一个低阈值,在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像边缘闭合。

********************************华丽丽的分割线********************************************************

Conculsion:所有的边缘检测算法都是基于导数(梯度)的信息去实现的,在主方法确定的情况下,运用各种滤波手段对图像中的奇异点进行滤除,消除噪声与其它因素所造成的像素值突变的干扰,再利用阈值法来达到高质量的边缘识别。

2.边界提取
用到了形态学操作,主要涉及到腐蚀与膨胀。
简单而言,形态学操作就是基于形状的一系列图像处理操作。
腐蚀与膨胀能够完成很多功能:消除噪声;分割出独立的图像元素;求出图像梯度;找到图像中明显的极大值与极小值区域等等。
注意:腐蚀与膨胀是对白色区域而言的(二值图像,非黑即白)。膨胀是对图像中的高亮部分进行膨胀,类似于扩张,能得到比原图更大的高亮区域,腐蚀则相反,类似于蚕食,得到比原图更小的高亮区域。
从数学角度来看,膨胀或腐蚀操作就是将图像(或某一部分)与核进行卷积。核B的大小也叫结构体。

要得到边界,可以用膨胀后的图减去原图,或者原图减去腐蚀后的图。

3.骨架提取(图像细化)
简单来说,图像的细化就是经过一层层的剥离,去掉一些点,但要保持原来的形状,一直到能得到图像的骨架。
Zhang-Suen细化算法通常是一个迭代算法,整个迭代过程分为两步:

Step One:循环所有前景像素点,对符合如下条件的像素点标记为删除:

  1. 2 <= N(p1) <=6

  2. S(P1) = 1

  3. P2 * P4 * P6 = 0

  4. P4 * P6 * P8 = 0

其中N(p1)表示跟P1相邻的8个像素点中,为前景像素点的个数

S(P1)表示从P2 ~ P9 ~ P2像素中出现0~1的累计次数,其中0表示背景,1表示前景

完整的P1 ~P9的像素位置与举例如下:
这里写图片描述

其中 N(p1) = 4, S(P1) = 3, P2*P4*P6=0*0*0=0, P4*P6*P8=0*0*1=0, 不符合条件,无需标记为删除。

Step Two:跟Step One很类似,条件1、2完全一致,只是条件3、4稍微不同,满足如下条件的像素P1则标记为删除,条件如下:

  1. 2 <= N(p1) <=6

  2. S(P1) = 1

  3. P2 * P4 * P8 = 0

  4. P2 * P6 * P8 = 0

循环上述两步骤,直到两步中都没有像素被标记为删除为止,输出的结果即为二值图像细化后的骨架。
参考:CSDN图像细化

代码

1.边缘检测
①Sobel算子

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

Mat g_srcImage, g_GrayImage, g_dstImage;
Mat g_sobelGradient_x, g_sobelGradient_y;
Mat g_sobelAbsGradient_x, g_sobelAbsGradient_y;
int g_sobelKernelSize = 1;


static void on_Sobel(int, void*)
{
    Sobel(g_GrayImage, g_sobelGradient_x, -1, 1, 0, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
    convertScaleAbs(g_sobelGradient_x, g_sobelAbsGradient_x);

    Sobel(g_GrayImage, g_sobelGradient_y, -1, 0, 1, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
    convertScaleAbs(g_sobelGradient_y, g_sobelAbsGradient_y);

    addWeighted(g_sobelAbsGradient_x, 0.5, g_sobelAbsGradient_y, 0.5, 0, g_dstImage);
    imshow("result", g_dstImage);
}

int main()
{
    system("color 2F");

    g_srcImage = imread(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值