Matlab数字图像处理基础【10】

来源:互联网 发布:淘宝店铺怎么取名 编辑:程序博客网 时间:2024/05/01 02:25

第六章 图像分割

实例:使用区域生长算法实现图像分割


clear;clc;close all;%读入图像I = imread('shape.jpg');I = double(I);%设定阈值,用来衡量像素点灰度之间的相似性T = 10;%用户选择种子点生成方式[sel,ok]=listdlg('liststring',{'按照灰度级设定种子','选点设定种子'},...??    'listsize',[300 200],'OkString','确定','CancelString','取消',...??    'promptstring','种子生成方式','name','选择种子生成方式','selectionmode','single');%使用灰度级设定种子点if sel == 1    %用户指定灰度级    answer = inputdlg('请输入灰度级:');    subplot(2,2,1),imshow(I, []),title('原图像');    %获取用户的输入并转换成double类型    S = str2double(answer{1,1});    %原图中所有灰度级为S的点都被选定为种子,种子位置保存在SI中    %SI是和原图规模相同的矩阵,有种子的位置其值为1,否则为0    SI = I == S;    %S1中保存的是种子点的灰度值    S1 = S;    subplot(2,2,2),imshow(SI),title('种子点分布');else    %用户用鼠标左键点击选取种子点,选取结束后使用回车键进行下一步操作    %使用鼠标左键在原图上点击以选取种子点,可以选择多个点,选择结束后按回车键进行下一步    if(exist('x','var') == 0 && exist('y','var') == 0)        subplot(2,2,1),imshow(I, []),title('原图像');        hold on;        [x_list, y_list]=getpts;        [m, n] = size(I);        S = zeros(m, n);        subplot(2,2,2),imshow(I, []),title('种子点分布');        hold on;        for i = 1:length(x_list)            %依次获取用户点击的点的坐标            x = round(x_list(i));            y = round(y_list(i));            %把种子点的位置保存在矩阵S中,横坐标对应矩阵的列数,纵坐标对应矩阵的行数            S(y, x) = 1;            plot(x, y, 'r*');        end          end        SI = bwmorph(S, 'shrink', Inf);    %获取种子点在原图中的位置    J = find(SI);    %在S1中保存种子点的灰度信息    S1 = I(J);    %subplot(2,2,2),imshow(SI),title('种子点分布');end%TI保存所有灰度和种子灰度值差异小于阈值的点的位置TI = zeros(size(I));%有几个种子灰度值,进行几次循环判定for K = 1:length(S1)    %获取当前种子灰度值    seedvalue = S1(K);    %S中保存所有灰度值和当前种子灰度值的差异小于阈值的点的位置    %矩阵S和原图规模相同,原图中符合灰度值阈值判定的点在S的相应位置保存‘1’值,否则为‘0’值    S = abs(I - seedvalue) <= T;    %将当前结果汇总到TI中    TI = TI | S;end%依据种子点位置SI和所有通过灰度级阈值筛选的点集TI进行形态学重建%说明区域生长算法在考虑灰度值信息的同时也考虑了位置信息,把所有通过灰度级阈值筛选的点和种子点的位置进行比较,筛选通过灰度级阈值筛选的点,从而得到最终分割结果[I1, NR] = bwlabel(imreconstruct(SI, TI));subplot(2,2,3),imshow(TI),title('通过阈值测试的图像');subplot(2,2,4),imshow(I1),title('分割结果');

实验结果-使用灰度值设定种子点:


实验结果-人工选取指定种子点:

0 0
原创粉丝点击