Clear Filters
Clear Filters

I have used following code to segment a fundus image but the results are not very clear. The test4.jpeg fill is the original fundus images that I have used .please help

3 views (last 30 days)
I = imread(test4.jpeg);
Unable to resolve the name 'test4.jpeg'.
L = I(:,:,2);
ig = adapthisteq(L,'Numtiles',[100 10],'ClipLimit',0.005);
ig1 = imcomplement(ig);
se = strel('ball',100,100);
godisk = ig1 - imopen(ig1,se);
Si = size(ig);
ig = godisk*10;
ig = double(ig);
ig(ig>255)=255;
orig(:,:,:) = ig;
result = imbinarize(fmd(orig));
x = bwareaopen(result,3000);
result2 = bwmorph(x,'spur',inf);
figure
imshowpair(result2,I,'montage');
imwrite(result2,'fmd/P1_LF.tif');
%%%% following is the output result of this code
%
%%%%%%%%%% FMD function used in the above code %%%%%%%%%%%%%
function result = fmd(I)
%imshow(I);
% Settings
plot_results = true;
maximalized_plot = true;
count = 4;
%% Preparing input signals
s = size(I);
m1 = mod(s(1),8);
m2 = mod(s(2),8);
q = 0;
if s(1)>s(2)
if m1 == 0
ca = 1;
p = ceil(s(1)-s(2));
X = zeros(s(1),s(1));
X(:,p+1:p+s(2)) = I(:,:);
else
rem = 1;
ss = s(1);
while(rem ~= 0)
ss = ss + 1;
rem = mod(ss,8);
end
ca = 1;
p = ceil(ss-s(2));
q = ceil(ss-s(1));
X = zeros(ss,ss);
X(q+1:q+s(1),p+1:p+s(2)) = I(:,:);
end
else
if m2 == 0
ca = 2;
p = ceil(s(2)-s(1));
X = zeros(s(2),s(2));
X(p+1:p+s(1),:) = I(:,:);
else
rem = 1;
ss = s(2);
while(rem ~= 0)
ss = ss + 1;
disp(ss);
rem = mod(ss,8);
end
ca = 2;
p = ceil(ss-s(1));
q = ceil(ss-s(2));
X = zeros(ss,ss);
X(p+1:p+s(1),q+1:q+s(2)) = I(:,:);
end
end
in2D = im2double(uint8(X));
% imshow(in2D);
% figure;
%% DMWT2D and IDMWT2D Example
[out2D, winsize] = DMWT2D(in2D, 'DB2');
% if plot_results
% f = figure(4);
% if maximalized_plot
% f.WindowState = 'maximized';
% end
% t = tiledlayout(2, 1);
% title(t, "DMWT2D and IDMWT2D Example");
% nexttile;
% imshow(in2D);
% title("Original image");
%
% nexttile;
% imshow(abs(out2D));
% title("Transformed image");
% end
for i = 1:count
coeff(:,:,i) = out2D((i-1)*winsize+1:i*winsize,:);
end
for i = 1:count
for j = 1:count
subims(:,:,i,j) = coeff(:,(j-1)*winsize+1:j*winsize,i);
end
end
for i = 1:count
for j = 1:count
vecs(:,i,j) = reshape(subims(:,:,i,j).',1,[]);
end
end
Fs=100e6;
t = 0:(1/Fs):1-(1/Fs);
%b = zeros(4096,30,4,4);
for i = 1:count
for j = 1:count
[CutFrq1] = sp_SetCutOffFreq(vecs(:,i,j),Fs,'ub',10); %uniform filter bank 10
ImfByFilter = sp_DFTOrthogonalOrFIR_IIR_LINOEP(vecs(:,i,j),t,Fs,CutFrq1,'dct');
for k=1:length(CutFrq1)-1
b(:,k)=ImfByFilter{k};
end
% [a,b,EnergyLekage]=FMD_Low2High_High2LowSacnning(vecs(:,i,j),Fs,t);
c = sum(b,2);
d(:,:,i,j) = reshape(c,[winsize,winsize]);
end
end
d = permute(d,[2 1 3 4]);
%d = abs(d);
for i = 1:count
row1(:,:,i) = d(:,:,1,i);
row2(:,:,i) = d(:,:,2,i);
row3(:,:,i) = d(:,:,3,i);
row4(:,:,i) = d(:,:,4,i);
end
col1 = [row1(:,:,1) row1(:,:,2) row1(:,:,3) row1(:,:,4)];
col2 = [row2(:,:,1) row2(:,:,2) row2(:,:,3) row2(:,:,4)];
col3 = [row3(:,:,1) row3(:,:,2) row3(:,:,3) row3(:,:,4)];
col4 = [row4(:,:,1) row4(:,:,2) row4(:,:,3) row4(:,:,4)];
img =[col1;col2;col3;col4];
out = IDMWT2D(img, 'DB2');
% figure;
% imshow(imbinarize(out));
if ca == 1
out = out(q+1:q+s(1),p+1:p+s(2));
else
out = out(p+1:p+s(1),q+1:q+s(2));
end
result = out;
end
%%%%%%the test4.jpeg file used is attached below
  5 Comments
Kanika
Kanika on 3 Jan 2023
Edited: Kanika on 3 Jan 2023
I have attached some of the files.This website is not allowing me to attached all the file today .It is telling me to wait for 24 hours .will upload all the files by tommorrow. I am using my own data which I have captured in lab.I have also attached a sample image(test4.jpeg). Thanks for putting afforts.

Sign in to comment.

Answers (2)

Vijeta
Vijeta on 28 Mar 2023
Hello Kanika,
It seems like the output segmentation result is not very clear and might require some further processing. Here are a few suggestions that might help improve the segmentation result:
  1. Try adjusting the parameters of the adapthisteq function to obtain better contrast enhancement. For example, you could try increasing or decreasing the ClipLimit parameter or changing the size of the tiles using the NumTiles parameter.
  2. Instead of using a fixed structuring element for morphological operations, try using adaptive structuring elements that can better adapt to the local image features. MATLAB's strel function allows you to create structuring elements of various shapes, sizes, and orientations. For example, you could use a disk-shaped structuring element with a radius that is proportional to the size of the blood vessels in the image.
  3. Consider using a combination of morphological operations and other image processing techniques such as edge detection or thresholding to enhance the blood vessels and other features of interest in the image.
  4. Try using other segmentation algorithms that are specifically designed for fundus images, such as the Frangi filter, which is a vessel enhancement filter that can be followed by a thresholding step to segment the blood vessels.
Thanks.

Image Analyst
Image Analyst on 28 Mar 2023

Categories

Find more on Biomedical Imaging in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!