* Cleaning, using some relative values to the image size instead of absolute values.
\usepackage{color}
\usepackage[usenames,dvipsnames]{xcolor}
-\title{PA}
+\title{Détection de cellules sanguines infectées par la malaria}
\author{G.Burri}
-
\begin{document}
\nocite{*}
-%\maketitle
+\maketitle
-Fichier : 1305121398-0001.png
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/imgRGBResampled.png}
- \caption{Image originale}
- \label{fig:imgRGBResampled}
-\end{figure}
+\section{Introduction}
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/gtResampled.png}
- \caption{Ground truth}
- \label{fig:gtResampled}
-\end{figure}
+Le but de ce projet est
-%%%
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/imgH.png}
- \caption{Composante teinte (Hue)}
- \label{fig:imgH}
-\end{figure}
+\section{Outils utilisés}
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/imgS.png}
- \caption{Composante saturation}
- \label{fig:imgS}
-\end{figure}
+\section{Approche générale}
-%%%
-
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/imgHFiltered.png}
- \caption{Composante teinte filtrée : filtre médian 5x5 + \it{morphological area closing}}
- \label{fig:imgHFiltered}
-\end{figure}
+\section{Détection des parasites}
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/imgSFiltered.png}
- \caption{Composante saturation filtrée : filtre médian 5x5 + \it{morphological area closing}}
- \label{fig:imgSFiltered}
-\end{figure}
+\section{
-%%%
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../granulometry_histogram.png}
- \caption{Granulométrie \it{(Pattern spectrum)}}
- \label{fig:granulometry_histogram}
-\end{figure}
+\section{Conclusion}
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/MH.png}
- \caption{Marqueurs des parasites pour la composante teinte suite à l'application d'un maximum regional}
- \label{fig:MH}
-\end{figure}
+Travaux futurs.
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/MS.png}
- \caption{Marqueurs des parasites pour la composante saturation suite à l'application d'un maximum regional}
- \label{fig:MS}
-\end{figure}
-\begin{figure}[p]
- \includegraphics[width=\linewidth]{../output/MHS.png}
- \caption{Intersection entre MH et MS}
- \label{fig:MHS}
-\end{figure}
-%%%
\begin{figure}[p]
\includegraphics[width=\linewidth]{../output/THS.png}
% p. 136: median filter to smooth the noise and
% area closing to enhance the bright objects and make flatter, darker and cleaner the image background.
medianFilterWindow = [5, 5];
- imgFiltered{1} = mmareaclose(medfilt2(imgH, medianFilterWindow), 200); % Hue.
+ imgFiltered{1} = mmareaclose(medfilt2(imgH, medianFilterWindow), 800); % Hue.
% We use an opening fot the saturation because the parasites are darker than the rest of the image.
- imgFiltered{2} = mmareaopen(medfilt2(imgS, medianFilterWindow), 200); % Saturation.
- imgFiltered{3} = mmareaclose(medfilt2(imgV, medianFilterWindow), 200); % Value.
+ imgFiltered{2} = mmareaopen(medfilt2(imgS, medianFilterWindow), 800); % Saturation.
+ imgFiltered{3} = mmareaclose(medfilt2(imgV, medianFilterWindow), 800); % Value. This component isn't used.
imwrite(imgFiltered{1}, '../output/imgHFiltered.png');
imwrite(imgFiltered{2}, '../output/imgSFiltered.png');
imwrite(imgFiltered{3}, '../output/imgVFiltered.png');
-
- % Shading correction with a Top-hat transformation (p. 673).
- % Not in the article -> disable for the moment, not needed.
- % imgHFiltered = mmopenth(imgHFiltered, mmsedisk(80, '2D', 'OCTAGON'));
- % imgSFiltered = mmopenth(imgSFiltered, mmsedisk(80, '2D', 'OCTAGON'));
-
+
%% Granulometry
% We use the saturation component to find the red cells mean size.
+ saturationComponent = imgFiltered{2};
- redCellMaxSize = 42; % Radius [px].
+ redCellMaxSize = round(size(imgRGB, 2) / 35); % Radius [px], depending of the input size.
funVolume = @(m) sum(sum(m));
- volImg = funVolume(imgFiltered{2});
+ volImg = funVolume(saturationComponent);
sizeDistribution = zeros(redCellMaxSize, 1);
parfor k = 1:redCellMaxSize
SE = mmsedisk(k, '2D', 'OCTAGON'); % 'EUCLIDEAN' is more precise.
- imgOpened = mmopen(imgFiltered{2}, SE);
+ imgOpened = mmopen(saturationComponent, SE);
A = funVolume(imgOpened);
N = 1 - A / volImg;
sizeDistribution(k) = N;
% The paper chooses the biggest red cell size among the possible red cell sizes. (FIXME)
[~, c] = max(patternSpectrum);
- nucleiRadius = 5; % Find a way to extract this information from the pattern spectrum histogram. (FIXME)
+ nucleiRadius = c / 8; % We admit the size of a parasite is eight time smaller than a red blood cell. Find a way to extract this information from the pattern spectrum histogram. (FIXME)
bar(patternSpectrum);
imwrite(MHS, '../output/MHS.png')
imwrite(THS, '../output/THS.png')
- %% Display
-
-% figure('Position', [100 100 1600 800])
-% colormap(gray);
-%
-% subplot(2, 4, 1);
-% imagesc(imgRGB);
-% title(['Original: ', imageFolder, '/', imageNumber]);
-%
-% subplot(2, 4, 2);
-% imagesc(imgFiltered{1});
-% title('Hue component');
-%
-% subplot(2, 4, 3);
-% imagesc(imgFiltered{2});
-% title('Saturation component');
-%
-% subplot(2, 4, 4);
-% imagesc(M{1});
-% title('MH');
-%
-% subplot(2, 4, 5);
-% imagesc(M{2});
-% title('MS');
-%
-% subplot(2, 4, 6);
-% imagesc(MHS);
-% title('MHS');
-%
-% subplot(2, 4, 7);
-% imagesc(THS);
-% title('THS');
end
-% print("-f1"\92, "-dpng", "Toto.png")
-
-
-
-
-
-
-
% Inputs:
% c: The typical red cell radius [px].
function [WBCSmoothed] = DetectionOfWhiteCells(THS, c)
- redCellsSE = mmsedisk(c - 8, '2D', 'OCTAGON');
+ % We use a radius near the smallest red blood cell size (80% of the radius)
+ redCellsSE = mmsedisk(c * 0.8, '2D', 'OCTAGON');
% The white cells may not be correctly marked in the case they have a very special shape (oblong).
WBCMarker = mmero(THS, redCellsSE); % Erosion to keep only fragments of white cells.
% imageFolder = '1409191647'; % 9.
imageFolder = '1412151257'; % 10. (Gamma)
-imageNumber = 'Gamma-0.8-0008';
+%% Gamma
+% imageNumber = 'Gamma-0.8-0002';
+% imageNumber = 'Gamma-0.8-0005';
+% imageNumber = 'Gamma-0.8-0008';
-scaleFactor = 0.6;
+% imageNumber = 'Gamma-1-0001';
+% imageNumber = 'Gamma-1-0004';
+imageNumber = 'Gamma-1-0007';
+
+% imageNumber = 'Gamma-1.2-0003';
+% imageNumber = 'Gamma-1.2-0006';
+% imageNumber = 'Gamma-1.2-0009';
+
+%% Main
+fprintf('Folder: %s, Number: %s\n', imageFolder, imageNumber);
+
+scaleFactor = 1;
% Load the image and its ground truth.
[imgRGB, gt] = loadImg(imageFolder, imageNumber);
disp('5) Finding infected red cells ...')
parasites = THS & ~WBC & ~schizonts;
-IdentificationOfInfectedRedCells(redCells, parasites);
+[infectedRedCells] = IdentificationOfInfectedRedCells(redCells, parasites);
-disp('Finished')
-toc
+nbRedCells = mmstats(mmlabel(redCells), 'max');
+nbInfectedRedCells = mmstats(mmlabel(infectedRedCells), 'max');
+infectionPercentage = 100 * nbInfectedRedCells / nbRedCells;
+fprintf('Percentage of infected cell: %.1f%%\n', infectionPercentage)
+disp('Finished')
+toc
\ No newline at end of file
cMin = uint32(c * 0.8); % 80%.
cMinArea = pi * cMin ^ 2;
- % green = mmareaopen(imgRGB(:,:,3), 1000);
gray = mmareaopen(rgb2gray(imgRGB), 2 * cMinArea); % The gray image is better than the green component alone.
imwrite(gray, '../output/red cells segmentation - gray.png')
holesClosed = mmareaclose(openedGradientThreshold, 10 * cMinArea);
imwrite(holesClosed, '../output/red cells segmentation - holes closed.png')
+ % Watershed algorithm from here: http://mmorph.com/mxmorph/html/mmdemos/mmdcells.html.
d = holesClosed;
e1 = mmdist(d, mmsebox,'EUCLIDEAN');
-% e2 = mmsurf(e1);
e3 = mmregmax(e1);
e = mmdil(e3, mmsedisk(5, '2D', 'EUCLIDEAN'));
f = mmneg(e1);
-% fs = mmsurf(f);
-% mmshow(fs);
g = mmcwatershed(f, e, mmsebox);
-% mmshow(fs, g, e);
h = mmintersec(d, mmneg(g));
- i = mmareaopen(h, cMinArea / 3);
- imwrite(i, '../output/red cells segmentation - individual.png')
+ i = mmedgeoff(h);
+ j = mmareaopen(i, cMinArea / 3);
+ imwrite(j, '../output/red cells segmentation - individual.png')
- redCells = i;
+ redCells = j;
end
\ No newline at end of file