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);