【数字图像处理】M7. 图像分割 Image Segmentation (with MATLAB)
一、阈值 Threholding
若想将图片二值化,定义一个阈值是最简单的方法,通过graythresh可以获得一个较优的阈值。如果目标是一个特定的灰度,也可以使用阀值来二值化。有些时候,对于一副图片不能简单地去定义一个阈值或阀值,这时候可以对不同区域使用不同的阈值来处理。
im = imread('circles.tif');
x = ones(256, 1) * [1 : 256];
im2 = double(im) .* (x / 2 + 50) + (1 - double(im)) .* x / 2;
im3 = uint8(255 * mat2gray(im2));
subplot(1, 3, 1);
imshow(im3);
title('Origin');
subplot(1, 3, 2);
t = graythresh(im3);
imt = im2bw(im3, t);
imshow(imt);
title('Single Thresholding');
subplot(1, 3, 3);
p1 = im3(:, 1 : 64);
p2 = im3(:, 65 : 128);
p3 = im3(:, 129 : 192);
p4 = im3(:, 193 : 256);
g1 = im2bw(p1, graythresh(p1));
g2 = im2bw(p2, graythresh(p2));
g3 = im2bw(p3, graythresh(p3));
g4 = im2bw(p4, graythresh(p4));
imshow([g1 g2 g3 g4]);
title('Adaptive Thresholding');
二、边缘检测 Edge Detection
对于边缘检测,可直接使用Prewitt、Roberts、Sobel等滤波,理论上这三种中Sobel的效果最好。Laplacian通过二阶导实现,对噪声比较敏感,给出双重的边界,一般可以找过零点来获得更好的结果。Matlab中提供edge(image, type)进行边缘检测。
在下面的示例中,为了查看各个方法对噪声的适应能力,原始图像加了1%的椒盐噪声。
im = imread('cameraman.tif');
im = imnoise(im, 'salt & pepper', 0.01);
subplot(2, 3, 1);
imshow(edge(im, 'prewitt'));
title('Prewitt');
subplot(2, 3, 2);
imshow(edge(im, 'roberts'));
title('Roberts');
subplot(2, 3, 3);
imshow(edge(im, 'sobel'));
title('Sobel');
subplot(2, 3, 4);
imshow(edge(im, 'zerocross'));
title('Zero Cross');
subplot(2, 3, 5);
imshow(edge(im, 'log'));
title('Log');
subplot(2, 3, 6);
imshow(edge(im, 'canny'));
title('Canny');