Difference between revisions of "Top-bottom differences in retinal vascular properties"
Line 21: | Line 21: | ||
The dataset we will be using for the analysis is the UK biobank dataset, which contains for one patient their genome sequence, and a huge lot of various traits, including the fundus images from their retinas. with this dataset we have a great number of images. | The dataset we will be using for the analysis is the UK biobank dataset, which contains for one patient their genome sequence, and a huge lot of various traits, including the fundus images from their retinas. with this dataset we have a great number of images. | ||
These images can be automatically analysed with a special python package based on machine learning program that's being developed called vascX (LWNET), that can extract features from the retina fundus. The extracted features are stored in a retina object, containing many things such as a representation of the retina as a graph with edges and nodes, and the position of important features such as the optical disc (root of all the vasculature supplying the retinal cells ) and the fovea (focal point of an image on the retina, composed of the majority of the cones) | These images can be automatically analysed with a special python package based on machine learning program that's being developed called vascX (LWNET), that can extract features from the retina fundus. The extracted features are stored in a retina object, containing many things such as a representation of the retina as a graph with edges and nodes, and the position of important features such as the optical disc (root of all the vasculature supplying the retinal cells ) and the fovea (focal point of an image on the retina, composed of the majority of the cones) | ||
+ | |||
+ | ==Our research goals== | ||
+ | We want to compare the tortuosity value for each vessel layer (veins & arteries) for the top hemisphere and the bottom hemisphere. to do this, we first need a separation method in python for the top and bottom components. Once we have separated these, we need to compute the tortuosity for each hemisphere, and compare it to the global tortuosity. We want to see if there is a difference, an asymmetry. we will calculate an asymmetry coefficient and see if it correlates with any other retinal vasculature trait. indeed, if it correlates with something else that we already have, there is no need to calculate it, we already have an good estimator. | ||
+ | |||
+ | ==Methods== | ||
+ | Before computing the tortuosity, we need a method to separate the vascular elements between the top and the bottom. For this, we will use the graph representation in the 'retina' vascX output, retina.arteries.graph [.nodes/.edgdes, etc https://networkx.org/ ] or retina.veins.graph. This allows us to use the graph functions implemented in networkX. | ||
+ | |||
+ | We have thought about three methods to separate the connected components, the first one would be to take half the picture and everything that falhs above is "up" and everything below is "down". But this is not really precise as the images can be skewed. | ||
+ | |||
+ | A more precise way separation would be to use anchor points within the retina graph, such as the position of the fovea and the optical disc. we could then draw a line and consider again, everything above belonging to the top etc. But we still have a problem, because vessels are intertwined meaning that some bits from one side will cross over the line and we wrongly attributed. | ||
+ | |||
+ | |||
+ | To account to this, we took the connected components of the graphs, and calculated their barycentres. Their barycentres are the centers of the clusters. So it's a majority vote, and instead of deciding if the points are above or below the line, we decide if the cluster centres are above or below the line, then we attribute the rest of the cluster points to the orientation of the cluster centre, and it is more likely to be accurate. This is the method we used for the final calculation. | ||
+ | |||
+ | Once we have this list of segments belonging to the top or the bottom for both the arteries and the veins, we can compute the tortuosity of each segment, and extract values such as the median tortuosity for the top/bottom and for the veins/arteries. we will also calculate the asymm etry coefficient with the following formula: Tau = \frac{tort_top - tort_bottom}{tort_top + tort_bottom}. The absolute value can be sometimes computed but then the orientation of a potential asymmetry is lost: if the top>bottom or else. We added a control to see if there is a real difference between top and bottom, we shuffled the list of tortuosity per segment, randomly assigning them to 'top' or 'bottom'. | ||
+ | After producing a dataframe of the new values, we switched to R for the statistical analysis. |
Revision as of 20:48, 30 May 2024
Contents
Differences in tortuosity between top and bottom retinal vasculature
Jonathan NICOLET-DIT_FÉLIX, Bertille BOURG, Louis HEAU
Supervisor: Sacha BORS
To find out if there was a difference in tortuosity between top and bottom segments, we first put together a method to separate the blood vessels, then we computed their tortuosity and determined there was a very small positive asymmetry.
Presentation of the project: why is it important/relevant?
Retina fundus images are a type of picture taken by a special camera through the iris. They allow us to visualise the vasculature of the retina. This is a very convenient non-invasive way to obtain an insight of the body's vascular features, and the ultimate goal is to be able to use these pictures as a proxy for different diseases linked to vasculature such as ocular diseases (diabetic retinopathy, glaucoma) but also more general cardiovascular diseases like stroke, coronary heart disease or hypertension.
But to make the link between diseases and the retinal vasculature, we need to extract features from the fundus images such as (the number of bifurcation, the length, the evolution of the diameter...). One of the features that has recently drawn attention is tortuosity: how sinuous a blood vessel segment is compared to the direct length from its two extremities. Tortuosity is an important feature to study because it has potential links with cardiovascular diseases.
What is unknown is if there is a difference between the tortuosity in the top of the retina vs the bottom for arteries or veins.
Basic concepts
Indeed, when we look at a fundus image what is striking is that there are two large vascular networks above and below a line between the fovea and the optical disc. Arteries and veins are two stacked layers with different biological functions, so we compare them separately in the analysis. But we have these two sets. are they different ? especially for tortuosity ? Should we compute them separately in the analysis or can we use a "global tortuosity ? "
The dataset we will be using for the analysis is the UK biobank dataset, which contains for one patient their genome sequence, and a huge lot of various traits, including the fundus images from their retinas. with this dataset we have a great number of images. These images can be automatically analysed with a special python package based on machine learning program that's being developed called vascX (LWNET), that can extract features from the retina fundus. The extracted features are stored in a retina object, containing many things such as a representation of the retina as a graph with edges and nodes, and the position of important features such as the optical disc (root of all the vasculature supplying the retinal cells ) and the fovea (focal point of an image on the retina, composed of the majority of the cones)
Our research goals
We want to compare the tortuosity value for each vessel layer (veins & arteries) for the top hemisphere and the bottom hemisphere. to do this, we first need a separation method in python for the top and bottom components. Once we have separated these, we need to compute the tortuosity for each hemisphere, and compare it to the global tortuosity. We want to see if there is a difference, an asymmetry. we will calculate an asymmetry coefficient and see if it correlates with any other retinal vasculature trait. indeed, if it correlates with something else that we already have, there is no need to calculate it, we already have an good estimator.
Methods
Before computing the tortuosity, we need a method to separate the vascular elements between the top and the bottom. For this, we will use the graph representation in the 'retina' vascX output, retina.arteries.graph [.nodes/.edgdes, etc https://networkx.org/ ] or retina.veins.graph. This allows us to use the graph functions implemented in networkX.
We have thought about three methods to separate the connected components, the first one would be to take half the picture and everything that falhs above is "up" and everything below is "down". But this is not really precise as the images can be skewed.
A more precise way separation would be to use anchor points within the retina graph, such as the position of the fovea and the optical disc. we could then draw a line and consider again, everything above belonging to the top etc. But we still have a problem, because vessels are intertwined meaning that some bits from one side will cross over the line and we wrongly attributed.
To account to this, we took the connected components of the graphs, and calculated their barycentres. Their barycentres are the centers of the clusters. So it's a majority vote, and instead of deciding if the points are above or below the line, we decide if the cluster centres are above or below the line, then we attribute the rest of the cluster points to the orientation of the cluster centre, and it is more likely to be accurate. This is the method we used for the final calculation.
Once we have this list of segments belonging to the top or the bottom for both the arteries and the veins, we can compute the tortuosity of each segment, and extract values such as the median tortuosity for the top/bottom and for the veins/arteries. we will also calculate the asymm etry coefficient with the following formula: Tau = \frac{tort_top - tort_bottom}{tort_top + tort_bottom}. The absolute value can be sometimes computed but then the orientation of a potential asymmetry is lost: if the top>bottom or else. We added a control to see if there is a real difference between top and bottom, we shuffled the list of tortuosity per segment, randomly assigning them to 'top' or 'bottom'. After producing a dataframe of the new values, we switched to R for the statistical analysis.