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)
Show older comments
I = imread(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
Answers (2)
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:
- 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.
- 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.
- 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.
- 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.
You can refer to the following documentation https://www.mathworks.com/matlabcentral/fileexchange/24409-hessian-based-frangi-vesselness-filter
Thanks.
0 Comments
See Also
Categories
Find more on Biomedical Imaging in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!