MATLAB 区域生长 连通区域计算 曲线的断点查询
程序员文章站
2022-03-10 10:36:13
...
区域生长
连通区域计算
曲线的断点查询
实验背景 勾画最内圈水纹
一 区域生长
函数输入
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.