目录
一、基础知识
本章的多数分割算法都是基于灰度值的不连续性和相似性的,第一种是以灰度突变为基础分割一幅图像;第二种主要是根据一组预定义的准则将一幅图像分割为相似的区域。
分割中的基本问题就是把一幅图像分成满足如下4个条件的多个区域
- 必须是完全的
- 一个区域中的点以某些预定义的方式来连接
- 各个区域必须不相交
- 分割后的区域中的像素必须满足一些属性
二、点、线和边缘检测
边缘像素是图像中灰度突变的像素,边缘是连接的边缘像素的集合。一条线可以视为一个边缘线段,孤立点可以视为长度和宽度都为一个像素的线。
1.背景
可以使用一阶微分和二阶微分来检测局部的变化,有着以下结论:
- 一阶导数通常在图像中产生较粗的边缘
- 二阶导数对精细细节有较强的响应
- 二阶导数在灰度斜坡和灰度台阶过渡处会产生双边缘响应
- 二阶导数的符号可用于确定边缘的过渡是从亮到暗还是从暗到亮
2.孤立点的检测
是以二阶导数为基础的,使用拉普拉斯:
输出图像中把已被检测到的点标注为1,所有其他点标注为0,以此产生一幅二值图像。是否检测到通过判断该点在该模板的响应的绝对值是否超过一个指定的阈值。
3.线检测
它的复杂度更高,对于线检测,二阶导数将导致更强的响应,并产生比一阶导数更细的线。可以使用拉普拉斯模板,并且对于二阶导数的双线效应要做适当的处理。对于如下4个模板,第一个对水平方向的线有最佳响应;第二个对45°方向的线有最佳响应;第三个对垂直线有最佳响应;第四个对-45°方向的线有最佳响应。模板的系数之和为0表明恒定灰度区域中的响应为0。

如果对检测图像中由给定模板定义的方向上所有的线感兴趣只须简单的对该图像运行这个模板,并对结果的绝对值进行阈值处理。
4.边缘模型
边缘检测是基于灰度突变来分割图像最常用的方法。边缘模型根据灰度剖面来分类,分为台阶模型、斜坡模型和屋顶边缘模型,台阶边缘是指在1个像素的距离上发生两个灰度级间理想的过度。数字图像都存在被模糊且带有噪声的边缘,模糊的程度取决于聚焦机理中的限制,噪声水平取决于成像系统的电子元件。
屋顶边缘是通过一个区域的线的模型,其基底由线的宽度和尖锐度来决定。零灰度轴和二阶导数极值间的连线的交点叫做二阶导数的零交叉点。一阶导数的幅度可用于检测图像中的某个点处是否存在一个边缘;二阶导数的符号可用于确定一个边缘像素位于该边缘的暗的一侧还是亮的一侧。
5.基本边缘检测
为了达到寻找边缘的目的,检测灰度变化可用一阶或二阶导数来完成。梯度是用来在一幅图像f的(x,y)处寻找边缘的强度和方向的,使用来表示,其指出了f在(x,y)处的最大变化率方向。梯度向量有时也称为边缘法线,向量除以其幅值而归一化为单位长度时的结果向量称为边缘单位法线。
罗伯特交叉梯度算子是最早尝试使用具有对角优势的二维模板之一,其表示为
Prewitt算子,考虑了中心点对端数据的性质,携带有关边缘方向的更多信息
Sobel算子,可以更好的抑制噪声

在计算梯度前对图像进行平滑处理,边缘检测可做更多的选择,还可以使用对梯度图像进行阈值处理来实现相同的目标。如下是一个边缘检测算子的实验,其代码为:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\test\121.png')
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)
# Sobel算子
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
# Roberts算子
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX, 0.5, ab

学习笔记第十章&spm=1001.2101.3001.5002&articleId=140077287&d=1&t=3&u=f9e7740718a948b095cb238588b8bfb7)
474

被折叠的 条评论
为什么被折叠?



