how to get better preprocessing results

4 views (last 30 days)
I'm using the steps in the code below as preprocessing steps before cup and disc segmentation of a retinal image. any advices for better results?
these are the results that I get:
InputImage=imread('18.png');
%preprocessing
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.97]);
% Give a name to the title bar.
set(gcf,'name','Preprocessing for optic Cup extraction','numbertitle','off')
subplot(2,3,1)
imshow(InputImage)
axis on;
title('Original Image')
%-------------------------------------------------------------------------------------------------------------------------------------------
%segementation and removal of blood vessels
IMAGE = im2double(InputImage);
% Convert RGB to Gray via PCA
lab = rgb2lab(IMAGE);
f = 0;
wlab = reshape(bsxfun(@times,cat(3,1-f,f/2,f/2),lab),[],3);
[C,S] = pca(wlab);
S = reshape(S,size(lab));
S = S(:,:,1);
gray = (S-min(S(:)))./(max(S(:))-min(S(:)));
%% Contrast Enhancment of gray image using CLAHE
J = adapthisteq(gray,'numTiles',[8 8],'nBins',128);
%% Background Exclusion
% Apply Average Filter
h = fspecial('average', [9 9]);
JF = imfilter(J, h);
% Take the difference between the gray image and Average Filter
Z = imsubtract(JF, J);
%% Threshold using the IsoData Method
level=isodata(Z); % this is our threshold level
%level = graythresh(Z)
%% Convert to Binary
BW = imbinarize(Z, level-.003);
%% Remove small pixels
BW2 = bwareaopen(BW, 350);
%% Overlay
BW2 = imcomplement(BW2);
out = imoverlay(InputImage, BW2, [0 0 0]);
subplot(2,3,2);
imshow(out);
axis on;
title('Segmented blood vessels');
mask=rgb2gray(out);
mask=logical(mask);
%Inpaint the original image by removing the text overlays.
J = inpaintCoherent(InputImage,mask);
subplot(2,3,3);
imshow(J);
axis on;
title('Removed blood vessels using inpaint coherent');
%Display the original image and the inpainted image.
y= inpaintExemplar(J,mask,'FillOrder','tensor','PatchSize',18);
subplot(2,3,4)
imshow(y);
axis on;
title('Further removal of blood vessels using inpaint exemplar')
%---------------------------------------------------------------------------------------------------------------------------------------------
%noise removal&smoothing of the retinal image
rgbImage = y;
% Get the dimensions of the image. numberOfColorBands should be = 3.
[rows, ~, numberOfColorBands] = size(rgbImage);
% Extract the individual red, green, and blue color channels.
redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
% Median Filter the channels:
redMF = medfilt2(redChannel, [5, 5]);
greenMF = medfilt2(greenChannel, [5, 5]);
blueMF = medfilt2(blueChannel, [5, 5]);
% Find the noise in the red.
noiseImage = redChannel > 10;
% Get rid of the noise in the red by replacing with median.
noiseFreeRed = redChannel;
noiseFreeRed(noiseImage) = redMF(noiseImage);
% Find the noise in the green.
noiseImage = greenChannel > 20;
% Get rid of the noise in the green by replacing with median.
noiseFreeGreen = greenChannel;
noiseFreeGreen(noiseImage) = greenMF(noiseImage);
% Find the noise in the blue.
noiseImage = blueChannel > 100;
% Get rid of the noise in the blue by replacing with median.
noiseFreeBlue = blueChannel;
noiseFreeBlue(noiseImage) = blueMF(noiseImage);
% Reconstruct the noise free RGB image
rgbFixed = cat(3, noiseFreeRed, noiseFreeGreen, noiseFreeBlue);
subplot(2, 3,5);
imshow(rgbFixed);
axis on;
impixelinfo; % Allow user to mouse around and see the pixel values and coordinates.
title('Smoothed image');
%--------------------------------------------------------------------------------------------------------------------------------------------
%enhance contrast
shadow = rgbFixed;
shadow_lab = rgb2lab(shadow);
%The values of luminosity span a range from 0 to 100. Scale the values to the range [0 1], which is the expected range of images with data type double.
max_luminosity = 100;
L = shadow_lab(:,:,1)/max_luminosity;
%Perform the three types of contrast adjustment on the luminosity channel, and keep the a* and b* channels unchanged. Convert the images back to the RGB color space.
shadow_imadjust = shadow_lab;
shadow_imadjust(:,:,1) = imadjust(L)*max_luminosity;
shadow_imadjust = lab2rgb(shadow_imadjust);
subplot(2,3,6);
imshow(shadow_imadjust);
axis on;
title('Enhanced contrast');
uiwait(helpdlg('Examine the figures, then click OK to finish.'));
InputImage=imread(inp1);
%preprocessing
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.97]);
% Give a name to the title bar.
set(gcf,'name','Preprocessing for optic Cup extraction','numbertitle','off')
subplot(2,3,1)
imshow(InputImage)
axis on;
title('Original Image')
%-------------------------------------------------------------------------------------------------------------------------------------------
%segementation and removal of blood vessels
IMAGE = im2double(InputImage);
% Convert RGB to Gray via PCA
lab = rgb2lab(IMAGE);
f = 0;
wlab = reshape(bsxfun(@times,cat(3,1-f,f/2,f/2),lab),[],3);
[C,S] = pca(wlab);
S = reshape(S,size(lab));
S = S(:,:,1);
gray = (S-min(S(:)))./(max(S(:))-min(S(:)));
%% Contrast Enhancment of gray image using CLAHE
J = adapthisteq(gray,'numTiles',[8 8],'nBins',128);
%% Background Exclusion
% Apply Average Filter
h = fspecial('average', [9 9]);
JF = imfilter(J, h);
% Take the difference between the gray image and Average Filter
Z = imsubtract(JF, J);
%% Threshold using the IsoData Method
level=isodata(Z); % this is our threshold level
%level = graythresh(Z)
%% Convert to Binary
BW = imbinarize(Z, level-.003);
%% Remove small pixels
BW2 = bwareaopen(BW, 350);
%% Overlay
BW2 = imcomplement(BW2);
out = imoverlay(InputImage, BW2, [0 0 0]);
subplot(2,3,2);
imshow(out);
axis on;
title('Segmented blood vessels');
mask=rgb2gray(out);
mask=logical(mask);
%Inpaint the original image by removing the text overlays.
J = inpaintCoherent(InputImage,mask);
subplot(2,3,3);
imshow(J);
axis on;
title('Removed blood vessels using inpaint coherent');
%Display the original image and the inpainted image.
y= inpaintExemplar(J,mask,'FillOrder','tensor','PatchSize',18);
subplot(2,3,4)
imshow(y);
axis on;
title('Further removal of blood vessels using inpaint exemplar')
%---------------------------------------------------------------------------------------------------------------------------------------------
%noise removal&smoothing of the retinal image
rgbImage = y;
% Get the dimensions of the image. numberOfColorBands should be = 3.
[rows, ~, numberOfColorBands] = size(rgbImage);
% Extract the individual red, green, and blue color channels.
redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
% Median Filter the channels:
redMF = medfilt2(redChannel, [5, 5]);
greenMF = medfilt2(greenChannel, [5, 5]);
blueMF = medfilt2(blueChannel, [5, 5]);
% Find the noise in the red.
noiseImage = redChannel > 10;
% Get rid of the noise in the red by replacing with median.
noiseFreeRed = redChannel;
noiseFreeRed(noiseImage) = redMF(noiseImage);
% Find the noise in the green.
noiseImage = greenChannel > 20;
% Get rid of the noise in the green by replacing with median.
noiseFreeGreen = greenChannel;
noiseFreeGreen(noiseImage) = greenMF(noiseImage);
% Find the noise in the blue.
noiseImage = blueChannel > 100;
% Get rid of the noise in the blue by replacing with median.
noiseFreeBlue = blueChannel;
noiseFreeBlue(noiseImage) = blueMF(noiseImage);
% Reconstruct the noise free RGB image
rgbFixed = cat(3, noiseFreeRed, noiseFreeGreen, noiseFreeBlue);
subplot(2, 3,5);
imshow(rgbFixed);
axis on;
impixelinfo; % Allow user to mouse around and see the pixel values and coordinates.
title('Smoothed image');
%--------------------------------------------------------------------------------------------------------------------------------------------
%enhance contrast
shadow = rgbFixed;
shadow_lab = rgb2lab(shadow);
%The values of luminosity span a range from 0 to 100. Scale the values to the range [0 1], which is the expected range of images with data type double.
max_luminosity = 100;
L = shadow_lab(:,:,1)/max_luminosity;
%Perform the three types of contrast adjustment on the luminosity channel, and keep the a* and b* channels unchanged. Convert the images back to the RGB color space.
shadow_imadjust = shadow_lab;
shadow_imadjust(:,:,1) = imadjust(L)*max_luminosity;
shadow_imadjust = lab2rgb(shadow_imadjust);
subplot(2,3,6);
imshow(shadow_imadjust);
axis on;
title('Enhanced contrast');
uiwait(helpdlg('Examine the figures, then click OK to finish.'));

Accepted Answer

Image Analyst
Image Analyst on 10 Dec 2022

More Answers (0)

Products


Release

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!