您的位置:首页 > 编程语言 > MATLAB

MATLAB 区域生长 连通区域计算 曲线的断点查询

2017-11-06 17:00 1046 查看

区域生长

连通区域计算

曲线的断点查询

实验背景 勾画最内圈水纹

一 区域生长

函数输入

f 原图像输入

S可以是一个数组,也可以是一个数字,若S是一个标量,则f中有着该值的所有点都将变成种子。

T可以是一个数组,也可以是一个标量,若T是一个标量,则它会定义一个全局阈值。阈值用来检测图像中的像素是否与该种子或8连接种子足够相似。

函数输出

g是分割后的图像,每个区域的图像都用整数标出。

NR是不同区域的数目。

TI是一幅包含种子点的图像,该图中包含经过连通区域处理前通过阈值测试的像素。

SI和TI的大小与f相同。

function [g, NR, SI, TI] = regiongrow(f, S, T)
f = double(f);
if numel(S) == 1   %如果只给了一个种子值,也就是说 像素为这个值的点为种子点。
SI = f == S;    %SI是种子点的图像,种子点对应1,其他对应0
S1 = S;         %S1是种子值
else
SI = bwmorph(S, 'shrink', Inf);    %n = Inf时,将目标缩成一个点。没有孔洞的目标缩成一个点,有孔洞的目标缩成一个连通环。
J = find(SI);
S1 = f(J); % Array of seed values.
end

TI = false(size(f));                 %创建逻辑全0矩阵
for K = 1:length(S1)                 %将f每一个像素点依次与所有种子点的值比较,如果差值在T以内,TI对应的地方为1
seedvalue = S1(K);
S = abs(f - seedvalue) <= T;
TI = TI | S;                      %TI是由F中满足阈值测试的像素组成的图像,满足的为1,不满足的为0
end

[g, NR] = bwlabel(imreconstruct(SI, TI));




二 分区域区域生长

x_start=1670;%起始点坐标
y_start=820;
x_end=2270;%终止点坐标
y_end=1220;
X=4000;
T=2400;
g(y_start:y_end,x_start:x_end)=regiongrow(tem(y_start:y_end,x_start:x_end), 3000, 500);
figure(229)
imshow(g);


三 连通区域计算

imBw = im2bw(I);                        %转换为二值化图像
imLabel = bwlabel(imBw);                %对各连通域进行标记
stats = regionprops(imLabel,'Area');    %求各连通域的大小
area = cat(1,stats.Area);
index = find(area == max(area));        %求最大连通域的索引
%idx = find([stats.Area] > 2800);       %选取特定像素大小的连通区域
img = ismember(imLabel,index);          %获取最大连通域图像




四 曲线的断点查询

function g = endpoints(f)
persistent lut
if isempty(lut)
lut = makelut(@endpoint_fcn,3);
end
g =applylut(f,lut);

function is_end_point = endpoint_fcn(nhood)
is_end_point = nhood(2,2) &(sum(nhood(:)) == 2); %nhood(2,2)指的是3*3模板中中心位置的点,其坐
%标为(2,2)。这个逻辑表达式指:3*3的模板nhood
%的中心位置(2,2)位置的值为1,且和等于2.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息