I'm currently working on implementing an efficient method to segment an organ on 3D CT images. I used an algorithm (SLIC) to generate superpixels on each slice of my CT 3D matrix. The process is similar to the k-means algorithm although we do not need to visit the entire image for each pixel. Then I build a graph based on the superpixel: each superpixel is a node in the graph and two nodes are connected if they contains pixels that are 4-adjacent. The weight of the edge between two nodes is their color difference:
$ \sqrt {(color1 - color2)² }$
I then tried to implement a method to allow the user to click on a superpixel and label it as foreground or background starting a diffusion algorithm to divide the 3D graph between the two labels. I used the IFT algorithm However it doesn't perform as well as I want: sometime assigning a label or correcting an incorrectly deduced label will cause the algorithm to select improper superpixel.
The steps I used:
- Convert my matrix in 8 bits greyscale (between 0 and 255 value).
- Each pixel which value isn't between low_value and high_value is put to 0 (black).
- I do an histogram equalization to increase the contrast of the remaining values (thus trying to achieve better superpixel boundaries).
- Apply a blurring kernel to my matrix.
- Compute superpixels for each slice.
- Creating the corresponding graph and creating the edges between them.
- The user clicks with the foreground label (every superpixel is set to foreground).
- A click with the background label allows some superpixels to be set to background.
I sometime achieve quite satisfying results. But some clicks may completely destroy the correct graph labeling even though they should have worked. I have put a small illustrated example in the following imgur album.
So, my concerns and questions are:
- Is the IFT algorithm suitable for 3D? I don't see reason why not but my example shows that maybe there label leakage through previous/next slices.
- What kind of preprocessing step can improve the diffusion.
- I thought about using dijkstra algorithm to determine which seed was closer to a certain superpixel. It didn't work so well : could it achieve what I want with the correct color distance function?
- Do you have any advice or article which may help me?
Thank you and sorry if I was not clear, english isn't my first language.