Steiner
Steiner's analysis is the measurement of cranial facial structures based on the analysis by tracing and locating the anatomical areas of the skeletal, dental and soft tissues profile, Frankfort plane (PoOr) isn't used in this analysis.
Instructions to use Cephalopoint (Version 2)
Apply Cephalopoint to measure Steiner´s Lateral Cephalometrics Version 2.0 follow the next steps:
Step 1. Download all files from Folder Steiner Version 2 in the same PC Folder
Step 2. Open Octave and select the folder where the code files were downloaded.
Step 3. Open and run Cephalopoint.m .
Step 4. Select Downs.
Step 5. Follow the instructions.
The video shows the use of Cephalopoint Version 2.0
Cephalopoint version 2.0 offers an improved interface and compares the values measured with normal standards showing numerical and graphical diagnostic of the patient. At the same of version 1.0, all the measurements will be saved in a csv file.
Source Code (Version 1):
% Software: Steiner's Cephalometric Technique
## Copyright (C) 2017 J.J. Reyes-Salgado
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; If not, see <http://www.gnu.org/licenses/>.
##
## Author: J.J. Reyes-Salgado <juanjose.reyes@upaep.mx>
pkg describe image
clear
clc
% Dialog to choose image to open and file to save the measuremnts
prompt = {'Enter Image name:','Enter File name:'};
dlg_title = 'Input the X-ray Image and the File to save the measuremnts';
num_lines= 1;
def = {'Photo','SteinerFile'};
resp = inputdlg(prompt,dlg_title,num_lines,def);
pict=strcat(resp{1,1},'.jpg');
sfile=strcat(resp{2,1},'.csv');
% Begin de software
B=imread(pict); % Open X ray picture
hFig = figure('units','normalized','outerposition',[0 0 1 1]);
imshow(B)
% Select Scale
promptS={'Enter the value of scale bar in cm:'};
digS='Input value of scale (cm):';
defS={'5'};
respS=inputdlg(promptS,digS,num_lines,defS);
value=str2num(respS{1,1});
% Select points
msgbox('Select the start and end point on the scale bar');
[xE,yE,bE] = ginput(2);
pix=10*value/abs(yE(1)-yE(2));
msgbox('Select D (D)','Point D');
[xD,yD,bD] = ginput(1);
msgbox('Select Nasion (Na)','Point Na');
[xNa,yNa,bNa] = ginput(1);
msgbox('Select A point','Point A');
[xA,yA,bA] = ginput(1);
msgbox('Select B point','Point B');
[xB,yB,bB] = ginput(1);
msgbox('Select Sella (S)','Point S');
[xS,yS,bS] = ginput(1);
msgbox('Select Gnathion (Gn)','Point Gn');
[xGn,yGn,bGn] = ginput(1);
msgbox('Select Gonion (Gon)','Point Gon');
[xGo,yGo,bGo] = ginput(1);
msgbox('Select Pogonion (Pg)','Point Pg');
[xPog,yPog,bPog] = ginput(1);
msgbox('Select Porion (Po)','Point Po');
[xPo,yPo,bPo] = ginput(1);
msgbox('Select Lower incisor crown (IIC)','Point IIC');
[xIIC,yIIC,bIIC] = ginput(1);
msgbox('Select Lower incisor root (IRC)','Point IRC');
[xIRC,yIRC,bIRC] = ginput(1);
msgbox('Select Upper incisor crown (ISC)','Point ISC');
[xISC,yISC,bISC] = ginput(1);
msgbox('Declarar Upper incisor root (ISR)','Point ISR');
[xISR,yISR,bISR] = ginput(1);
msgbox('Select Occlusal Molars Intersection (OA)','Point OA');
[xOA,yOA,bOA] = ginput(1);
msgbox('Select Occlusal Incisors Intersection (OS)','Point OS');
[xOS,yOS,bOS] = ginput(1);
close all
% Measure the distances
rII=[xIIC-xIRC yIIC-yIRC];
distII=norm(rII)*pix;
rIS=[xISC-xISR yISC-yISR];
distIS=norm(rIS)*pix;
rOSOA=[xOS-xOA yOS-yOA];
distOSOA=norm(rOSOA)*pix;
rSNa=[xS-xNa yS-yNa];
rNaPog=[xNa-xPog yNa-yPog];
distNaPog=norm(rNaPog)*pix;
distSNa=norm(rSNa)*pix;
rANa=[xA-xNa yA-yNa];
distANa=norm(rANa)*pix;
rBNa=[xB-xNa yB-yNa];
distBNa=norm(rBNa)*pix;
rDNa=[xD-xNa yD-yNa];
distDNa=norm(rDNa)*pix;
rGnGo=[xGo-xGn yGo-yGn];
distGnGo=norm(rGnGo)*pix;
rSGn=[xGn-xS yGn-yS];
distSGn=norm(rSGn)*pix;
% Measure S-L snd S-E distance
rSPog=[xS-xPog yS-yPog];
distSPog=norm(rSPog)*pix;
distL=dot(rSNa*pix/distSNa,rSPog*pix/distSPog)*distSPog
rSPo=[xS-xPo yS-yPo];
distSPo=norm(rSPo)*pix;
distE=dot(-rSNa*pix/distSNa,rSPo*pix/distSPo)*distSPo
% Measure the angles
angSNA=acosd((dot(rSNa,rANa)*pix.^2)/(distSNa*distANa))
angSNB=acosd((dot(rSNa,rBNa)*pix.^2)/(distSNa*distBNa))
angBNA=acosd((dot(rBNa,rANa)*pix.^2)/(distBNa*distANa))
angSND=acosd((dot(rSNa,rDNa)*pix.^2)/(distSNa*distDNa))
angSNGn=acosd((dot(-rSNa,rSGn)*pix.^2)/(distSNa*distSGn))
angSNGoGn=acosd((dot(rSNa,rGnGo)*pix.^2)/(distSNa*distGnGo))
angI=acosd((dot(rIS,rII)*pix.^2)/(distII*distIS))
angUISN=acosd((dot(rIS,rSNa)*pix.^2)/(distIS*distSNa))
angOclCra=acosd((dot(rANa,rIS)*pix.^2)/(distANa*distIS))
angMan=180-acosd((dot(rII,rBNa)*pix.^2)/(distII*distBNa))
angOclusal=180-acosd((dot(rSNa,rOSOA)*pix.^2)/(distSNa*distOSOA))
% Save Data
Dato=[angSNA angSNB angSND angBNA angSNGn angSNGoGn distL distE ...
angOclusal angI angOclCra angUISN angMan];
fileID=fopen(sfile,'a');
for i=1:length(Dato)
fprintf(fileID, '%3.4f,',Dato(i));
end
fprintf(fileID, '%8s\n','');
fclose(fileID);