图像分割技术,顾名思义,就是将一幅数字图像分割成不同的区域,主要包括:图像边缘分割技术,阈值分割技术和区域分割技术。
这里先简单介绍一下边缘分割技术。
边缘检测是检测图像特性发生变化的位置,比如图像在边界处会有明显的不同,边缘分割技术就是检测出不同区域的边界来进行分割,常见的边缘检测方法包括有微分算子,Canny算子和LOG算子等,其中微分算子常用的有Sobel算子,Roberts算子和Prewitt算子,下面对几种算子的用法和调用格式进行详细的介绍(理论基础略过,可自行百度)。
算子:将图像点(x,y)某个邻域中每个像素值都与模板中对应的系数相乘,然后将结果进行累加,得到该点的新像素值。如果邻域的大小为m×n,则共有m×n个系数,这些系数组成的矩阵,就称为模板或算子。通常采用的算子为3×3
注:边缘检测采用的函数为edge(),只需变换算子即可,且得到的BW图像均为二值图像,即只有黑白两种颜色值
(1)微分算子
——Roberts算子:由以下两个模板组成
matlab中调用格式为:
①BW=edge(I,‘roberts’);
②BW=edge(I,‘roberts’,thresh);
thresh为分割阈值,函数会忽略小于thresh的像素值
③[BW,thresh]=edge(I,‘roberts’,…);
——Prewitt算子:由以下两个模板组成,分别代表图像的水平梯度和垂直梯度matlab中调用格式为:
①BW=edge(I,‘prewitt’);
②BW=edge(I,‘prewitt’,thresh);
③BW=edge(I,‘prewitt’,thresh,direction);
direction是对方向进行设置,可以取值为水平horizontal,垂直vertical和both,默认为both
④[BW,thresh]=edge(I,‘prewitt’,…);
——Sobel算子:由以下两个模板组成
matlab中调用格式为:
①BW=edge(I,‘sobel’);
②BW=edge(I,‘sobel’,thresh);
③BW=edge(I,‘sobel’,thresh,direction);
④[BW,thresh]=edge(I,‘sobel’,…);
注:可以看出调用格式基本类似,只需要换掉所需要的算子即可
(2)Canny算子
优点:低误码率,高定位精度,抑制虚假边缘等
matlab中调用格式为:
①BW=edge(I,‘canny’);
②BW=edge(I,‘canny’,thresh);
③BW=edge(I,‘canny’,thresh,sigma);sigma为高斯滤波器的标准差,默认值为1
④[BW,thresh]=edge(I,‘canny’,…);
(3)LOG算子
优点:边界定位精度高,抗干扰能力强,连续性好
matlab中调用格式为:
①BW=edge(I,‘log’);
②BW=edge(I,‘log’,thresh);
③BW=edge(I,‘log’,thresh,sigma);sigma为LOG滤波器的标准差,默认值为2
④[BW,thresh]=edge(I,‘log’,…);
(1)微分算子:
这里用prewitt算子举例,其他算子应用方法一样
close all;clear all;clc;
I=imread('cameraman.tif');
I=im2double(I);
[J1,thresh]=edge(I,'prewitt',[],'both');
[J2,thresh]=edge(I,'prewitt',[],'horizontal');
[J3,thresh]=edge(I,'prewitt',[],'vertical');
figure('NumberTitle','off','Name','prewitt算子进行边缘检测');
subplot(221);imshow(I);title('原始图像');
subplot(222);imshow(J1);title('采用prewitt算子进行边缘检测,方向为水平和垂直');
subplot(223);imshow(J2);title('采用prewitt算子进行边缘检测,方向为水平');
subplot(224);imshow(J3);title('采用prewitt算子进行边缘检测,方向为垂直');
(2)Canny算子和LOG算子:
对添加了噪声的图像进行边缘检测
clear all; close all;
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I, 'gaussian', 0, 0.001);
[BW1,thresh]=edge(J, 'canny');
[BW2,thresh]=edge(J, 'log', [], 2.3);
figure;
subplot(131); imshow(J);title('原图');
subplot(132); imshow(BW1);title('采用Canny算子边缘检测');
subplot(133); imshow(BW2);title('采用LOG算子边缘检测');