Measuring line thickness in a noisy image (OCT layer thickness)

asked 2018-12-07 03:17:03 -0500

ivec gravatar image

updated 2018-12-07 03:23:50 -0500

Hi, I'm looking for the best approach to detect and assess the thickness of the leftmost "line" or band in a noisy image. ( Lines represent layers of a material captured with OCT imaging ).
Three examples below, with the band of interest partially highlighted in red (source images are greyscale).

A)imgA, B)imgB and C) (trickier): imgC
The leftmost band is (always) the line of interest; the next band is an underlying layer/interface; and the third band usually visible is actually a reflection of the first.

As you can tell (zooming in) images are noisy; each row is (in principle) a separate measurement - with occasional artefacts showing up. I don't need a 100% success rate (I can disregard noisy lines), but over a series of measurements I need to report an average band thickness with a sub-pixel accuracy. My ultimate goal is to sort my 'samples', label areas of different thicknesses, and detect where was the thinnest/thickest zone within a labeled area resides)

What are OpenCL primitives/operations that you would suggest using in this case? For instance: 1. Some de-noising 2. Detection of the right/left edges of the leftmost band 3. Reporting an average thickness with sub-pixel accuracy Also, could OpenCL be used on a volume of such data? (Image series are in front of each other, it might be useful to interpolate or de-noise across images).

I'm looking for ideas on how OpenCV can be used here. Also I'll need a I will need a high processing throughput rate (say at least 100 such images per second).

Thanks in advance for sharing your ideas and insights, Ivan

edit retag flag offensive close merge delete

Comments

berak gravatar imageberak ( 2018-12-07 03:26:13 -0500 )edit

An equivalent of "distanceTransform()" is indeed needed - although ultimately the distance/width needs to be measured on a row-by-row basis (as each row represents a thickness measurement across layers of the structure at a given location). The challenge is more in the clean-up and identification of the first band(segment); I am particularly interested in a representative average of the thickness of the first band: I can afford discarding some image rows (as "too noisy to tell") but need to ensure that the measurements I retrain are correct (i.e. not capturing the wrong signal, such as the second band). I have my thoughts on implementing this in C++, but I don't want to miss out on existing higher-level tools, especially if they can help leverage the GPU for faster processing...

ivec gravatar imageivec ( 2018-12-08 01:51:52 -0500 )edit

For the segmentation part (identifying the band partially marked in red in the above images), it would seem that an approach based on snakes, or other Partial differential equation-based methods, might be appropriate. Does anyone have experience with these?

ivec gravatar imageivec ( 2018-12-08 02:25:50 -0500 )edit