How can I improve my segmented image?

조회 수: 1 (최근 30일)
Ghazal Hnr
Ghazal Hnr 2018년 5월 7일
댓글: Ghazal Hnr 2018년 5월 8일
Hi, I wrote the code below in order to segment blood vessels of the retina. But the result is not really good. Even I tried another way that I put it here to but it didn't make it better too. Can anyone give me a suggestion about how can I improve it? My images are from STARE database (<http://cecas.clemson.edu/~ahoover/stare/>) here is the example of my image:
FIRST WAY:
clc; clear all; close all;
%%Specifying path folders
%%%ex.d_img2 - F:\folder1\folder2\...\foldern\*.format %%%
%%%ex.di_img2 - F:\folder1\folder2\...\foldern\ %%%
d_img2 = 'F:\Uni\Project\MATLAB\myMatlab\prepImages\*.ppm';
di_img2 = 'F:\Uni\Project\MATLAB\myMatlab\prepImages\';
%%Reading images
srcFiles_prepImage = dir(d_img2);
N_img_prep = length(srcFiles_prepImage);
% i = 1; %%50
% i = 2; %%150
i = 3; %%200
filename2 = strcat(di_img2, srcFiles_prepImage(i).name);
prepImage = imread(filename2);
prepImage = prepImage(:,:,2); %?% the picture had been saved in rgb format?
figure
imshow(prepImage, 'InitialMagnification', 'fit')
%%Histogram
[row,column] = size(prepImage);
figure
imhist(prepImage);
%%Creating & Applying binary mask in order to making the background (outside of eye) black
%Using threshold
threshold_value = 100;
mask = prepImage > threshold_value; % Bright objects will be chosen.
mask = imfill(mask, 'holes'); % Do a "hole fill" to get rid of any background pixels or "holes".
%%%%check if there is any black part inside the white part
figure
imshow(mask, 'InitialMagnification', 'fit')
% Applying binary mask to image
maskedImage = bsxfun(@times, prepImage, cast(mask,class(prepImage)));
figure
imshow(maskedImage, 'InitialMagnification', 'fit')
figure
subplot(1,3,1)
imhist(maskedImage)
%%Thresholding histogram
[pixelCount,grayLevels] = imhist(maskedImage,256);
peaks = findpeaks(pixelCount);
peaks = transpose(peaks);
maxBin = max(peaks);
maxBinLocation = find(pixelCount == maxBin);
maxI = find(peaks == maxBin);
% Find low threshold
TlowLocation = min(find(pixelCount == 0)); % Find first zero
% Place vertical bar on histogram to show Tlow
subplot(1,3,3)
imhist(maskedImage)
hold on
y2 = ylim();
line([TlowLocation, TlowLocation], [y2(1), y2(2)], ...
'Color', 'r', 'LineWidth', 2);
% Find high threshold
minBinL = min(peaks); %%Find the minimum on left side of peak
minBinLocationL = find(pixelCount == minBinL);
%%%%
% if minBinLocation>maxBinLocation
%%%%need an IF to make sure that it is on left side
%%%%
% Find the minimum on left side of peak
minIL = find(peaks == minBinL);
leftBins = peaks(minIL:maxI);
leftMean = mean(leftBins);
subLeft = maxBin - leftMean;
% Find the closest value to subLeft
[subLeftClosest,indexLeftClosest] = min(abs(leftBins - subLeft));
ThighBin = leftBins(indexLeftClosest);
ThighLocation = find(pixelCount == ThighBin);
% Place vertical bar on histogram to show Thigh
subplot(1,3,2)
imhist(maskedImage)
hold on
yl = ylim();
line([ThighLocation, ThighLocation], [yl(1), yl(2)], ...
'Color', 'r', 'LineWidth', 2);
% Place vertical bars on histogram to show Tlow&Thigh
figure
imhist(maskedImage)
hold on
yl = ylim();
line([TlowLocation, TlowLocation], [yl(1), yl(2)], ...
'Color', 'r', 'LineWidth', 2);
hold on
y2 = ylim();
line([ThighLocation, ThighLocation], [y2(1), y2(2)], ...
'Color', 'r', 'LineWidth', 2);
% Find pixels between the thresholds
betweenThresholds = maskedImage<ThighLocation & maskedImage>TlowLocation;
Vs = betweenThresholds;
Ts = length(Vs);
figure
imshow(betweenThresholds, 'InitialMagnification', 'fit');
SECOND WAY:
clc; clear all; close all;
%%Specifying path folders
%%%ex.d_img2 - F:\folder1\folder2\...\foldern\*.format %%%
%%%ex.di_img2 - F:\folder1\folder2\...\foldern\ %%%
d_img2 = 'F:\Uni\Project\MATLAB\myMatlab\prepImages\*.ppm';
di_img2 = 'F:\Uni\Project\MATLAB\myMatlab\prepImages\';
%%Reading images
srcFiles_prepImage = dir(d_img2);
N_img_prep = length(srcFiles_prepImage);
% i = 1; %%50
% i = 2; %%150
i = 3; %%200
filename2 = strcat(di_img2, srcFiles_prepImage(i).name);
prepImage = imread(filename2);
IG = uint8(prepImage*255);
prepImage = prepImage(:,:,2); %?% the picture had been saved in rgb format?
figure
imshow(prepImage, 'InitialMagnification', 'fit')
%%Histogram
[row,column] = size(prepImage);
figure
imhist(prepImage,256);
%%Thresholding histogram
[pixelCounts,grayLevels] = imhist(prepImage,256);
cdf = cumsum(pixelCounts); % Sum histogram counts to get cumulative distribution function
cdf = cdf / cdf(end); % Normalize
% Get data value where ?%&?% is.
data30 = find(cdf>= 0.2, 1, 'first');
data70 = find(cdf>= 0.4, 1, 'first');
% Place vertical bars on histogram to show Tlow&Thigh
figure
imhist(prepImage)
hold on
y1 = ylim();
line([data30, data30], [y1(1), y1(2)], ...
'Color', 'r', 'LineWidth', 2);
hold on
y2 = ylim();
line([data70, data70], [y2(1), y2(2)], ...
'Color', 'r', 'LineWidth', 2);
% Find pixels between the thresholds
betweenThresholds = prepImage<data70 & prepImage>30;
Vs = betweenThresholds;
Ts = length(Vs);
figure
imshow(betweenThresholds, 'InitialMagnification', 'fit');
%%Creating & Applying binary mask in order to making the background (outside of eye) black
%Using threshold
threshold_value = 100;
mask = prepImage > threshold_value; % Bright objects will be chosen.
mask = imfill(mask, 'holes'); % Do a "hole fill" to get rid of any background pixels or "holes".
%%%%check if there is any black part inside the white part
figure
imshow(mask, 'InitialMagnification', 'fit')
% Applying binary mask to image
maskedImage = bsxfun(@times, betweenThresholds, cast(mask,class(betweenThresholds)));
figure
imshow(maskedImage, 'InitialMagnification', 'fit')

채택된 답변

Image Analyst
Image Analyst 2018년 5월 8일
Basically you're just doing a primitive global histogram. No matter how you decide on a global threshold, it won't get all the vessels, no matter which threshold you pick.
  댓글 수: 1
Ghazal Hnr
Ghazal Hnr 2018년 5월 8일
Thank you for your response. The link seems really useful.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with MATLAB에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by