资源简介
主动轮廓法于1987年被提出,现在轮廓提取、对象跟踪等许多方面得到了广泛的应用。本资源实现了主动轮廓法的算法。
代码片段和文件信息
function DeformSnake
%轮廓变形
I = imread(‘imc.bmp‘);
lstCtrlPt = InitSnake; %控制点
imshow(I);
hold on
plot(lstCtrlPt(1:)lstCtrlPt(2:)‘go‘);
[noUse NCtrlPt] = size(lstCtrlPt); %NCtrlPt:轮廓控制点数
[imHeight imWidth noUse] = size(I);
param = [0.30.10.5]‘; %[alphabetagamma]‘
THRESHOLD1 = 100; %梯度平方最小差距
THRESHOLD2 = 0.05; %此次移动点数点总控制点数最小比例
rPtMoved = 1; %此次移动点数点总控制点数比例
I = I(::1); %转换成8位灰度图
I= double(I);
I = gaussMask(I); %高斯模糊
Igrad = edge_detect(I);%求图像梯度
nCount = 0;
while rPtMoved >= THRESHOLD2
%%****************初始化轮廓****************%%
lstCtrlPt = snakeInterp(lstCtrlPt);
[noUse NCtrlPt] = size(lstCtrlPt); %NCtrlPt:轮廓控制点数
%%************************轮廓变形*************************%%
nPtMoved = 0;
i = 1;
while i <= NCtrlPt
gradIadj = Igrad(lstCtrlPt(2i)-2:lstCtrlPt(2i)+2lstCtrlPt(1i)-2:lstCtrlPt(1i)+2);
Max = max(gradIadj.^2);
Min = min(gradIadj.^2);
%保证 Max-Min >= THRESHOLD1
if Max(1)-Min(1) < THRESHOLD1
Min(1) = Max(1)-THRESHOLD1;
end
%dist:相邻两点的距离和davg:平均距离
dist = sqrt(sum(([lstCtrlPt(:2:NCtrlPt) lstCtrlPt(:1)]-lstCtrlPt).^2));
davg = sum(dist)/NCtrlPt;
%计算邻域内每个点的能量
for yOffset = -2:2
for xOffset = -2:2
%当前邻域中的点:pt
pt = [lstCtrlPt(1i)+xOffsetlstCtrlPt(2i)+yOffset]‘;
subList = [lstCtrlPt(:pre(iNCtrlPt)) pt lstCtrlPt(:next(iNCtrlPt))];
dist = sqrt(sum((subList(:2:3)-subList(:1:2)).^2));
%计算弹性能量:Eelastic
Eelastic = (davg-dist(1))^2;
%计算弯曲能量:Ebending
Ebending = sum((subList(:1)-2*pt+subList(:3)).^2);
%计算图像能量:Eimage
Eimage = (Min(1)-gradIadj(3+yOffset3+xOffset)^2)/(Max(1)-Min(1));
%将三个量保存起来:Energy
Energy((3+yOffset-1)*5+3+xOffset:) = [EelasticEbendingEimage];
end
end
MaxEelastic = max(Energy(:1));
MaxEbending = max(Energy(:2));
%单位化能量:
Energy(:1) = Energy(:1)/MaxEelastic;
Energy(:2) = Energy(:2)/MaxEbending;
Etotal = Energy*param;
%找能量最小点的坐标
index = find(Etotal == min(Etotal));
yOffset = ceil(index(1)/5)-3;
xOffset = index(1) -(2+yOffset)*5-3;
ptNewCtrl = [lstCtrlPt(1i)+xOffsetlstCtrlPt(2i)+yOffset]‘;
%更新控制点
if sum(ptNewCtrl ~= lstCtrlPt(:i))
nPtMoved = nPtMoved+1;
lstCtrlPt(:i)=ptNewCtrl;
end
i = i+1;
end
nCount = nCount+1;
rPtMoved = nPtMoved/NCtrlPt;
end
plot(lstCtrlPt(1:)lstCtrlPt(2:)‘b*‘);
%显示参数
legend(‘origional CtrlPt‘‘final CtrlPt‘);
paramStr{11} = [‘\alpha = ‘ num2str(param(11))];
paramStr{21} = [‘\beta = ‘ num2str(param(21))];
paramStr{31} =
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 646 2008-08-13 21:30 运行方式.txt
文件 714 2008-08-15 20:04 matlab\InitSnake.m
文件 463816 2008-05-12 20:46 matlab\ima.bmp
文件 284 2008-05-19 10:12 matlab\edge_detect.m
文件 231 2008-08-15 20:03 matlab\isInRegion.m
文件 0 2008-05-16 14:39 matlab\ToGrad.m
文件 499 2008-05-17 09:23 matlab\insertPt.m
文件 265198 2008-05-17 16:10 matlab\1_1_1p5.bmp
文件 120 2008-05-18 10:03 matlab\pre.m
文件 126 2008-05-18 10:01 matlab\next.m
文件 156120 2008-05-18 10:41 matlab\imb.bmp
文件 3338 2008-05-19 16:37 matlab\DeformSnake.m
文件 299 2008-05-19 08:59 matlab\gaussMask.m
文件 265198 2008-05-19 10:09 matlab\ima_1p5_1_3.bmp
文件 265198 2008-05-19 10:10 matlab\imb_1p5_1_3.bmp
文件 156120 2008-05-19 16:08 matlab\imc.bmp
文件 265198 2008-05-19 16:13 matlab\Snake不能收敛到凹陷示例.bmp
文件 810 2008-05-20 17:20 matlab\snakeInterp.m
..A.SH. 98 2008-06-02 22:59 matlab\desktop.ini
...D..R 0 2008-08-15 19:58 matlab
----------- --------- ---------- ----- ----
1844013 20
- 上一篇:DB9串口元件封装库
- 下一篇:socket多线程支持客户端服务端长连接互发消息
相关资源
- DSP图像处理程序
- 数字图像处理+将24位真彩色BMP图像转
- Two Pass Scaling
- 小波图像处理
- lena 图片 512*512 gray and color
- 递归双边滤波图像处理
- Halcon找圆的中心坐标。
- 天津大学数字图像处理试题及解答0
- idl图像处理增强滤波
- 小波变换在图像处理中的应用
- 图像处理论文及翻译
- 图像压缩 JPG压缩软件图片尺寸修改工
- 数字图像处理实验三代码及资源.zip
- 图像处理源码 opencv图像处理源码
- VC图像处理基本算法
- labview图像处理,卷积,线性,相关滤
- LabVIEW的灰度化处理程序
- 数字图像处理论文——米粒
- Opencv学习视频
- 《数字图像处理》胡学龙 第三版 课后
- 基于数字图像处理的孢子特征提取
- 山东大学2018年数字图像处理原题真题
- 障碍处理程序
- 采用FPGA 实现视频和图像处理设计
- OpenCv2 轮廓提取源代码VS2008
- 汉字识别源代码图像处理
- Kinect程序,包括简单的图像处理
- 数字图像处理期末考试试题
- Graphcut-源码及实现
- 利用小波变换对图像进行分解和重构
评论
共有 条评论