% 正常血管,检测单根比较准确
clc;clear all;close all;
%% 图像预处理
Im = imread('..\masks\IMG_0062_mask.png');
% Im = imread('1.png');
% IM = Im;
im = imread('..\seg_result\IMG_0062_out.png');
% im = imread('otsu_1.png');
IM1(:,:,1) = im2double(Im);
IM1(:,:,2) = im2double(Im);
IM1(:,:,3) = im2double(Im);
IM2(:,:,1) = im2double(im);
IM2(:,:,2) = im2double(im);
IM2(:,:,3) = im2double(im);
% se = strel('disk',1);
% im = imerode(im,se); % 分割的结果太宽了,腐蚀一下,去留随意
S = IM1;
BW = bwmorph(im,'thin',inf); % 细化得到骨架
[m,n] = find(BW==1);
for i = 1:length(m)
S(m(i),n(i),1) = 255;
S(m(i),n(i),2) = 0;
S(m(i),n(i),3) = 0;
end
hf = figure('NumberTitle', 'off', 'Name', '骨架');
imshow(S)
%%
% 手动输入
% BW(:,1:48) = 0; % 截取
% BW(1:187,:) = 0;
% BW(:,83:end) = 0;
% BW(219:end,:) = 0;
% 交互式
rect = getrect(hf);
BW(:,1:round(rect(1))) = 0; % 截取
BW(1:round(rect(2)),:) = 0;
BW(:,round(rect(1)+rect(3)):end) = 0;
BW(round(rect(2)+rect(4)):end,:) = 0;
%% 中心线坐标
[y_l,x_l] = find(BW==1);
sp=spap2(1,4,x_l,y_l); % 拟合曲线
[x,idx] = unique(x_l,'stable'); % 中点纵坐标
k_s1 = fnval(fnder(sp), x); % 血管流向斜率
k_s2 = -1./k_s1; % 法一:拟合曲线求法线斜率
y = fnval(sp, x); % 中点横坐标
%% 画截面 && 算真实半径
real_R = zeros(1,length(x)); % 多个中心点的半径
r = 10;
for j = 1:length(x)
% ang = HessianAng(m, x0, y0)+ pi/2; % 法二:Hessian求特征向量(效果差)
ang = atan(k_s2(j));
x0 = round(y(j));
y0 = x(j);
m = 2;
% rr = MoM(x0, y0, k_s1(j), k_s2(j), r, m, Im2); % mom评价方法
rr = MoMforSeg2(x0, y0, r ,Im);
for i=-rr:rr
xx = x0 + i * sin(ang);
yy = y0 + i * cos(ang);
IM1(round(xx), round(yy),3) = 255;
IM1(round(xx), round(yy),1) = 0;
IM1(round(xx), round(yy),2) = 0;
end
real_R(j) = rr;
end
figure('NumberTitle', 'off', 'Name', '真实图像的直径');
imshow(IM1)
%% 求分割后的直径
R = zeros(1,length(x)); % 多个中心点的半径
for j = 1:length(x)
x0 = round(y(j));
y0 = x(j);
ang = atan(k_s2(j));
r = 11;
rr = MoMforSeg1(x0, y0, r ,im); %
%画截面
for i=-rr:rr
xx = x0 + i * sin(ang);
yy = y0 + i * cos(ang);
IM2(round(xx), round(yy),1) = 255;
IM2(round(xx), round(yy),2) = 0;
IM2(round(xx), round(yy),3) = 0;
end
R(j) = rr;
end
figure('NumberTitle', 'off', 'Name', '分割图像的直径');
imshow(IM2)
figure('NumberTitle', 'off', 'Name', '直径对比');
plot(R,'r^');
hold on
plot(real_R,'b-');
hold off
xlabel('沿血管路径/像素','FontSize',11);
ylabel('血管直径/像素','FontSize',11);
legend({'测量值';'真实值'});
axis([0 length(real_R)+1 0 8]);
%% 误差计算
e1 = abs(R - real_R); % 绝对误差
e2 = abs(R - real_R)./real_R; % 相对误差
disp('血管直径为:');
fprintf('%c', 8); % 去除行末回车
disp(real_R);
disp('绝对误差为:');
fprintf('%c', 8);
disp(e1);
disp('相对误差为:');
fprintf('%c', 8);
disp(e2);
%% 新增部分
RMSE1 = sqrt(mean(e1.^2));
RMSE2 = sqrt(mean(e2.^2));
disp('RMSE1 = ');
fprintf('%c', 8);
disp(RMSE1);
disp('RMSE2 = ');
fprintf('%c', 8);
disp(RMSE2);
没有合适的资源?快使用搜索试试~ 我知道了~
【血管检测】 mom方法结合Hessian和曲线拟合血管直径测量【含Matlab源码 1970期】.zip
共32个文件
m:26个
png:5个
tif:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 179 浏览量
2024-06-20
16:31:30
上传
评论
收藏 633KB ZIP 举报
温馨提示
Matlab领域上传的代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 图像处理、美颜、打靶、虹膜定位、图像去雨、LSD直线检测、角点检测、RGB检测、笔检测
资源推荐
资源详情
资源评论
收起资源包目录
【血管检测】 mom方法结合Hessian和曲线拟合血管直径测量【含Matlab源码 1970期】.zip (32个子文件)
【血管检测】基于matlab mom方法结合Hessian和曲线拟合血管直径测量【含Matlab源码 1970期】
test_imgs
IMG_0062.tif 282KB
masks
IMG_0062_mask.png 4KB
demo
test3.m 621B
demo4.m 2KB
Untitled4.m 1KB
HessianAng.m 455B
运行结果1.png 306KB
FrangiFilter2D.m 2KB
Untitled2.m 3KB
ffff.m 1KB
impca.m 1KB
otsu_1.png 734B
MoM.m 2KB
interpll.m 402B
demo.m 709B
ForSeg.m 617B
MoMforSeg1.m 596B
Untitled.m 242B
demo1.m 3KB
Seg_all.m 3KB
arearect.m 1KB
Retinex.m 1KB
Hessian2D.m 433B
linesort_test.m 3KB
demo5.m 4KB
运行结果2.png 4KB
test.m 368B
eig2image.m 524B
demo3.m 1KB
MoMforSeg2.m 592B
demo2.m 3KB
seg_result
IMG_0062_out.png 4KB
共 32 条
- 1
资源评论
- 糊涂小王子2024-08-05内容与描述一致,超赞的资源,值得借鉴的内容很多,支持!
Matlab领域
- 粉丝: 3w+
- 资源: 3233
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于java+spring+springMVCl的学生就业管理系统开题报告.doc
- 一个C++实现的简易动态语言解释器,可定义变量和函数,有if和while两种控制流语句,词法分析和语法分析分别使用flex和bison实现,参考自《flex & bison》.zip
- 深入理解编程中的回调函数:原理、实现及应用场景
- yolov8l-cls.pt
- 操作系统中银行家算法详解与Python实现防止死锁
- 使用Java实现回调函数代码示例callback.zip
- Vue+ElementPlus构建的CMS开发框架.rar
- yolov8图像分类模型yolov8m-cls.pt
- yolov8图像分类yolov8s-cls.pt模型
- 使用Java实现字符串左移指定位数StringRotation.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功