阈值分割

全局阈值处理



图像分割opencv 图像分割matlab程序_图像处理


% 迭代实现方式
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

局部阈值处理



图像分割opencv 图像分割matlab程序_图像处理_02


  代码示例

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)]);

  运行结果



图像分割opencv 图像分割matlab程序_图像处理_03



基于区域的分割

区域生长



图像分割opencv 图像分割matlab程序_图像处理_04




图像分割opencv 图像分割matlab程序_matlab_05




图像分割opencv 图像分割matlab程序_图像分割opencv_06


区域分离和合并



图像分割opencv 图像分割matlab程序_matlab_07




图像分割opencv 图像分割matlab程序_图像处理_08



使用分水岭变换的分割

使用距离变换的分水岭分割



图像分割opencv 图像分割matlab程序_图像分割opencv_09




图像分割opencv 图像分割matlab程序_图像处理_10


  代码示例

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('分割结果');

  运行结果



图像分割opencv 图像分割matlab程序_图像处理_11


使用梯度的分水岭分割



图像分割opencv 图像分割matlab程序_图像分割opencv_12


  代码示例

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('先平滑梯度图像再分水岭变换');

  运行结果



图像分割opencv 图像分割matlab程序_二值图像_13


控制标记符的分水岭分割



图像分割opencv 图像分割matlab程序_二值图像_14


  代码示例

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('分割结果');

  运行结果



图像分割opencv 图像分割matlab程序_二值图像_15