Applying CLAHE to medical images may going to some shaded on each edge side of object. So I have to correct this problem with fast processing in real time.
To make up a prototype correction, I have used same source RAW image, here is a source image in down scaled from 16bit gray scale RAW.
Applied CLAHE with 16×16 in clip limit of 100.0f. And I could recognized shaded areas at each edge of object. Shaded area marked as red boxes in below.
To correct shaded area, generate gaussian blur mask with big radials, but it really heavy to processing in fast time as realtime. So I made it fastest way with my ‘Resize engine’ that made with OpenMP and AVX instructions. To generate fastest blurred mask, down scale with bi-linear filter to 2.5% size. Then doing up scale again with B-Spline filter to original size. And Invert it.
Then calculate to do shade correction with generated shade mask, ins fastest math functions with original image.
To complete image processing, need to fill background areas.
It simply corrected but little bit lacks on details of bone level. But definitely better than hard shaded levels after window leveling. Expect for next will find more improved processing algorithm, and it will be a function of librawprocessor.
By using CLAHE algorithm, there’s some problem occurs by object shapes like this:
Each edge side of object going too darken by window leveling. It is defecting issue of CLAHE. So I tried to make it corrected with shading correction.
Here is source raw image, 14bit gray.
First, I need make a background mask to overriding changed level after CLAHE.
It can generate simply by using my librawprocessor. Then I applied CLAHE, 10×10, 30.0f.
Shadowed or shaded areas occurs after applying CLAHE, it must be corrected. So I made shaded map with my fast resize engine. Down scale to 10% of original image size with Bi-Linear filter, then up scale again with B-Spline filter with inverse.
It is much effective than Gaussian blur. Very fast but similar to Gaussian blurred. almost realtime in 3000×3000 array with floating point levels in AVX and OpenMP optimization.
Now I am just add masked shade map level with exponential to original image.
if ( ( src == NULL ) || ( smap == NULL ) )
if ( src->Width() != smap->Width() )
if ( src->Height() != smap->Height() )
float* datasrc = src->Data();
float* datamap = smap->Data();
#pragma omp parellel for
for( unsigned cnt=0; cnt< src->Size(); cnt++ )
float diffs = datamap[ cnt ];
if ( diffs > 0.0f )
datasrc[ cnt ] += exp( diffs );
Result is :
Shaded object areas seems to enhanced than before. So I continued to applying background mask.
Ok, then I made it to window leveled.
Each edge sides are not seems to much shaded than before. It should be better than applying single CLAHE. I will continue to write more effective image processing with CLAHE.