Как построить линию интенсивности в нескольких углах от точки центроида с помощью Matlab? - PullRequest
0 голосов
/ 01 мая 2019

Я студент BME, работаю над магистерской диссертацией.В моем проекте я хочу определить артефакт.Я уже получил изображения DICOM и нашел центр тяжести артефакта.Однако теперь мне нужно построить линию (около 40 пикселей) вне артефакта на 360 градусов с шагом 1 градус.

Я создал программу, которая находит центр тяжести артефакта.У меня также есть код, который рассчитал координаты 360 точек на расстоянии 40 пикселей от центроида.

clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
clear;  % Erase all existing variables.
workspace;  % Make sure the workspace panel is showing.
format longg;
format compact;
fontSize = 20;
   Image = dicomread('MONOE_100_0.25_LYON.dcm') %load DICOM
   Slope = 1
   Image_thresh= Image*Slope-1024-130                 %Correction for hounsfield (1024) and calcification definition (130HU)
   img = double(Image_thresh);
   img = (img - min(img(:))) / (max(img(:)) - min(img(:))); 
   img = uint8(255*img);
   figure (1);
   imshow(img)
grayImage=img
grayImage(grayImage < 0) = 0;
lowThreshold = 0
highThreshold = 256
binaryImage = grayImage > lowThreshold & grayImage < highThreshold; %logical image
figure (2)
imshow(binaryImage);

BW2 = bwpropfilt(binaryImage,'EulerNumber',[1 1]);          %only solid objects
figure (3)
imshow(BW2)

BW3 = bwpropfilt(BW2,'perimeter',1);                        %show only 2 largest objects
figure (4);
imshow(BW3)

%Give Centroid points
%stats = regionprops('table',BW3,'Centroid',...
   % 'MajorAxisLength','MinorAxisLength')
s  = regionprops(BW3,'centroid');

clc;
close all;

angles = 0 : 1 : 359;
x = cosd(angles);
y = sind(angles);
plot(x, y, 'ro-');
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
grid on;
line_start_x = s.Centroid(1,1);
line_start_y = s.Centroid(1,2);
line_length = 40
for k = 1 : length(angles)
  % Draw a line from the center to the edge of the circle.
  line_end_x = line_start_x + cos(angles)*line_length
  line_end_y = line_start_y + sin(angles)*line_length
  % Calculate the angle of that line
  angle = atand(y(k)/x(k));
end

figure(1)
subplot(2,1,1);
%imshow(Image,[0,3000]);
imshow(Image,'Displayrange',[]);
axis on;
x1_1 = s.Centroid(1,1)
y1_1 = s.Centroid(1,2)
x2_1 = line_end_x(1,k)
y2_1 = line_end_y(1,k)
hold on;
plot([x1_1,x2_1], [y1_1,y2_1], 'b+-', 'LineWidth', 2);
[xi, yi, theProfile] = improfile(Image, [x1_1,x2_1], [y1_1,y2_1]);
subplot(2,1,2);
plot(theProfile, 'b*-');
grid on;

h = findobj(gca,'Type','line')
x_1=get(h,'Xdata')
y_1=get(h,'Ydata')

%xlswrite('X:\My Documents\Master thesis - blooming artifact\Matlab script\data_automatisch_3h.xls',y)
filename = 'testdata_40_1_1.xlsx';
writematrix(y_1,filename,'Sheet',1,'Range','A1')

Однако мне не удалось получить график интенсивности между этой точкой для 360 точек.Но только за 1 балл.Эта линия должна фиксировать изменение интенсивности изображения и экспортировать их в файл Excel. График интенсивности должен иметь определенное расстояние, которое я хочу изменить.

Я надеюсь, что кто-нибудь поможет мне немного изменить код, чтобы сделать это возможным.

...