全局阈值处理
% 迭代实现方式
T = 0.5*(double(min(f(:)))+double(max(f(:))));
done = false;
while ~done
g = f>=T;
Tnext = 0.5*(mean(f(g))+mean(f(~g)));
done = abs(T - Tnext) < 0.5;
T = Tnext;
end
局部阈值处理
代码示例
f = imread('scanned-text-grayscale.tif');
T = graythresh(f); % 自动获取阈值
T = T*255; % 阈值在区间[0,1],需调整至[0,255]
g = f<=T;
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title(['阈值处理,阈值为' num2str(T)]);
运行结果
区域生长
区域分离和合并
使用距离变换的分水岭分割
代码示例
f = imread('binary_dowel_image.tif'); % 二值图像
% g = im2bw(f,graythresh(f)); % 变换为二值图像的方法
gc = ~f;
D = bwdist(gc); % 距离变换
L = watershed(-D); % 计算距离变换的负分水岭变换
w = L == 0;
g2 = f & ~w; % 黑色叠加在原图上后的分水岭脊线
% 一些对象并未正确分离,称之为过分割
subplot(3,2,1);imshow(f);title('原二值图像');
subplot(3,2,2);imshow(gc);title('图像的补');
subplot(3,2,3);imshow(D,[]);title('距离变换');
subplot(3,2,4);imshow(L,[]);title('负分水岭变换');
subplot(3,2,5);imshow(g2);title('分割结果');
运行结果
使用梯度的分水岭分割
代码示例
f = imread('small-blobs.tif');
fd = double(f);
h = fspecial('sobel'); % 形态学梯度
g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2); % 梯度幅度
L = watershed(g); % 分水岭变换
wr = L ==0; % 分水岭脊线
% 在计算分水岭变换前先平滑梯度图像
g2 = imclose(imopen(g,ones(3,3)),ones(3,3)); % 闭-开运算
L2 = watershed(g2); % 分水岭变换
wr2 = L2 ==0;
f2 = f;
f2(wr2) = 255;
subplot(2,2,1);imshow(f);title('原灰度级图像');
subplot(2,2,2);imshow(g,[]);title('梯度幅度图像');
subplot(2,2,3);imshow(wr);title('分水岭变换过分割');
subplot(2,2,4);imshow(f2);title('先平滑梯度图像再分水岭变换');
运行结果
控制标记符的分水岭分割
代码示例
f = imread('gel-image.tif');
fd = double(f);
h = fspecial('sobel');
g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2); % 梯度幅度
L = watershed(g); % 分水岭变换
wr = L ==0; % 分水岭脊线
% 可以观察到部分由大量局部最小区域导致的过分割结果
rm = imregionalmin(g);
% 观察到多数局部最小区域位置非常浅,有许多于分割问题不相关的细节
im = imextendedmin(f,2); % 获取内部标记符集合
fim = f; % 2为高度阈值
fim(im) = 175;
% 在原图像上以灰色气泡形式叠加扩展的局部最小区域位置
Lim = watershed(bwdist(im)); % 获取外部标记符
em = Lim ==0;
% 显示em的分水岭脊线
g2 = imimposemin(g , im | em); % 强制最小技术
% 修改灰度级图像,以便局部最小区域仅出现在标记的位置
L2 = watershed(g2);
f2 = f;
f2(L2 ==0) = 255;
% 修改了标记符的梯度图像的分水岭脊线
subplot(3,3,1);imshow(f);title('原凝胶图像');
subplot(3,3,2);imshow(wr);title('分水岭变换过分割');
subplot(3,3,3);imshow(rm);title('梯度幅值的局部最小区域');
subplot(3,3,4);imshow(fim);title('内部标记符');
subplot(3,3,5);imshow(em);title('外部标记符');
subplot(3,3,6);imshow(g2,[]);title('修改后的梯度幅值');
subplot(3,3,8);imshow(f2);title('分割结果');
运行结果