2017-12-21 21:42:15 coming_is_winter 阅读数 837
图像处理之图像分割(二)之边缘分割之边缘松弛

              对于书中的边缘松弛算法进行一下拓展,,便于理解。



 
              代码方面还没头绪,后续再说。
2017-12-15 15:00:53 v_ahawodouliyoutang 阅读数 1712

刚刚接触到数字图像处理,跟着导师做相关项目,现在只是对图像分割技术有所了解,如果写的不对的地方还请大家指出,谢谢。

参考的课本  数字图像处理(刚萨雷斯)

我对图像边缘检测的理解:人的视觉上就是把图像中的一座房子的边缘给画出来,大多数是房子的线条,这是宏观上的理解。让我们抽象到微观世界中,为什么能够检测出一条线呢?那是因为存在灰度级间断,就是说这条线两边的像素点都处于一个阶跃跳变状态(一部分显示黑,一部分显示白色,可以想象成一个台阶吧),那是理想模型,往往是因为物理硬件问题是无法达到骤变的效果,而是一个斜坡式的上升。那么我们可以对它进行求导了。一阶导数:可以判断是否是边界   二阶导数:可以判断是在黑的那部分还是白的那部分。

明白了抽象状态的边缘组成状况,那么可以去拿算子来对图片进行检测了。

简单说一下算子吧,可以理解为一个模(mu)子,也就是个模型,你拿着这个模子从图像的左上角,从左往右,一行一行的进行匹配,中间会进行一个计算,算出的值如果大于阈值的话那么就会报警说:“我是边缘“,然后把那个像素的值改成256,如果不是边缘的话,那就把值设置成0。基本的理解是这样吧。

Roberts,Prewitt,Sobel算子都是比较传统的算子相对来说比较好理解,课本上讲的比较详细。提供一下matlab实现的基本方法吧:

1.读入图片数据
2.实现图像矩阵的归一化操作  mat2gray(img) 
3.设置一个图像的边缘像素
4.经过roberts算子得到的每个像素的值
5.设置阈值
进入双层for循环,让3*3算子一行一行进行遍历 ,遍历之后执行算子,然后将数值对阈值进行比对,如果超过那么为白 ,如果没有超过为黑。最后输出

在图像处理中噪声的影响其实是很大的,对于loG算子和canny算子都先进行了高斯滤波,目的是让图像变得更平滑(实现的话可以采用edge算法)

(edge算法只能处理double的图形 ,找到的方法是先对图像进行二值变化(im2bw),然后再去对图形进行double转换 然后再使用edge方法)edge方法封装了这些算子,方便实用........


第一次写博客,发现缺少实验数据,同时还是对理论有所欠缺(例如在canny和loG算子上没有更深入的理解内核,博主一会仔细看看,就不写了).......我感觉应该会有问题的,请大家指正,谢谢。


2019-08-22 09:57:02 weixin_42618420 阅读数 427

图像分割技术

图像分割 : 根据灰度 , 颜色 , 纹理等,将图像进行分割.

常用的分割技术 :

边缘检测法  阈值分割法  区域分割法

阈值分割法 : 是最经典最流行的图像分割方法之一 , 也是最简单的分割方法 . 其关键是找合适的灰度阈值. 通常是根据图像的灰度

直方图来选取. 阈值分割特别适用于目标和背景处于不同灰度级范围的图像.

边缘分割技术

微分算子, Canny 算子 , LOG算子

常见的微分算子 : Sobel算子  Roberts 算子  Prewit 算子

图像中线段检测

函数 imfilter ( )

I = imread('gantrycrane.png');
I = rgb2gray(I);
h1 = [-1 -1 -1; 2 2 2; -1 -1 -1]; %水平
h2 = [-1 -1 2; -1 2 -1; 2 -1 -1]; %+45度
h3 = [-1 2 -1; -1 2 -1; -1 2 -1]; %竖直
h4 = [2 -1 -1; -1 2 -1; -1 -1 2]; %-45度

J1 = imfilter(I, h1); %线段检测
J2 = imfilter(I, h2);
J3 = imfilter(I, h3);
J4 = imfilter(I, h4);

J = J1 + J2 + J3 + J4; %四条线段叠加
figure;
subplot(121),imshow(I);
subplot(122),imshow(J);

微分算子

Roberts算子

函数 edge ( )

I = imread('rice.png');
I = im2double(I);
[J, thresh] = edge(I, 'Roberts', 35/255); %边缘检测 ,roberts算子, 阈值为归一化后的35/255
figure;
subplot(121),imshow(I);
subplot(122),imshow(J);

Prewitt 算子

函数 edge ( )

I = imread('cameraman.tif');
% I = imread('rice.png');
I = im2double(I);
[J, thresh] = edge(I, 'prewitt', [], 'both');%默认阈值, 从水平和竖直方向进行设置
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

Sobel 算子

函数 edge ( )

I = imread('gantrycrane.png'); %RGB彩色图
% imshow(I);
I = rgb2gray(I);
[J, thresh] = edge(I, 'sobel', [], 'horizontal');
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);

Canny 算子

函数 edge ( )

LOG 算子

函数 edge ( )

I = imread('cameraman.tif');
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.005);
[K, thresh] = edge(J, 'Log', [], 2.3);
figure;
subplot(121),imshow(I);
subplot(122),imshow(K);

Log 算子

阈值分割技术

全局阈值

直方图显示

I = imread('rice.png');
subplot(121),imshow(I);
subplot(122),imhist(I, 200); %直方图显示

全局阈值分割

I = imread('rice.png');
J = I > 120; %全局阈值为120 , 波谷大概是120
K = I > 130; %全局阈值为130
figure;
subplot(131),imshow(I);
subplot(132),imshow(J);
subplot(133),imshow(K);

Otsu阈值分割

I = imread('coins.png');
I = im2double(I);
T = graythresh(I); %获取阈值
J = im2bw(I, T); %图像分割
subplot(121),imshow(I);
subplot(122),imshow(J);

迭代式阈值分割法

clear, clc
I = imread('cameraman.tif');
I = im2double(I);
T0 = 0.01; %精度
% T1 = graythresh(I) %用Otsu求阈值
T1 = min(I(:)) + max(I(:)) / 2; %初始估计阈值
r1 = find(I > T1); %找出比阈值大的像素
r2 = find(I <= T1); %找出比阈值小的像素
T2 = (mean(I(r1)) + mean(I(r2))) / 2; %各个像素加和求平均
while abs(T2 - T1) < T0 %
    T1 = T2;
    r1 = find(I > T1);
    r2 = find(I <= T1);
    T2 = (mean(I(r1)) + mean(I(r2))) / 2;
end

J = im2bw(I, T2);
subplot(121),imshow(I);
subplot(122),imshow(J);

区域分割技术

区域生长法

将相邻的具有同种性质的像素或其他区域归并刀目前的区域中从而逐步增长区域

相似性度量 : 平均灰度值, 纹理, 颜色

缺点 : 往往造成过度分割

取决分割好坏的三个因素 : 种子点的选取  生长规则  终止条件

分水岭分割

clear,clc;
I = imread('circbw.tif');
J = watershed(I, 4); % 4个连通区域,默认为8
subplot(121),imshow(I);
subplot(122),imshow(J);

2019-12-14 23:09:58 qq_43571150 阅读数 71

Matlab-图像分割与边缘检测实验-采用阈值处理方法进行图像分割

代码链接:https://download.csdn.net/download/qq_43571150/12033271

问题
实现直方图阈值法,具体方法为采用灰度直方图求双峰或多峰,选择两峰之间的谷底作为阈值,将图像转换为2值图像。

图像结果👇
在这里插入图片描述

Matlab代码👇

I=imread('05.jpg');       %读取当前路径下的图片
I1=rgb2gray(I);
subplot(2,2,1);imshow(I1);title('灰度图像');

grid on;                        %显示网格线
axis on;                        %显示坐标系
[m,n]=size(I1);                 %测量图像尺寸参数
GK=zeros(1,256);                %预创建存放灰度出现概率的向量
for k=0:255
	 GK(k+1)=length(find(I1==k))/(m*n);             %计算每级灰度出现的概率,将其存入GK中相应位置
end
subplot(2,2,2),bar(0:255,GK,'g')                    %绘制直方图

title('灰度直方图')
xlabel('灰度值')
ylabel('出现概率')
I2=im2bw(I,200/255); 	
subplot(2,2,3),imshow(I2);title('直方图阈值处理分割图像')
imwrite(I2,'05 直方图阈值200的分割图像.jpg');
grid on;                         %显示网格线
axis on;                         %显示坐标系
2019-11-15 13:57:37 BOTAK_ 阅读数 38

图像分割与边缘检测

图像分割在整个图像处理过程中的作用
1
一些概念:前景,背景

三大类方法

  1. 根据区域间灰度不连续搜寻区域之间的边界(奇异性检测,边缘连接,边界检测)
  2. 以像素性质的分布进行阈值处理(阈值处理)
  3. 直接搜寻区域进行分割(基于区域的分割)

奇异性检测

奇异性

图像的奇异性是指图像局部像素的平滑程度,一般情况下,图像的局部区域的像素值是光滑的只有在边界的部分图像的像素值是不光滑的,也就是说是奇异的。
奇异性主要有:点脉冲(遥感图像与卫星成像),线,边缘

  • 点检测 就是用一个8邻域模版
  • 线检测 一般而言有四个模版 水平,正向45度,垂直,反向45度,四个模版算子同时进行,然后取较大值属于的方向
  • 边缘检测 (一阶导数与二阶导数)
    • 梯度是图像对应二维函数的一阶导数,可以用第一,第二,以及无穷范数来衡量梯度的值,梯度的方向为图像的二维函数像素值变化率最大的方向
    • 由于图像由离散的像素点构成,下面的算子用差分近似偏导数
    • Roberts算子
    • Sobel算子
    • Prewitt算子
    • LOG算子
    • Canny算子
Roberts算子

Gx=[1001]G_x = \begin{bmatrix}1 & 0 \\0 & -1\end{bmatrix}

Gy=[0110]G_y = \begin{bmatrix}0 & 1 \\-1 & 0\end{bmatrix}
然后,Roberts算子采用第一范数衡量梯度的幅度
G(x,y)=Gx+Gy|G(x,y)| = |G_x| + |G_y|
Roberts算子对具有陡峭的低噪声图像效果比较好

Sobel算子

Gx=[101202101]G_x = \begin{bmatrix}-1 & 0 & 1\\-2 & 0 & 2 \\-1 & 0 & 1 \end{bmatrix}

Gx=[121000121]G_x = \begin{bmatrix}1 & 2 & 1\\0 & 0 & 0 \\-1 & -2 & -1 \end{bmatrix}
然后,Sobel算子采用无穷范数衡量梯度的幅度
G(x,y)=max(Gx,Gy)|G(x,y)| = max(|G_x| , |G_y|)
Sobel算子对灰度渐变和噪声较多的图像处理的比较好

Prewitt算子

Gx=[101101101]G_x = \begin{bmatrix}-1 & 0 & 1\\-1 & 0 & 1 \\-1 & 0 & 1 \end{bmatrix}

Gx=[111000111]G_x = \begin{bmatrix}-1 & 1 & 1\\0 & 0 & 0 \\-1 & -1 & -1 \end{bmatrix}
然后,Prewitt算子采用无穷范数衡量梯度的幅度
G(x,y)=max(Gx,Gy)|G(x,y)| = max(|G_x| , |G_y|)
Prewitt算子对灰度渐变和噪声较多的图像处理的比较好

Canny算子

Canny算子的梯度是用高斯滤波器的导数计算的,检测边缘的方法是寻找图像梯度的局部极大值。
Canny算法步骤如下:
① 用高斯滤波器平滑图像;
② 计算滤波后图像梯度的幅值和方向;
③ 对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值点置零以得到细化的边缘;
④ 用双阈值算法检测和连续边缘,使用两个阈值T1和T2(T1>T2),T1用来找到每条线段,T2用来在这些线段的两个方向上延伸寻找边缘的断裂处,并连接这些边缘。其中T1代表大于该值的肯定是边缘,T2表示小于该值的肯定不是边缘。

非极大值抑制:

沿幅角方向检测模值的极大值点,即边缘点,遍历8个方向图像像素,把每个像素偏导值与相邻像素的模值比较,取其MAX值为边缘点,置像素灰度值为0.

双阈值检测:

由于单阈值处理时,合适的阈值选择较困难,常常需要采用反复试验,因此采用双阈值检测算法。
对经过非极大值抑制后的图像作用两个阈值th1,th2,th1=0.4th2,两个阈值作用后得到两个图像1、2,较大阈值检测出的图像2去除了大部分噪声,但是也损失了有用的边缘信息。
较小阈值检测得到的图像1则保留着较多的边缘信息,以此为基础,补充图像2中的丢失的信息,连接图像边缘。

连接图像边缘

For Example
2
3

基于二阶导数的边缘检测

图像灰度二阶导数的过零点对应边缘点
4

Laplace算子

拉普拉斯(Laplace)算子是离散二维二阶导数的最简单形式

Marr算子

拉普拉斯-高斯边缘检测算子 LOG:Laplacian Of Gaussian;Marr算子
基本思想:由于拉普拉斯算子对于噪声比较敏感,因此采用先用高斯函数对图像滤波,然后对滤波后的图像进行拉普拉斯运算,算得的值等于零的点认为是边界点。(Marr和Hildreth 1980)
在实际使用中常常对LOG算子进行简化,使用差分高斯函数DOG代替LOG
各种边缘检测算子的比较

算子 特点
Roberts算子 利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘,同时由于图像没经过平滑处理,因此不具备抑制噪声能力。该算子用于具有陡峭边缘且噪声低的图像效果较好。
Sobel算子和Prewitt算子 都是对图像先作加权平滑处理,然后再作微分运算,所不同的是平滑部分的权值有些差异,因此对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘。虽然这两个算子边缘定位效果不错,但检测出的边缘容易出现多像素宽度
Laplacian算子 是不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘点定位准确,该算子对噪声非常敏感,它使噪声成分得到加强,这两个特性使得该算子容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,同时抗噪声能力比较差
LOG算子 该算子克服了Laplacian算子抗噪声能力比较差的缺点,但在抑制噪声的同时也可能将原有的比较尖锐的边缘也平滑掉了,造成这些尖锐边缘无法被检测到

边缘连接和边界检测

why?为什么要进行边缘连接

自然物体是实体,边缘必须连续切封闭,由于噪声、照明等产生边缘间断,使得一组像素难以完整形成边缘,因此,在边缘检测算法后,使用连接过程将间断的边缘像素组合成完整边缘

  • 局部处理
    分析图像中每个边缘点(x,y)的一个邻域内的像素,根据某种准则将相似点进行连接,由满足该准则的像素连接形成边缘,如何确定边缘像素的相似性,边缘像素梯度算子的响应强度,边缘像素梯度算子的方向(Canny 算子)
  • 整体处理之霍夫变换
    对于边界上的n个点的点集,找出共线的点集和直线方程。
    6

阈值处理

基本思想

7

基本全局阈值

计算基本全局阈值算法

  1. 选择一个T的初始估计值
  2. 用T分割图像,生成两组像素:G1由所有灰度值大 于T的像素组成,而G2由所有灰度值小于或等于T的 像素组成
  3. 对区域G1和G2中的所有像素计算平均灰度值µ1和µ2
  4. 计算新的阈值 T = (µ1+µ2)/2
  5. 重复步骤2到4,直到逐次迭代所得的T值之差小于 事先定义的参数T0
    8

基本自适应阈值

单一全局阈值存在的问题:
不均匀亮度图像无法有效分割

将图像进一步细分为子图像,并对不同的子图 像使用不同的阈值处理
解决的关键问题:如何将图像进行细分和如何为得到的子图像估计阈值
自适应阈值:取决于像素在子图像中的位置
9

最佳全局和自适应阈值

它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小

通过边界特性选择阈值

通过边界特性选择阈值
基本思想:
如果直方图的各个波峰很高、很窄、对称,且被很深的波谷分开时,有利于选择阈值
为了改善直方图的波峰形状,我们只把区域边缘的像素计算进直方图,而不考虑区域中间的像素
用微分算子,处理图像,使图像只剩下边界中心两边的值

这种方法有以下优点:
1)在前景和背景所占区域面积差别很大时, 不会造成一个灰度级的波峰过高,而另一 个过低
2)边缘上的点在区域内还是区域外的概率是相等的,因此可以增加波峰的对称性
3)基于梯度和拉普拉斯算子选择的像素,可以增加波峰的相对高度(对比度较大)

基于不同变量的阈值

RGB

基于区域的分割

区域生长的基本概念

区域生长的基本思想是将具有相似属性的像素集合起来构成区域。
具体先对每个需要分割的区域找一个种子像素作为生长的起始点,然后将种子像素周期邻域中与种子像素有相同或相似性质的像素合并到种子像素所在的区域。
将这些新像素当作新的种子像素继续进行上面的过程,直到再没有满足条件的像素。

四叉树分解的分割法

将方形的原始图像分成四个相同大小的方块,判断每个方块是否满足一致性标准;如果满足就不再继续分裂,如果不满足就再细化成四个方块,并对细分得到的方块继续应用一致性经验。
这个迭代重复的过程直到所有的方块都满足一致性标准才停止。
最后,四叉树分解的结果可能包含多种不同尺寸的方块。

用平均灰度分割

基于PDE的图像分割

偏微分方法(Partial Differential Equations, PDE)的图像分割
优点:
1)直接对图像进行分析,是一种连续的模型,连续的微分算子代替了原始的离散滤波,更易于实现网格的划分和局部非线性分析。
2)分割提取的边缘是闭合的连续曲线,很好的避免传统方法先检查出边缘点在进行边缘连接的过程。
3)能在模型中引入图像的曲率、梯度等几何信息,同时还能够融入图像的先验知识和形状信息来指导模型分割

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