Привет,

Я пытаюсь рассчитать извилистость кровеносных сосудов. (Извилистость сосудов рассчитывается как сумма длин ветвей, деленная на сумму евклидовых расстояний между их конечными точками).

У меня есть следующие вопросы:

  1. Как рассчитать длину как реальных ветвей, так и воображаемых прямых линий между узлами
  2. Как мне отметить ветви сосуда (оранжевые) и узлы ветвей (желтые), как показано на рисунке.
  3. Я рассчитываю «длину позвоночника» как сумму всех пикселей. Как рассчитать длину отдельных ветвей?
  4. Буду признателен за любые предложения по предварительной обработке.
clc;
clear;
close all
% Read the image
I=imread('VAD.png');
figure,imshow(I)
%convert it to gray scale
I_gray=rgb2gray(I);
%Sharpen the image
b = imsharpen(I_gray,'Amount',8);
h = fspecial('average', [3 3]);
b = imfilter(b, h);
%choose brighter objects
Bina=b>150
figure,imshow(Bina);
se = strel('cube',3)
erodedBW = imerode(Bina,se);
%Remove small objects from binary image
BW2 = bwareaopen(Bina,100)
figure,imshow(BW2);
skelImage = bwskel(BW2, 'MinBranchLength', 10);
MinBranchLength = round(sum(skelImage(:))/2)
skelImage = bwskel(BW2,'MinBranchLength',MinBranchLength);
figure,imshow(skelImage)
endpointImage = bwmorph(skelImage, 'endpoints');
[rows, columns] = find(endpointImage)
spineLength = sum(skelImage(:))
straightLineDistance = sqrt((columns(2) - columns(1))^2 + (rows(2) - rows(1))^2)
tortuosity = spineLength / straightLineDistance

ПРИМЕЧАНИЕ. 

Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech ,ME,M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.

Вызовите bwmorph(), чтобы получить точки ветвления, а затем используйте это, чтобы стереть точки ветвления. Затем пометьте каждую кривую и вызовите bwmorph(), чтобы получить конечные точки для получения расстояния по прямой линии. Довольно просто, на самом деле вы, вероятно, уже это сделали. Возможно, вы получили что-то вроде (непроверенный):

bp = bwmorph(mask, 'branchpoints');
mask(bp) = false; % Erase branchpoints.
[labeledImage, numRegions] = bwlabel(mask);
for k = 1 : numRegions
    thisRegion = ismember(labeledImage, k);
    endpoints = bwmorph(thisRegion, 'endpoints');
    % Get coordinate
    [r, c] = find(endpoints);

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ