close all; clear all; clc;
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];
h3=[-1, 2, -1; -1, 2, -1; -1, 2, -1];
h4=[2, -1, -1; -1, 2, -1; -1, -1, 2];
J1=imfilter(I,h1); %线段检测
J2=imfilter(I,h2);
J3=imfilter(I,h3);
J4=imfilter(I,h4);
J=J1+J2+J3+J4; %4条线段叠加
figure;
subplot(121);imshow(I); %显示灰度图像
subplot(122);imshow(J); %显示检测到的线段
仅计算相邻像素的灰度差,对噪声比较敏感,无法抑制噪声的影响。
用垂直和水平差分来逼近梯度算子
与梯度算子检测边缘的方法类似,对噪声敏感,但效果较梯度算子略好。
close all; clear all; clc;
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); %显示边缘图像
图像的水平梯度和垂直梯度
在检测边缘的同时也能抑制噪声的影响。
close all; clear all; clc;
I=imread('cameraman.tif');
I=im2double(I);
[J,thresh]=edge(I,'prewitt',[],'both'); %prewitt算子进行边缘检测
figure;
subplot(121);imshow(I); %显示原始图像
subplot(122);imshow(J); %显示边缘图像
对4邻域采用带权方法计算差分;进一步抑制噪声;但检测的边缘较宽。
close all; clear all; clc;
I=imread('gantrycrane.png');
I=rgb2gray(I);
I=im2double(I);
[J,thresh]=edge(I,'sobel',[],'horizontal'); %sobel算子进行边缘检测
figure;
subplot(121);imshow(I); %显示原始图像
subplot(122);imshow(J); %显示边缘图像
低误码率、高定位精度和抑制虚假边缘等优点。
close all; clear all; clc;
I=imread('rice.png');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.01); %添加高斯噪声
[K,thresh]=edge(J,'canny'); %Canny算子进行边缘检测
figure;
subplot(121);imshow(J); %显示原始图像
subplot(122);imshow(K); %显示边缘图像
二阶微分算子
优点:各向同性、线性和位移不变的;对细线和孤立点检测效果较好。
缺点:对噪声敏感,有双倍加强作用;不能检测出边的方向;常产生双像素的边缘。
由于梯度算子和拉普拉斯算子对噪声敏感,因此一般在用它们检测边缘前要先对图像进行平滑。
LOG算子:首先采用Guassian函数对图像进行平滑,然后采用Laplacian算子根据二阶导数过零点来检测图像边缘。
优点:边界定位精度高,抗干扰能力强,连续性好等。
close all; clear all; clc;
I=imread('cameraman.tif');
I=im2double(I);
J=imnoise(I,'gaussian',0,0.005); %添加高斯噪声
[K,thresh]=edge(J,'log',[],2.3); %LOG算子进行边缘检测
figure;
subplot(121);imshow(J); %显示原始图像
subplot(122);imshow(K); %显示边缘图像
阈值分割技术:寻找合适的阈值,通常根据图像的直方图来选取。
分成两个区域:目标对象和背景对象,选取直方图中波谷点的灰度值作为全局阈值,对图像进行阈值分割,将图像中的物体和背景分割开。
close all; clear all; clc;
I=imread('rice.png');
figure;
subplot(121);imshow(I); %显示图像
subplot(122);imhist(I,200); %显示直方图
close all; clear all; clc;
I=imread('rice.png');
J=I>120; %图像分割,阈值为120
[width,height]=size(I); %图像的行和列
for i=1:width
for j=1:height
if (I(i,j)>130) %图像分割,阈值为130
K(i,j)=1;
else
K(i,j)=0;
end
end
end
figure;
subplot(121);imshow(J);
subplot(122);imshow(K);
im2bw(I,level); 将灰度图像转换为二值图像
close all; clear all; clc;
[X, map]=imread('trees.tif');
J=ind2gray(X,map); %索引图像转换为灰度图像
K=im2bw(X,map,0.4); %图像分割
figure;
subplot(121);imshow(J);
subplot(122);imshow(K);
Otsu算法:在灰度直方图的基础上采用最小二乘法原理推导出来的,具有统计意义上的最佳分割。
基本原理:以最佳阈值将图像的灰度值分割成两部分,使两部分之间的方差最大,即具有最大的分离性。
close all; clear all; clc;
I=imread('coins.png');
I=im2double(I);
T=graythresh(I); %获取阈值
J=im2bw(I,T); %图像分割
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);
迭代阈值法:阈值法图像分割中比较有效的方法,通过迭代的方法来求出分割的最佳阈值,具有一定的自适应性。
优点:顾及了像素的连续性
缺点:区域增长是一种迭代的方法,空间和事件开销都比较大。
区域生长:一种串行区域分割的图像分割方法。
基本思想:将具有相似性质的像素集合起来构成区域。
具体步骤:1.选择一个或一组种子;
2.选择特征及相似性判决准则;
3.从该种子开始向外生长,首先将判断种子领域的像素是否满足相似性条件,满足则与种子合并成区域,然后以合并的像素为生长点,采用类似的方法进行生长
4.反复3操作,直到不再有满足条件的像点合并到区域为止。
分水岭分割:借鉴了形态学理论,相当于一个自适应的多阈值分割算法。
基本思想:在该方法中,将一幅图像看成一个地形图,灰度值对应地形的高度值,高灰度对应着山峰,低灰度对应着山谷。水总是朝地势低的地方流动,直到某个局部低洼处,这个低洼处就是盆地。最终所有的水都会处于不同的盆地,盆地之间的山脊称为分水岭。
分水岭分割函数:watershed()
close all; clear all; clc;
I=imread('circbw.tif');
J=watershed(I,8); %分水岭分割
figure;
subplot(121);imshow(I);
subplot(122);imshow(J);