malaria detection code in matlab
This commit is contained in:
9
src/gopa kumar code/CNNTRainFczRGBCall.m
Normal file
9
src/gopa kumar code/CNNTRainFczRGBCall.m
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
function CNNTRainFczRGBCall()
|
||||||
|
DataSetLoc = 'WithDstWBC\';
|
||||||
|
DataSet = 'FczRGB_MalImdb'; MalEx6ColorRewrittenTrainFcZRGB(DataSetLoc, DataSet);
|
||||||
|
DataSetLoc = 'WithOutDstWBC\';
|
||||||
|
DataSet = 'FczRGB_MalImdb'; MalEx6ColorRewrittenTrainFcZRGB(DataSetLoc, DataSet);
|
||||||
|
DataSetLoc = 'WithWBCNoDst\';
|
||||||
|
DataSet = 'FczRGB_MalImdb'; MalEx6ColorRewrittenTrainFcZRGB(DataSetLoc, DataSet);
|
||||||
|
% CnnSvmOnSlideCalling();
|
||||||
|
end
|
||||||
42
src/gopa kumar code/CnnSvmOnSlideCalling.m
Normal file
42
src/gopa kumar code/CnnSvmOnSlideCalling.m
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
function CnnSvmOnSlideCalling()
|
||||||
|
close all; clear all; clc;
|
||||||
|
%If 3rd param is true (SVMModel), second arg has no significance
|
||||||
|
CNet (:, :, 1) = [20 20;38 26;30 34];
|
||||||
|
CNet (:, :, 2) = [36 40;38 32;33 37];
|
||||||
|
params.alreadySegmented = false;
|
||||||
|
for NetExpt = 1:1
|
||||||
|
NetIds = CNet (:, :, NetExpt);
|
||||||
|
for Mdls = 1:1
|
||||||
|
if (Mdls == 1)
|
||||||
|
params.UseMdlFrm = 'WithDstWBC';
|
||||||
|
elseif (Mdls == 2)
|
||||||
|
params.UseMdlFrm = 'WithOutDstWBC';
|
||||||
|
else
|
||||||
|
params.UseMdlFrm = 'WithWBCNoDst';
|
||||||
|
end
|
||||||
|
|
||||||
|
for CNNSVM = 2:2
|
||||||
|
if (CNNSVM == 1)
|
||||||
|
params.isSVMModel = false;
|
||||||
|
for subModel = 1:2
|
||||||
|
params.NetId = NetIds(Mdls, subModel);
|
||||||
|
if (subModel == 1)
|
||||||
|
params.dataSet = 'BFczdRGB';
|
||||||
|
else
|
||||||
|
params.dataSet = 'FczRGB';
|
||||||
|
end
|
||||||
|
display (['Mdls = ' params.UseMdlFrm '; isSVM = ' num2str(params.isSVMModel) '; SubMOdel = ' params.dataSet]);
|
||||||
|
testTrainedCNNSVMAutoCnt(params);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
%No need for different NetIds %continue;
|
||||||
|
params.loadFeat = false;
|
||||||
|
params.isSVMModel = true;
|
||||||
|
params.dataSet = 'BFczdFeatRGB';
|
||||||
|
display (['Mdls = ' params.UseMdlFrm '; isSVM = ' num2str(params.isSVMModel) '; SubMOdel = ' params.dataSet]);
|
||||||
|
testTrainedCNNSVMAutoCnt(params);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
431
src/gopa kumar code/MalEx6ColorRewrittenTrainFcZRGB.m
Normal file
431
src/gopa kumar code/MalEx6ColorRewrittenTrainFcZRGB.m
Normal file
@@ -0,0 +1,431 @@
|
|||||||
|
function MalEx6ColorRewrittenTrainFcZRGB(DataSetLoc, bkUpName, varargin)
|
||||||
|
tileGenFlag = true; testFlag = false; ConfnMatxs = [];
|
||||||
|
clc; close all;
|
||||||
|
%initialize
|
||||||
|
setup ;
|
||||||
|
%Create the network
|
||||||
|
net = initializeCharacterCNNBNNEx6ColorFczRGB() ;
|
||||||
|
|
||||||
|
maxEpoch = 100;
|
||||||
|
|
||||||
|
%Train Options
|
||||||
|
trainOpts.batchSize = 100 ;
|
||||||
|
trainOpts.numEpochs = maxEpoch;
|
||||||
|
trainOpts.continue = true ;
|
||||||
|
trainOpts.useGpu = false ;
|
||||||
|
trainOpts.learningRate = 0.001 ;
|
||||||
|
folderOfIntst = ['myExp6\' DataSetLoc bkUpName];
|
||||||
|
mkdir(folderOfIntst);
|
||||||
|
trainOpts.expDir = folderOfIntst ;
|
||||||
|
delete([folderOfIntst '\*mat']);
|
||||||
|
trainOpts.errorType = 'multiclass'; %'binary' ;
|
||||||
|
trainOpts = vl_argparse(trainOpts, varargin);
|
||||||
|
|
||||||
|
% Take the average image out
|
||||||
|
imdb = getPreLoadedDataset(DataSetLoc, bkUpName);%PercPstvTrainVaidnTest, PercNgtvTrainVaidnTest);%populateANewDataSetAB(); %
|
||||||
|
imageMean = mean(imdb.images.data(:)) ;
|
||||||
|
save([folderOfIntst '\imageMean'], 'imageMean');
|
||||||
|
imdb.images.data = imdb.images.data - imageMean ;
|
||||||
|
|
||||||
|
% Call training function in MatConvNet
|
||||||
|
[net, info] = cnn_train(net, imdb, @getBatch, trainOpts);
|
||||||
|
|
||||||
|
% Save the result for later use
|
||||||
|
net.layers(end) = [] ;
|
||||||
|
net.imageMean = imageMean ;
|
||||||
|
save([folderOfIntst '\latest.mat'], '-struct', 'net');
|
||||||
|
|
||||||
|
%on training set. As we are testing and inside testing code we are
|
||||||
|
%subtracting the mean, we add ir back
|
||||||
|
imdb.images.data = imdb.images.data + imageMean ;
|
||||||
|
trainIndxes = (imdb.images.set == 1);
|
||||||
|
trainImages = imdb.images.data(:, :, :, trainIndxes);
|
||||||
|
trainLbls = imdb.images.label(trainIndxes);
|
||||||
|
|
||||||
|
trainImdb.images.id = 1:length(trainLbls);
|
||||||
|
trainImdb.images.label = trainLbls;
|
||||||
|
trainImdb.images.data = trainImages;
|
||||||
|
Lbls = testCNNBNNEx6Color(trainImdb, net);
|
||||||
|
[TnConfnMat, TnFPTile, TnFNTile] = getConfnMatrix(Lbls, trainImdb, tileGenFlag);
|
||||||
|
clear trainImdb;
|
||||||
|
|
||||||
|
%Validation stat
|
||||||
|
validnIndxes = (imdb.images.set == 2);
|
||||||
|
validnImages = imdb.images.data(:, :, :, validnIndxes);
|
||||||
|
validnLbls = imdb.images.label(validnIndxes);
|
||||||
|
|
||||||
|
validnImdb.images.id = 1:length(validnLbls);
|
||||||
|
validnImdb.images.label = validnLbls;
|
||||||
|
validnImdb.images.data = validnImages;
|
||||||
|
Lbls = testCNNBNNEx6Color(validnImdb, net);
|
||||||
|
[VnConfnMat, VnFPTile, VnFNTile] = getConfnMatrix(Lbls, validnImdb, tileGenFlag);
|
||||||
|
clear validnImdb;
|
||||||
|
|
||||||
|
if (testFlag)
|
||||||
|
%on testing set
|
||||||
|
testIndxes = (imdb.images.set == 3);
|
||||||
|
testImages = imdb.images.data(:, :, :, testIndxes);
|
||||||
|
testLbls = imdb.images.label(testIndxes);
|
||||||
|
|
||||||
|
testImdb.images.id = 1:length(testLbls);
|
||||||
|
testImdb.images.label = testLbls;
|
||||||
|
testImdb.images.data = testImages;
|
||||||
|
Lbls = testCNNBNNEx6Color(testImdb, net);
|
||||||
|
[TtConfnMat, TtFPTile, TtFNTile] = getConfnMatrix(Lbls, testImdb, tileGenFlag);
|
||||||
|
clear testImdb;
|
||||||
|
if (~isempty(TtFPTile))
|
||||||
|
TtNFP = (TtFPTile - min(TtFPTile(:)))/(max(TtFPTile(:)) - min(TtFPTile(:)));
|
||||||
|
imwrite (TtNFP, [folderOfIntst '\TtNFP' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
if (~isempty(TtFNTile))
|
||||||
|
TtNFN = (TtFNTile - min(TtFNTile(:)))/(max(TtFNTile(:)) - min(TtFNTile(:)));
|
||||||
|
imwrite (TtNFN, [folderOfIntst '\TtNFN' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
save ([folderOfIntst '\TtConfnMat'], 'TtConfnMat');
|
||||||
|
ConfnMatxs = TtConfnMat;
|
||||||
|
end
|
||||||
|
clear FullImdb;
|
||||||
|
|
||||||
|
if (~isempty(TnFPTile))
|
||||||
|
TnNFP = (TnFPTile - min(TnFPTile(:)))/(max(TnFPTile(:)) - min(TnFPTile(:)));
|
||||||
|
imwrite (TnNFP, [folderOfIntst '\TnNFP' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
if (~isempty(TnFNTile))
|
||||||
|
TnNFN = (TnFNTile - min(TnFNTile(:)))/(max(TnFNTile(:)) - min(TnFNTile(:)));
|
||||||
|
imwrite (TnNFN, [folderOfIntst '\TnNFN' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
|
||||||
|
if (~isempty(VnFPTile))
|
||||||
|
VnNFP = (VnFPTile - min(VnFPTile(:)))/(max(VnFPTile(:)) - min(VnFPTile(:)));
|
||||||
|
imwrite (VnNFP, [folderOfIntst '\VnNFP' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
if (~isempty(VnFNTile))
|
||||||
|
VnNFN = (VnFNTile - min(VnFNTile(:)))/(max(VnFNTile(:)) - min(VnFNTile(:)));
|
||||||
|
imwrite (VnNFN, [folderOfIntst '\VnNFN' num2str(maxEpoch) '.jpg']);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
save ([folderOfIntst '\TnConfnMat'], 'TnConfnMat');
|
||||||
|
save ([folderOfIntst '\VnConfnMat'], 'VnConfnMat');
|
||||||
|
|
||||||
|
ConfnMatxs = [TnConfnMat ;VnConfnMat; ConfnMatxs];
|
||||||
|
[Sensitivity, Specificity, FScore] = getStatistics(ConfnMatxs)
|
||||||
|
end
|
||||||
|
|
||||||
|
function [Sensitivity, Specificity, FScore] = getStatistics(ConfnMatxs)
|
||||||
|
Sensitivity = zeros(2, 1); Specificity = zeros(2, 1); FScore = zeros(2, 1);
|
||||||
|
for i = 1:2
|
||||||
|
CConfnMat = ConfnMatxs((i-1)*2+1:i*2, 1:2);
|
||||||
|
Sensitivity(i) = CConfnMat(1, 1)/(CConfnMat(1, 1) + CConfnMat(1, 2));
|
||||||
|
Specificity(i) = CConfnMat(2, 2)/(CConfnMat(2, 2) + CConfnMat(2, 1));
|
||||||
|
FScore(i) = 2*CConfnMat(1, 1)/(2*CConfnMat(1, 1)+ CConfnMat(1, 2)+CConfnMat(2, 1));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function bkUpName = getBackUpFolderName(PercPstvTrainVaidnTest, PercNgtvTrainVaidnTest)
|
||||||
|
% PercPstvTrainVaidnTest = [1 45]; PercNgtvTrainVaidnTest = [10.3 4.5];
|
||||||
|
strname = num2str([PercPstvTrainVaidnTest PercNgtvTrainVaidnTest]);
|
||||||
|
bkUpName = ''; flag = 0;
|
||||||
|
for i = 1:length(strname)
|
||||||
|
if (flag == 1)
|
||||||
|
if (strname(i) ~= ' ')
|
||||||
|
flag = 0;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (strname(i) == '.')
|
||||||
|
flag = 0;
|
||||||
|
bkUpName(end+1) = 'P';
|
||||||
|
elseif (strname(i) == ' ')
|
||||||
|
bkUpName(end+1) = '_';
|
||||||
|
flag = 1;
|
||||||
|
else
|
||||||
|
flag = 0;
|
||||||
|
bkUpName(end+1) = strname(i);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function [ConfnMat, FPTile, FNTile] = getConfnMatrix(Lbls, imdb, genTile)
|
||||||
|
FPTile = []; FNTile = [];
|
||||||
|
ActlLbls = Lbls(2, :); ObtndLbls = Lbls(1, :);
|
||||||
|
numCls = max(ActlLbls);
|
||||||
|
ConfnMat = zeros(numCls, numCls);
|
||||||
|
for i = 1:numCls
|
||||||
|
lookngFr = (ActlLbls == i);
|
||||||
|
for j = 1:numCls
|
||||||
|
ConfnMat(i, j) = sum(ObtndLbls(lookngFr) == j);
|
||||||
|
if (i ~= j)
|
||||||
|
wrngIndx = find(lookngFr & (ObtndLbls == j));
|
||||||
|
FlseImgStck = imdb.images.data(:, :, :, wrngIndx);
|
||||||
|
if (genTile && ~isempty(FlseImgStck))
|
||||||
|
if (i == 1)
|
||||||
|
FNTile = generateTileFromStack(FlseImgStck);
|
||||||
|
else
|
||||||
|
FPTile = generateTileFromStack(FlseImgStck);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function imdbN = populateANewDataSetAB()
|
||||||
|
imdb = load('data/charsdb.mat') ;
|
||||||
|
%Select all As and Bs
|
||||||
|
imdbN = imdb;
|
||||||
|
numImages = length(imdb.images.id);
|
||||||
|
idN = []; dataN = single(zeros(32, 32, 1862)); labelN = []; setN = []; cnt = 1;
|
||||||
|
for i = 1:numImages
|
||||||
|
cLabel = imdb.images.label(i);
|
||||||
|
if (cLabel == 1 || cLabel == 2)
|
||||||
|
idN = [idN cnt];
|
||||||
|
dataN(:, :, cnt) = imdb.images.data(:, :, cnt);
|
||||||
|
labelN = [labelN cLabel];
|
||||||
|
setN = [setN imdb.images.set(i)];
|
||||||
|
cnt = cnt+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
imdbN.images.id = idN;
|
||||||
|
imdbN.images.data = dataN;
|
||||||
|
imdbN.images.label = labelN;
|
||||||
|
imdbN.images.set = setN;
|
||||||
|
end
|
||||||
|
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
function [im, labels] = getBatch(imdb, batch)
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
im = imdb.images.data(:,:,:, batch) ;
|
||||||
|
im = 256 * reshape(im, 32, 32, 9, []) ;
|
||||||
|
labels = imdb.images.label(1,batch) ;
|
||||||
|
end
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
function [im, labels] = getBatchWithJitter(imdb, batch)
|
||||||
|
% --------------------------------------------------------------------
|
||||||
|
im = imdb.images.data(:,:,batch) ;
|
||||||
|
labels = imdb.images.label(1,batch) ;
|
||||||
|
|
||||||
|
n = numel(batch) ;
|
||||||
|
train = find(imdb.images.set == 1) ;
|
||||||
|
|
||||||
|
sel = randperm(numel(train), n) ;
|
||||||
|
im1 = imdb.images.data(:,:,sel) ;
|
||||||
|
|
||||||
|
sel = randperm(numel(train), n) ;
|
||||||
|
im2 = imdb.images.data(:,:,sel) ;
|
||||||
|
|
||||||
|
ctx = [im1 im2] ;
|
||||||
|
ctx(:,17:48,:) = min(ctx(:,17:48,:), im) ;
|
||||||
|
|
||||||
|
dx = randi(11) - 6 ;
|
||||||
|
im = ctx(:,(17:48)+dx,:) ;
|
||||||
|
sx = (17:48) + dx ;
|
||||||
|
|
||||||
|
dy = randi(5) - 2 ;
|
||||||
|
sy = max(1, min(32, (1:32) + dy)) ;
|
||||||
|
|
||||||
|
im = ctx(sy,sx,:) ;
|
||||||
|
|
||||||
|
% Visualize the batch:
|
||||||
|
% figure(100) ; clf ;
|
||||||
|
% vl_imarraysc(im) ;
|
||||||
|
|
||||||
|
im = 256 * reshape(im, 32, 32, 1, []) ;
|
||||||
|
end
|
||||||
|
function MalImdb = getMyDataset(PercPstvTrainVaidnTest, PercNgtvTrainVaidnTest)
|
||||||
|
firstRun = false; writeFlag = false;
|
||||||
|
DifCultDataSet = true;
|
||||||
|
if (DifCultDataSet)
|
||||||
|
load DifSamSlctdByPgm;
|
||||||
|
load ('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\Patch32By32\DataSet32By32Color\postvStack_');
|
||||||
|
|
||||||
|
|
||||||
|
ImgStack = DifSamSlctdByPgm.ImgsDifcltStack;
|
||||||
|
TrthStack = DifSamSlctdByPgm.TrthDifcltStack;
|
||||||
|
LblsStack = DifSamSlctdByPgm.LblsDifcltStack;
|
||||||
|
TrthLbl = uint8(zeros(size(LblsStack)));
|
||||||
|
[SzM, SzN, SzO, numImgs] = size(ImgStack);
|
||||||
|
PtchSzM = 32; PtchSzN = 32; ofst = 7;
|
||||||
|
for i = 1:numImgs
|
||||||
|
TthMskPatch = TrthStack(:, :, i);
|
||||||
|
cntrPatch = TthMskPatch(PtchSzM/2-ofst:PtchSzM/2+ofst, PtchSzN/2-ofst:PtchSzN/2+ofst);
|
||||||
|
cntCentr = sum(cntrPatch(:));
|
||||||
|
if (cntCentr == 1)
|
||||||
|
TrthLbl(i) = 1;
|
||||||
|
else
|
||||||
|
TrthLbl(i) = 2;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
numPstvImgs = sum(TrthLbl == 1);
|
||||||
|
numNgtvImgs = numImgs - numPstvImgs;
|
||||||
|
negtvStack = ImgStack(:, :, :, TrthLbl == 2);
|
||||||
|
postvStack = augmentDataSetByRotation(postvStack);
|
||||||
|
[~, ~, ~, numPstvImgs] = size(postvStack);
|
||||||
|
|
||||||
|
%Create a full Databasclear alle
|
||||||
|
FullImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
FullImdb.meta.sets = {'train', 'val', 'test'};
|
||||||
|
FullImdb.meta.infn = 'Difficult Cases For Second CNN';
|
||||||
|
FullImdb.images.id = 1:(numPstvImgs+numNgtvImgs);
|
||||||
|
Fdata = postvStack;
|
||||||
|
clear postvStack;
|
||||||
|
Fdata(:, :, :, numPstvImgs+1:(numPstvImgs+numNgtvImgs)) = negtvStack;
|
||||||
|
clear negtvStack;
|
||||||
|
FullImdb.images.data = Fdata;
|
||||||
|
clear Fdata;
|
||||||
|
FullImdb.images.label = [ones(1, numPstvImgs) 2*ones(1, numNgtvImgs)];
|
||||||
|
|
||||||
|
pstvSplit = divideDataInRatio(numPstvImgs, PercPstvTrainVaidnTest);
|
||||||
|
ngtvSplit = divideDataInRatio(numNgtvImgs, PercNgtvTrainVaidnTest);
|
||||||
|
FullImdb.images.set = [pstvSplit ngtvSplit];
|
||||||
|
save('FullImdb', 'FullImdb');
|
||||||
|
%Select dataset for training
|
||||||
|
FllData = FullImdb.images.data;
|
||||||
|
FllLbl = FullImdb.images.label;
|
||||||
|
lbelCatgry = FullImdb.images.set;
|
||||||
|
slectdFrTraining = (lbelCatgry == 1) | (lbelCatgry == 2);
|
||||||
|
|
||||||
|
MalImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
MalImdb.meta.sets = {'train', 'val'};
|
||||||
|
|
||||||
|
MalImdb.images.id = 1:sum(slectdFrTraining);
|
||||||
|
MalImdb.images.data = FllData(:, :, :, slectdFrTraining);
|
||||||
|
MalImdb.images.label = FllLbl(slectdFrTraining);
|
||||||
|
MalImdb.images.set = lbelCatgry(slectdFrTraining);
|
||||||
|
else
|
||||||
|
if (firstRun)
|
||||||
|
load ('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\MalResize40By45\negtvStackSngleColor');
|
||||||
|
load ('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\MalResize40By45\postvStackSngleColor');
|
||||||
|
postvStack = augmentDataSetByRotation(postvStack);
|
||||||
|
[~, ~, ~, numPstvImgs] = size(postvStack);
|
||||||
|
[~, ~, ~, numNgtvImgs] = size(negtvStack);
|
||||||
|
|
||||||
|
|
||||||
|
%Create a full Databasclear alle
|
||||||
|
FullImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
FullImdb.meta.sets = {'train', 'val', 'test'};
|
||||||
|
FullImdb.meta.infn = 'Cell As Whole Placed on Bgnd Intnsty 200';
|
||||||
|
FullImdb.images.id = 1:(numPstvImgs+numNgtvImgs);
|
||||||
|
Fdata = postvStack;
|
||||||
|
clear postvStack;
|
||||||
|
Fdata(:, :, :, numPstvImgs+1:(numPstvImgs+numNgtvImgs)) = negtvStack;
|
||||||
|
clear negtvStack;
|
||||||
|
FullImdb.images.data = Fdata;
|
||||||
|
clear Fdata;
|
||||||
|
FullImdb.images.label = [ones(1, numPstvImgs) 2*ones(1, numNgtvImgs)];
|
||||||
|
save('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\MalResize40By45\FullImdb', 'FullImdb');
|
||||||
|
% save('E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Image Stack\FullImdb', 'FullImdb');
|
||||||
|
end
|
||||||
|
|
||||||
|
load ('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\MalResize40By45\FullImdb');
|
||||||
|
numPstvImgs = sum(FullImdb.images.label == 1);
|
||||||
|
numNgtvImgs = sum(FullImdb.images.label == 2);
|
||||||
|
|
||||||
|
pstvSplit = divideDataInRatio(numPstvImgs, PercPstvTrainVaidnTest);
|
||||||
|
ngtvSplit = divideDataInRatio(numNgtvImgs, PercNgtvTrainVaidnTest);
|
||||||
|
FullImdb.images.set = [pstvSplit ngtvSplit];
|
||||||
|
save('E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\MalResize40By45\FullImdb', 'FullImdb');
|
||||||
|
|
||||||
|
%Select dataset for training
|
||||||
|
FllData = FullImdb.images.data;
|
||||||
|
FllLbl = FullImdb.images.label;
|
||||||
|
lbelCatgry = FullImdb.images.set;
|
||||||
|
slectdFrTraining = (lbelCatgry == 1) | (lbelCatgry == 2);
|
||||||
|
|
||||||
|
MalImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
MalImdb.meta.sets = {'train', 'val'};
|
||||||
|
|
||||||
|
MalImdb.images.id = 1:sum(slectdFrTraining);
|
||||||
|
MalImdb.images.data = FllData(:, :, :, slectdFrTraining);
|
||||||
|
MalImdb.images.label = FllLbl(slectdFrTraining);
|
||||||
|
MalImdb.images.set = lbelCatgry(slectdFrTraining);
|
||||||
|
if (writeFlag)
|
||||||
|
% load imdbS;
|
||||||
|
% postvStack = imdb.images.data(:, :, 1:1440);
|
||||||
|
% selNegtiveStack = imdb.images.data(:, :, 1441:end);
|
||||||
|
|
||||||
|
pstvTiledImg = generateTileFromStack(postvStack);
|
||||||
|
ngtvTiledImg = generateTileFromStack(selNegtiveStack);
|
||||||
|
figure; imshow(pstvTiledImg, []);
|
||||||
|
figure; imshow(ngtvTiledImg, []);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function augStack = augmentDataSetByRotation(postvStack)
|
||||||
|
[SzM, SzN, SzO, numImgs] = size(postvStack);
|
||||||
|
augStack = single(zeros(SzM, SzN, SzO, 4*numImgs));
|
||||||
|
augCnt = 0;
|
||||||
|
for i = 1:numImgs
|
||||||
|
currIm = postvStack(:, :, :, i);
|
||||||
|
augStack(:, :, :, augCnt+1) = currIm; %0 degree
|
||||||
|
augStack(:, :, :, augCnt+2) = rot90(currIm, 1); %90
|
||||||
|
augStack(:, :, :, augCnt+3) = rot90(currIm, 2); %180
|
||||||
|
augStack(:, :, :, augCnt+4) = rot90(currIm, 3); %270
|
||||||
|
augCnt = augCnt + 4;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function augStack = augmentDataSetByRotationColor(postvStack)
|
||||||
|
[SzM, SzN, SzO, numImgs] = size(postvStack);
|
||||||
|
augStack = single(zeros(SzM, SzN, SzO, 4*numImgs));
|
||||||
|
augCnt = 0;
|
||||||
|
for i = 1:numImgs
|
||||||
|
currIm = postvStack(:, :, :, i);
|
||||||
|
augStack(:, :, :, augCnt+1) = currIm; %0 degree
|
||||||
|
augStack(:, :, :, augCnt+2) = rot90(currIm, 1); %90
|
||||||
|
augStack(:, :, :, augCnt+3) = rot90(currIm, 2); %180
|
||||||
|
augStack(:, :, :, augCnt+4) = rot90(currIm, 3); %270
|
||||||
|
augCnt = augCnt + 4;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function TnTtVn = divideDataInRatio(MaxLt, Ratio)
|
||||||
|
blck = randperm(MaxLt); strt = 1;
|
||||||
|
cmSum = cumsum(Ratio);
|
||||||
|
TnTtVn = zeros(1, MaxLt);
|
||||||
|
for i = 1:length(Ratio)
|
||||||
|
intstd = round(cmSum(i)/100*MaxLt);
|
||||||
|
TnTtVn((blck >= strt) & (blck <= intstd)) = i;
|
||||||
|
strt = intstd+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function currStackTile = generateTileFromStack(cellStack)
|
||||||
|
[Szm, Szn, SzO, numCells] = size(cellStack);
|
||||||
|
numCellsPrRow = round(sqrt(numCells));
|
||||||
|
numCellsPrCol = ceil(numCells/numCellsPrRow);
|
||||||
|
rwGap = 1; clGap = 1; %pixels
|
||||||
|
TileCl = (numCellsPrRow - 1)*clGap + numCellsPrRow*Szn;
|
||||||
|
TileRw = (numCellsPrCol - 1)*rwGap + numCellsPrCol*Szm;
|
||||||
|
currStackTile = zeros(TileRw, TileCl);
|
||||||
|
startRw = 1; cntCells = 1;
|
||||||
|
for i = 1:numCellsPrCol+1
|
||||||
|
startCl = 1;
|
||||||
|
endRw = startRw + Szm - 1;
|
||||||
|
for j = 1:numCellsPrRow
|
||||||
|
if (cntCells > numCells)
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
endCl = startCl + Szn - 1;
|
||||||
|
if (SzO == 9)
|
||||||
|
bndRed = 3;
|
||||||
|
currCell = cellStack(:, :, 4:6, cntCells);
|
||||||
|
elseif (SzO == 3)
|
||||||
|
bndRed = 3;
|
||||||
|
currCell = cellStack(:, :, :, cntCells);
|
||||||
|
else
|
||||||
|
bndRed = 1;
|
||||||
|
currCell = cellStack(:, :, cntCells);
|
||||||
|
end
|
||||||
|
cntCells = cntCells+1;
|
||||||
|
currStackTile(startRw:endRw, startCl:endCl, 1:bndRed) = currCell;
|
||||||
|
startCl = endCl + clGap + 1;
|
||||||
|
end
|
||||||
|
startRw = endRw + rwGap+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function imdb = getPreLoadedDataset(DataSetLoc, bkUpName)
|
||||||
|
load (['CNNPatches\' DataSetLoc bkUpName]);
|
||||||
|
imdb = MalImdb;
|
||||||
|
end
|
||||||
|
% load ('E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Image Stack\FullImdb');
|
||||||
|
% SplitLbels = FullImdb.images.set;
|
||||||
|
% save ('E:\Gopakumar\Dataset IIST RSDAY\IIST RSDAY MY WORK\Work\Code\matconvnet-1.0-beta11\practical-cnn-2015a\practical-cnn-2015a\myExp6\lastStat\SplitLbels', 'SplitLbels');
|
||||||
25
src/gopa kumar code/Read Me.txt
Normal file
25
src/gopa kumar code/Read Me.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
1. Run SVMTrainBFcsRGB to train SVM
|
||||||
|
|
||||||
|
2. Run CnnSvmOnSlideCalling to test the classifier on each slide image.
|
||||||
|
|
||||||
|
3. Output will be stored in ./PrintPath\WithDstWBC\IndVid\BFczdFeatRGB
|
||||||
|
|
||||||
|
4. Confusion matrices and Total statistics will be stored in ./Programs\myExp6\WithDstWBC\BFczdFeatRGB_MalImdb
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
|
||||||
|
If base path is 'E:\Gopakumar\GopakumarIISTDrive\Dataset\JCMIG_Dataset_4th IISC\Mal01\Images\GndTruth\Separate\NewEasy\'
|
||||||
|
|
||||||
|
This program access
|
||||||
|
the best focussed images from 'base path/ImgesMinAcrsStck'
|
||||||
|
|
||||||
|
the focusstack from 'E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\Patch32By32\DataSet32By32Color\Manual_But_Sel_Training\AllFcsStack\'
|
||||||
|
|
||||||
|
DstLocByPGM from 'base path/DstLocnsPgm'
|
||||||
|
|
||||||
|
GndTruths are accessed from 'base path/GndTrth'
|
||||||
|
|
||||||
|
|
||||||
48
src/gopa kumar code/SVMTrainBFcsRGB.m
Normal file
48
src/gopa kumar code/SVMTrainBFcsRGB.m
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
function SVMTrainBFcsRGB()
|
||||||
|
DataSetLoc = 'WithDstWBC\'; saveTrainedModel (DataSetLoc);
|
||||||
|
if (false)
|
||||||
|
DataSetLoc = 'WithOutDstWBC\'; saveTrainedModel (DataSetLoc);
|
||||||
|
DataSetLoc = 'WithWBCNoDst\'; saveTrainedModel (DataSetLoc);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function saveTrainedModel (DataSetLoc)
|
||||||
|
imdb = getPreLoadedDataset(DataSetLoc);
|
||||||
|
setCategory = imdb.images.set;
|
||||||
|
tnIndx = (setCategory == 1);
|
||||||
|
vnIndx = (setCategory == 2);
|
||||||
|
%By default it normalizes
|
||||||
|
trainData = imdb.images.data(tnIndx, :);
|
||||||
|
vnData = imdb.images.data(vnIndx, :);
|
||||||
|
trainLabl = imdb.images.label(tnIndx);
|
||||||
|
vnnLabl = imdb.images.label(vnIndx);
|
||||||
|
|
||||||
|
sigMa = 0.6;
|
||||||
|
SvMModel.Meta.Kf = 'rbf';
|
||||||
|
if (strcmp(SvMModel.Meta.Kf, 'rbf'))
|
||||||
|
SvMModel.Meta.Sigma = sigMa;
|
||||||
|
svmModel = svmtrain(trainData, trainLabl, 'kernel_function', SvMModel.Meta.Kf, 'rbf_sigma', SvMModel.Meta.Sigma);
|
||||||
|
else
|
||||||
|
svmModel = svmtrain(trainData, trainLabl);
|
||||||
|
end
|
||||||
|
clfdLabl = svmclassify(svmModel, vnData);
|
||||||
|
VnConfnMat = getConfnMat(clfdLabl, vnnLabl);
|
||||||
|
VnConfnMat
|
||||||
|
%0.2813;
|
||||||
|
SvMModel.model = svmModel;
|
||||||
|
save (['myExp6\' DataSetLoc 'BFczdFeatRGB_MalImdb\VnConfnMat'], 'VnConfnMat');
|
||||||
|
% save (['myExp6\' DataSetLoc 'BFczdFeatRGB_MalImdb\SvMModel_' SvMModel.Meta.Kf], 'SvMModel');
|
||||||
|
save (['myExp6\' DataSetLoc 'BFczdFeatRGB_MalImdb\SvMModel'], 'SvMModel');
|
||||||
|
end
|
||||||
|
function confnMat = getConfnMat(clfdLabl, vnnLabl)
|
||||||
|
confnMat = zeros(2, 2);
|
||||||
|
for i = 1:2
|
||||||
|
curIntst = (vnnLabl == i);
|
||||||
|
for j = 1:2
|
||||||
|
confnMat(i, j) = sum(clfdLabl(curIntst) == j);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function imdb = getPreLoadedDataset(DataSetLoc)
|
||||||
|
load (['CNNPatches\' DataSetLoc 'BFczdFeatRGB_MalImdb']);
|
||||||
|
imdb = MalImdb;
|
||||||
|
end
|
||||||
74
src/gopa kumar code/countTPFNFPTN.m
Normal file
74
src/gopa kumar code/countTPFNFPTN.m
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
function [TP, FN, FP, TN] = countTPFNFPTN(segmentedImg, GndTruth, Classfd)
|
||||||
|
% imRGB = imread(['E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Images\GndTruth\Separate\NewEasy\ImgesMinAcrsStck\' '0_5_B.jpg']);
|
||||||
|
% currImgUint8 = imRGB;
|
||||||
|
% load Classfd; load GndTruth;
|
||||||
|
ofstSeg = 7;
|
||||||
|
[X, Y ] = meshgrid(-ofstSeg:ofstSeg, -ofstSeg:ofstSeg); distM = sqrt(X.^2+Y.^2);
|
||||||
|
% [segmentedImg, segWithBndry, WBCs] = getSegmentation(currImgUint8);
|
||||||
|
GndTrthClLbl = segmentedImg(GndTruth);
|
||||||
|
excludeGThCnt = 0;
|
||||||
|
%sepecial case and is due to inaccurate segmentation
|
||||||
|
if (sum(GndTrthClLbl == 0) > 0)
|
||||||
|
%select the closest label from 15x15 neighbourhood.
|
||||||
|
%for each such points
|
||||||
|
[r, c] = find(GndTruth);
|
||||||
|
for i = 1:length(r)
|
||||||
|
if (segmentedImg(r(i), c(i)) == 0)
|
||||||
|
candLbls = segmentedImg(r(i)-ofstSeg:r(i)+ofstSeg, c(i)-ofstSeg:c(i)+ofstSeg);
|
||||||
|
candLblDst = distM .* (candLbls > 0);
|
||||||
|
candLblDst(candLblDst == 0) = Inf;
|
||||||
|
candLblDst = (candLblDst == min(candLblDst(:)));
|
||||||
|
closestLbl = max(candLbls(candLblDst)); %believing that there is a cell in 15x15 loc
|
||||||
|
if (closestLbl > 0)
|
||||||
|
GndTrthClLbl = [GndTrthClLbl; closestLbl];
|
||||||
|
else
|
||||||
|
%No cell in the visinity
|
||||||
|
excludeGThCnt = excludeGThCnt + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
GndTrthClLbl = unique(GndTrthClLbl);
|
||||||
|
if (~isempty(GndTrthClLbl) && GndTrthClLbl(1) == 0); GndTrthClLbl(1) = []; end;
|
||||||
|
ClassfdClLbl = segmentedImg(Classfd);
|
||||||
|
excludeClsfdCnt = 0;
|
||||||
|
%sepecial case and is due to inaccurate segmentation
|
||||||
|
if (sum(ClassfdClLbl == 0) > 0)
|
||||||
|
%select the closest label from 15x15 neighbourhood.
|
||||||
|
%for each such points
|
||||||
|
[r, c] = find(Classfd);
|
||||||
|
for i = 1:length(r)
|
||||||
|
if (segmentedImg(r(i), c(i)) == 0)
|
||||||
|
candLbls = segmentedImg(r(i)-ofstSeg:r(i)+ofstSeg, c(i)-ofstSeg:c(i)+ofstSeg);
|
||||||
|
candLblDst = distM .* (candLbls > 0);
|
||||||
|
candLblDst(candLblDst == 0) = Inf;
|
||||||
|
candLblDst = (candLblDst == min(candLblDst(:)));
|
||||||
|
closestLbl = max(candLbls(candLblDst)); %believing that there is a cell in 15x15 loc
|
||||||
|
if (closestLbl > 0)
|
||||||
|
ClassfdClLbl = [ClassfdClLbl; closestLbl];
|
||||||
|
else
|
||||||
|
%No cell in the visinity
|
||||||
|
excludeClsfdCnt = excludeClsfdCnt + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ClassfdClLbl = unique(ClassfdClLbl);
|
||||||
|
if (~isempty(ClassfdClLbl) && ClassfdClLbl(1) == 0); ClassfdClLbl(1) = []; end;
|
||||||
|
|
||||||
|
|
||||||
|
%count TP and FN
|
||||||
|
TP = 0; FN = 0;
|
||||||
|
for i = 1:length(GndTrthClLbl)
|
||||||
|
curCell = GndTrthClLbl(i);
|
||||||
|
if (sum(curCell == ClassfdClLbl) > 0)
|
||||||
|
TP = TP + 1;
|
||||||
|
else
|
||||||
|
FN = FN + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
FP = length(ClassfdClLbl) - TP;
|
||||||
|
TN = double(max(segmentedImg(:)) - (TP + FN + FP));
|
||||||
|
% imshow(segWithBndry);
|
||||||
|
end
|
||||||
289
src/gopa kumar code/generate32X32FcsStck_Fcsd_Feat_RGB.m
Normal file
289
src/gopa kumar code/generate32X32FcsStck_Fcsd_Feat_RGB.m
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
function generate32X32FcsStck_Fcsd_Feat_RGB()
|
||||||
|
alreadySegmented = true;
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type1', false, alreadySegmented); %This function get the fcsRGB patches, BFczdPathes and Features on RGB and stores it
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type2', false, alreadySegmented);
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type1', true, alreadySegmented); %This function get the fcsRGB patches, BFczdPathes and Features on RGB and stores it
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type2', true, alreadySegmented);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [FnlFeatSet, CellId] = getMyFeatures(cellsImg, imUint8RGB, slideName)
|
||||||
|
%Lets do the processing on Green channel for the time being
|
||||||
|
avMsk = fspecial('average', 3);
|
||||||
|
FnlFeatSet = single(zeros(1, 14*3)); %3 Channels
|
||||||
|
for ch = 1:3
|
||||||
|
imGreen = imUint8RGB(:, :, ch);
|
||||||
|
imGreenDble = im2double(imGreen);
|
||||||
|
[grdMg, ~] = imgradient(imGreenDble);
|
||||||
|
meanLclMsk = imfilter(imGreenDble, avMsk);
|
||||||
|
varnLclMsk = imfilter(imGreenDble.^2, avMsk) - meanLclMsk.^2;
|
||||||
|
[SzM, SzN] = size(imGreen);
|
||||||
|
props = regionprops(cellsImg, {'PixelIdxList', 'Centroid'});
|
||||||
|
[numObjs, ~] = size(props);
|
||||||
|
myBgndImgI = uint8(200* ones(SzM, SzN));
|
||||||
|
FeatSet = single(zeros(numObjs, 14));
|
||||||
|
CellId = [];
|
||||||
|
for i = 1:numObjs
|
||||||
|
pxlIdxLst = props(i).PixelIdxList;
|
||||||
|
[SR, SC] = ind2sub(size(imGreen), pxlIdxLst);
|
||||||
|
tmpI = myBgndImgI;
|
||||||
|
tmpI(pxlIdxLst) = imGreen(pxlIdxLst);
|
||||||
|
%Get the patch
|
||||||
|
minSR = min(SR); maxSR = max(SR);
|
||||||
|
minSC = min(SC); maxSC = max(SC);
|
||||||
|
imgPatch = tmpI(minSR:maxSR, minSC:maxSC);
|
||||||
|
mskPatch = cellsImg(minSR:maxSR, minSC:maxSC);
|
||||||
|
FeatSet(i, 1:4) = getGLCMFeatPrPatch(imgPatch, mskPatch);
|
||||||
|
|
||||||
|
imGrnDblPchPxls = imGreenDble(pxlIdxLst);
|
||||||
|
meanGlblPxls = mean(imGrnDblPchPxls);
|
||||||
|
varGlblPxls = var(imGrnDblPchPxls);
|
||||||
|
minPxls = min(imGrnDblPchPxls);
|
||||||
|
maxPxls = max(imGrnDblPchPxls);
|
||||||
|
minGrdMag = min(grdMg(pxlIdxLst));
|
||||||
|
maxGrdMag = max(grdMg(pxlIdxLst));
|
||||||
|
minLclMean = min(meanLclMsk(pxlIdxLst));
|
||||||
|
maxLclMean = max(meanLclMsk(pxlIdxLst));
|
||||||
|
minLclVarn = min(varnLclMsk(pxlIdxLst));
|
||||||
|
maxLclVarn = max(varnLclMsk(pxlIdxLst));
|
||||||
|
FeatSet(i,5:14) = [meanGlblPxls varGlblPxls minPxls maxPxls ...
|
||||||
|
minGrdMag maxGrdMag minLclMean maxLclMean ...
|
||||||
|
minLclVarn maxLclVarn];
|
||||||
|
cellCentr = round(props(i).Centroid);
|
||||||
|
CellId(i).name = [slideName '_' num2str(cellCentr(2)) '_' num2str(cellCentr(1))];
|
||||||
|
end
|
||||||
|
FnlFeatSet(1, (ch-1)*14+1:ch*14) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function GLCMFeat = getGLCMFeatPrPatch(imUint8Gray, Msk)
|
||||||
|
im = imUint8Gray;
|
||||||
|
%im has to be Single band [0 255]
|
||||||
|
[SzR, SzC, SzO] = size(im);
|
||||||
|
MskX = [Msk(:, 2:end) Msk(:, end)];
|
||||||
|
MskY = [Msk(2:end, :); Msk(end, :)];
|
||||||
|
MskD = Msk & MskX & MskY; %MskD = bwmorph(MskD, 'erode', 3);
|
||||||
|
%Compute the GLCM for each band for the reg and return the props.
|
||||||
|
Lvl = 32; LvlDiv = 256/Lvl;
|
||||||
|
regIntst = MskD;
|
||||||
|
GLCMMat = zeros(Lvl, Lvl);
|
||||||
|
GLCMFeat = zeros(SzO, 4);
|
||||||
|
for band = 1:SzO
|
||||||
|
imBand = double(im);
|
||||||
|
imgL = ceil((imBand+1)/LvlDiv);
|
||||||
|
imgL(~regIntst) = -1;
|
||||||
|
for i = 1:SzR
|
||||||
|
for j = 1:SzC-1
|
||||||
|
valLeft = imgL(i, j);
|
||||||
|
valRight = imgL(i, j+1);
|
||||||
|
if (valLeft ~= -1 && valRight ~= -1)
|
||||||
|
GLCMMat(valLeft, valRight) = GLCMMat(valLeft, valRight)+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
GFeat = graycoprops(GLCMMat);
|
||||||
|
GLCMFeat(band, :) = [GFeat.Contrast GFeat.Correlation GFeat.Energy GFeat.Homogeneity];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function getTrainingSet32X32FcsStk_BFcsd_Feat_RGB(Folder, dustExclFrTrain, alreadySegmented)
|
||||||
|
%This function saves the 32x32 focus stack patches of 5th, 21st, and 37th
|
||||||
|
%images of the stck FczdRGB, stote the 21st alone as BFczdRGB, and the
|
||||||
|
%features of the BFcsdRGB as BFcsdFeatRGB.
|
||||||
|
%
|
||||||
|
|
||||||
|
if (dustExclFrTrain)
|
||||||
|
svPath = 'CNNPatches\DntUseDst4NgPatc\';
|
||||||
|
else
|
||||||
|
svPath = 'CNNPatches\DoUseDst4NgPatc\';
|
||||||
|
end
|
||||||
|
|
||||||
|
if (alreadySegmented)
|
||||||
|
load ('CNNPatches\Segment\alreadySegImg');
|
||||||
|
load ('CNNPatches\Segment\alreadyWBCImg');
|
||||||
|
load ('CNNPatches\Segment\segIndxNames');
|
||||||
|
end
|
||||||
|
|
||||||
|
btchSz = 12000;
|
||||||
|
BasePath = ['E:\Gopakumar\GopakumarIISTDrive\Dataset\' ...
|
||||||
|
'4th IIST Visit\Mal01\Images\GndTruth\Separate\NewEasy\'];
|
||||||
|
fnames = dir([BasePath '\ImgsMinAcrsStckTwoCls\' Folder '\*B.jpg']);
|
||||||
|
FczStkPath = 'E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\Patch32By32\DataSet32By32Color\Manual_But_Sel_Training\AllFcsStack\';
|
||||||
|
|
||||||
|
numfids = length(fnames); M = 32; N = 32; R = 1; Rad = 0.75*M;
|
||||||
|
dskMskPstv = strel('disk', Rad); dskMskDust = strel('disk', Rad);
|
||||||
|
posCnt = 0; negCnt = 0; negChnk = 1; prevVidIndx = '';
|
||||||
|
for K = 1:numfids
|
||||||
|
K
|
||||||
|
AbsFNme = [BasePath '\ImgsMinAcrsStckTwoCls\' Folder '\' fnames(K).name];
|
||||||
|
%Get details needed to acces the Ground Truth file
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
for i = 1:length(FileName); if (FileName(i) == '_'); vid = i-1; break; end; end;
|
||||||
|
for j = vid+2:length(FileName); if (FileName(j) == '_'); stck = j-1; break; end; end;
|
||||||
|
vidIndx = FileName(1:vid); stckIndx = FileName(vid+2:stck);
|
||||||
|
slideName = [vidIndx '_' stckIndx];
|
||||||
|
%Read the min RGB image
|
||||||
|
img = imread(AbsFNme); [SizeR, SizeC, ~] = size(img);
|
||||||
|
if(isTherWBC([vidIndx '_' stckIndx]))
|
||||||
|
if (~alreadySegmented)
|
||||||
|
[segmentedImg, segWithBndry, WBCs] = getSegmentation(img);
|
||||||
|
else
|
||||||
|
IndxPosSlctd = getSegmentedIndx([vidIndx '_' stckIndx], segIndxNames);
|
||||||
|
segmentedImg = alreadySegImg(:, :, IndxPosSlctd);
|
||||||
|
WBCs = alreadyWBCImg(:, :, IndxPosSlctd);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
WBCs = false(SizeR, SizeC);
|
||||||
|
end
|
||||||
|
imF1 = im2single(imread([FczStkPath vidIndx '_' stckIndx '_5.jpg']));
|
||||||
|
imF = imread([FczStkPath vidIndx '_' stckIndx '_21.jpg']); imF2 = im2single(imF);
|
||||||
|
imF3 = im2single(imread([FczStkPath vidIndx '_' stckIndx '_37.jpg']));
|
||||||
|
imG(:, :, 1:3) = imF1; imG(:, :, 4:6) = imF2; imG(:, :, 7:9) = imF3;
|
||||||
|
% imG = 0;
|
||||||
|
% imG = img; %(:, :, 2);
|
||||||
|
% imG = im2single(imG);
|
||||||
|
[SzM, SzN, SzO] = size(imG);
|
||||||
|
%Get the positive patches
|
||||||
|
load ([BasePath 'GndTrth\' vidIndx '_' stckIndx]);
|
||||||
|
if (~strcmp(prevVidIndx, vidIndx));
|
||||||
|
prevVidIndx = vidIndx;
|
||||||
|
DstMsk = getDstLocnsFor(vidIndx);
|
||||||
|
end
|
||||||
|
|
||||||
|
load ([BasePath 'GndTrth\Dst_' vidIndx '_' stckIndx]);
|
||||||
|
[PlocR, PlocC] = find (Msk);
|
||||||
|
falseMsk = false(size(Msk));
|
||||||
|
for i = 1:length(PlocR)
|
||||||
|
|
||||||
|
%For the time being, if there is a patch of the required size
|
||||||
|
%around the point, then only we are considering it.
|
||||||
|
minRw = PlocR(i) - M/2; minCl = PlocC(i) - N/2;
|
||||||
|
maxRw = PlocR(i) + M/2-1; maxCl = PlocC(i) + N/2-1;
|
||||||
|
if (minRw > 0 && minCl > 0 && maxRw <= SzM && maxCl <= SzN)
|
||||||
|
currPatch = imG(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
posCnt = posCnt + 1;
|
||||||
|
postvStackFcsRGB(1:M, 1:N, 1:SzO, posCnt) = currPatch;
|
||||||
|
postvBestFczdRGB(1:M, 1:N, 1:3, posCnt) = imG(minRw:maxRw, minCl:maxCl, 4:6);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = true;
|
||||||
|
[FeatSet, ~] = getMyFeatures(falseMsk, imF, slideName);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = false;
|
||||||
|
postvBstFczdFeat(posCnt, :) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
%Get the negative patches by Masking out positive regions
|
||||||
|
%and Masking out Dust Regions
|
||||||
|
mskdPstv = imdilate(Msk, dskMskPstv);
|
||||||
|
mskdDust = imdilate(DstMsk, dskMskDust);
|
||||||
|
%Find regional minima
|
||||||
|
regMin = getMySuspectedRegion(img);
|
||||||
|
%Get negative Positions
|
||||||
|
if (dustExclFrTrain)
|
||||||
|
mskNgtv = regMin & ~mskdPstv & ~mskdDust & ~WBCs;
|
||||||
|
else
|
||||||
|
mskNgtv = regMin & ~mskdPstv & ~WBCs;
|
||||||
|
end
|
||||||
|
%the regmin can be a group of pixels. So select pixels with respect
|
||||||
|
%to the centroids
|
||||||
|
% mySusp = false(size(mskNgtv));
|
||||||
|
Cntrids = regionprops(mskNgtv, 'centroid');
|
||||||
|
[numNgtvs, ~] = size(Cntrids);
|
||||||
|
for i = 1:numNgtvs
|
||||||
|
|
||||||
|
%For the time being, if there is a patch of the required size
|
||||||
|
%around the point, then only we are considering it.
|
||||||
|
CCntrids = round(Cntrids(i).Centroid);
|
||||||
|
minRw = CCntrids(2) - M/2; minCl = CCntrids(1) - N/2;
|
||||||
|
maxRw = CCntrids(2) + M/2-1; maxCl = CCntrids(1) + N/2-1;
|
||||||
|
if (minRw > 0 && minCl > 0 && maxRw <= SzM && maxCl <= SzN)
|
||||||
|
%Because of the size constraint lets sample one out of five
|
||||||
|
decideTTake = rand(); outOf = 1;
|
||||||
|
if (decideTTake >= (1 - 1/outOf))
|
||||||
|
currPatch = imG(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
negCnt = negCnt + 1;
|
||||||
|
negtvStackFcsRGB(1:M, 1:N, 1:SzO, negCnt) = currPatch;
|
||||||
|
negtvBestFczdRGB(1:M, 1:N, 1:3, negCnt) = imG(minRw:maxRw, minCl:maxCl, 4:6);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = true;
|
||||||
|
[FeatSet, ~] = getMyFeatures(falseMsk, imF, slideName);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = false;
|
||||||
|
negtvBstFczdFeat(negCnt, :) = FeatSet;
|
||||||
|
|
||||||
|
|
||||||
|
if (negCnt == btchSz)
|
||||||
|
save ([svPath 'FczRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvStackFcsRGB');
|
||||||
|
save ([svPath 'BFczdRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBestFczdRGB');
|
||||||
|
save ([svPath 'BFczdFeatRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBstFczdFeat');
|
||||||
|
negChnk = negChnk+1;
|
||||||
|
negCnt = 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% mySusp(CCntrids(2), CCntrids(1)) = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% dilMySusp = bwmorph(mySusp, 'dilate', 5);
|
||||||
|
% r = img(:, :, 1); g = img(:, :, 2); b = img(:, :, 3);
|
||||||
|
% r(dilMySusp) = 0; g(dilMySusp) = 0; b(dilMySusp) = 255;
|
||||||
|
% mySuspIm(:, :, 1) = r; mySuspIm(:, :, 2) = g; mySuspIm(:, :, 3) = b;
|
||||||
|
% imshow(img); title('original'); figure;
|
||||||
|
% imshow(mySuspIm); title('original');
|
||||||
|
% close all;
|
||||||
|
end
|
||||||
|
save ([svPath 'FczRGBPsStk_' Folder], 'postvStackFcsRGB');
|
||||||
|
save ([svPath 'BFczdRGBPsStk_' Folder], 'postvBestFczdRGB');
|
||||||
|
save ([svPath 'BFczdFeatRGBPsStk_' Folder], 'postvBstFczdFeat');
|
||||||
|
|
||||||
|
negtvStackFcsRGB = negtvStackFcsRGB(1:M, 1:N, 1:SzO, 1:negCnt); %+1:end) = [];
|
||||||
|
negtvBestFczdRGB = negtvBestFczdRGB(1:M, 1:N, :, 1:negCnt);
|
||||||
|
negtvBstFczdFeat = negtvBstFczdFeat(1:negCnt, :);
|
||||||
|
|
||||||
|
save ([svPath 'FczRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvStackFcsRGB');
|
||||||
|
save ([svPath 'BFczdRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBestFczdRGB');
|
||||||
|
save ([svPath 'BFczdFeatRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBstFczdFeat');
|
||||||
|
end
|
||||||
|
|
||||||
|
function IndxPosSlctd = getSegmentedIndx(indxName, segIndxNames)
|
||||||
|
[~, numNames] = size(segIndxNames);
|
||||||
|
for i = 1:numNames
|
||||||
|
if (strcmp(indxName, segIndxNames(i).name))
|
||||||
|
IndxPosSlctd = i;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function stat = isTherWBC(fileName)
|
||||||
|
stat = false;
|
||||||
|
indx = {'1_9', '2_19', '3_3', '3_4', '4_8', '5_1', 'A_6', 'A_14', 'BB_3', 'BB_13', ...
|
||||||
|
'BB_14', 'C_15', 'C_16', 'D_13', 'E_2', 'EE_4', 'F_3', 'F_5', 'F_9', 'FF_6', ...
|
||||||
|
'GG_4', 'G_16', 'G_17', 'H_5', 'H_16', 'I_1', 'J_18', 'KK_9', 'L_6', ...
|
||||||
|
'O_8', 'P_12', 'P_13', 'S_16', 'T_12', 'V_8', 'V_9', 'W_8', 'W_18', 'X_11', ...
|
||||||
|
'X_13', 'Y_2', 'Z_11'};
|
||||||
|
[~, num] = size(indx);
|
||||||
|
for i = 1:num
|
||||||
|
if (strcmp(fileName, indx(i)))
|
||||||
|
stat = true;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function cDstLoc = getDstLocnsFor(vidIndx)
|
||||||
|
Path = 'E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Images\GndTruth\Separate\NewEasy\DstLocnsPgm\';
|
||||||
|
load ([Path 'DstLocByPGM']); cnt = 0;
|
||||||
|
vidIndxs = DstLocByPGM.vidIndx;
|
||||||
|
[~, numVidIndxs] = size(vidIndxs);
|
||||||
|
for i = 1:numVidIndxs
|
||||||
|
if (strcmp(vidIndx, vidIndxs(i).name))
|
||||||
|
cDstLoc = DstLocByPGM.DstLocByPgm(:, :, i);
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function susReg = getMySuspectedRegion(img)
|
||||||
|
MnSz = 900;
|
||||||
|
hsv = rgb2hsv(img);
|
||||||
|
vlue = hsv(:, :, 3);
|
||||||
|
stDsk = strel('disk', 7);
|
||||||
|
openimg = imopen(vlue, stDsk);
|
||||||
|
mask = imregionalmin(openimg);
|
||||||
|
%First Filtering Exclude all the Bgnd
|
||||||
|
susReg = (bwareaopen((vlue < graythresh(vlue)), MnSz)) & mask;
|
||||||
|
end
|
||||||
282
src/gopa kumar code/generateDstAndWBCPatches.m
Normal file
282
src/gopa kumar code/generateDstAndWBCPatches.m
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
function generateDstAndWBCPatches(alreadySegmented)
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type1', true, alreadySegmented); %This function get the fcsRGB patches, BFczdPathes and Features on RGB and stores it
|
||||||
|
getTrainingSet32X32FcsStk_BFcsd_Feat_RGB('Type2', true, alreadySegmented);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [FnlFeatSet, CellId] = getMyFeatures(cellsImg, imUint8RGB, slideName)
|
||||||
|
%Lets do the processing on Green channel for the time being
|
||||||
|
avMsk = fspecial('average', 3);
|
||||||
|
FnlFeatSet = single(zeros(1, 14*3)); %3 Channels
|
||||||
|
for ch = 1:3
|
||||||
|
imGreen = imUint8RGB(:, :, ch);
|
||||||
|
imGreenDble = im2double(imGreen);
|
||||||
|
[grdMg, ~] = imgradient(imGreenDble);
|
||||||
|
meanLclMsk = imfilter(imGreenDble, avMsk);
|
||||||
|
varnLclMsk = imfilter(imGreenDble.^2, avMsk) - meanLclMsk.^2;
|
||||||
|
[SzM, SzN] = size(imGreen);
|
||||||
|
props = regionprops(cellsImg, {'PixelIdxList', 'Centroid'});
|
||||||
|
[numObjs, ~] = size(props);
|
||||||
|
myBgndImgI = uint8(200* ones(SzM, SzN));
|
||||||
|
FeatSet = single(zeros(numObjs, 14));
|
||||||
|
CellId = [];
|
||||||
|
for i = 1:numObjs
|
||||||
|
pxlIdxLst = props(i).PixelIdxList;
|
||||||
|
[SR, SC] = ind2sub(size(imGreen), pxlIdxLst);
|
||||||
|
tmpI = myBgndImgI;
|
||||||
|
tmpI(pxlIdxLst) = imGreen(pxlIdxLst);
|
||||||
|
%Get the patch
|
||||||
|
minSR = min(SR); maxSR = max(SR);
|
||||||
|
minSC = min(SC); maxSC = max(SC);
|
||||||
|
imgPatch = tmpI(minSR:maxSR, minSC:maxSC);
|
||||||
|
mskPatch = cellsImg(minSR:maxSR, minSC:maxSC);
|
||||||
|
FeatSet(i, 1:4) = getGLCMFeatPrPatch(imgPatch, mskPatch);
|
||||||
|
|
||||||
|
imGrnDblPchPxls = imGreenDble(pxlIdxLst);
|
||||||
|
meanGlblPxls = mean(imGrnDblPchPxls);
|
||||||
|
varGlblPxls = var(imGrnDblPchPxls);
|
||||||
|
minPxls = min(imGrnDblPchPxls);
|
||||||
|
maxPxls = max(imGrnDblPchPxls);
|
||||||
|
minGrdMag = min(grdMg(pxlIdxLst));
|
||||||
|
maxGrdMag = max(grdMg(pxlIdxLst));
|
||||||
|
minLclMean = min(meanLclMsk(pxlIdxLst));
|
||||||
|
maxLclMean = max(meanLclMsk(pxlIdxLst));
|
||||||
|
minLclVarn = min(varnLclMsk(pxlIdxLst));
|
||||||
|
maxLclVarn = max(varnLclMsk(pxlIdxLst));
|
||||||
|
FeatSet(i,5:14) = [meanGlblPxls varGlblPxls minPxls maxPxls ...
|
||||||
|
minGrdMag maxGrdMag minLclMean maxLclMean ...
|
||||||
|
minLclVarn maxLclVarn];
|
||||||
|
cellCentr = round(props(i).Centroid);
|
||||||
|
CellId(i).name = [slideName '_' num2str(cellCentr(2)) '_' num2str(cellCentr(1))];
|
||||||
|
end
|
||||||
|
FnlFeatSet(1, (ch-1)*14+1:ch*14) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function GLCMFeat = getGLCMFeatPrPatch(imUint8Gray, Msk)
|
||||||
|
im = imUint8Gray;
|
||||||
|
%im has to be Single band [0 255]
|
||||||
|
[SzR, SzC, SzO] = size(im);
|
||||||
|
MskX = [Msk(:, 2:end) Msk(:, end)];
|
||||||
|
MskY = [Msk(2:end, :); Msk(end, :)];
|
||||||
|
MskD = Msk & MskX & MskY; %MskD = bwmorph(MskD, 'erode', 3);
|
||||||
|
%Compute the GLCM for each band for the reg and return the props.
|
||||||
|
Lvl = 32; LvlDiv = 256/Lvl;
|
||||||
|
regIntst = MskD;
|
||||||
|
GLCMMat = zeros(Lvl, Lvl);
|
||||||
|
GLCMFeat = zeros(SzO, 4);
|
||||||
|
for band = 1:SzO
|
||||||
|
imBand = double(im);
|
||||||
|
imgL = ceil((imBand+1)/LvlDiv);
|
||||||
|
imgL(~regIntst) = -1;
|
||||||
|
for i = 1:SzR
|
||||||
|
for j = 1:SzC-1
|
||||||
|
valLeft = imgL(i, j);
|
||||||
|
valRight = imgL(i, j+1);
|
||||||
|
if (valLeft ~= -1 && valRight ~= -1)
|
||||||
|
GLCMMat(valLeft, valRight) = GLCMMat(valLeft, valRight)+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
GFeat = graycoprops(GLCMMat);
|
||||||
|
GLCMFeat(band, :) = [GFeat.Contrast GFeat.Correlation GFeat.Energy GFeat.Homogeneity];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function getTrainingSet32X32FcsStk_BFcsd_Feat_RGB(Folder, dustExclFrTrain, alreadySegmented)
|
||||||
|
%This function saves the 32x32 focus stack patches of 5th, 21st, and 37th
|
||||||
|
%images of the stck FczdRGB, stote the 21st alone as BFczdRGB, and the
|
||||||
|
%features of the BFcsdRGB as BFcsdFeatRGB.
|
||||||
|
%
|
||||||
|
getWBCDataSet = true; getDstDataSet = true;
|
||||||
|
if (dustExclFrTrain)
|
||||||
|
svPath = 'CNNPatches\DntUseDst4NgPatc\';
|
||||||
|
else
|
||||||
|
svPath = 'CNNPatches\DoUseDst4NgPatc\';
|
||||||
|
end
|
||||||
|
if (alreadySegmented)
|
||||||
|
load ('CNNPatches\Segment\alreadySegImg');
|
||||||
|
load ('CNNPatches\Segment\alreadyWBCImg');
|
||||||
|
load ('CNNPatches\Segment\segIndxNames');
|
||||||
|
end
|
||||||
|
btchSz = 12000;
|
||||||
|
BasePath = ['E:\Gopakumar\GopakumarIISTDrive\Dataset\' ...
|
||||||
|
'4th IIST Visit\Mal01\Images\GndTruth\Separate\NewEasy\'];
|
||||||
|
fnames = dir([BasePath '\ImgsMinAcrsStckTwoCls\' Folder '\*B.jpg']);
|
||||||
|
FczStkPath = 'E:\Gopakumar\GopakumarIISTDrive\Dataset\Malaria\Patch32By32\DataSet32By32Color\Manual_But_Sel_Training\AllFcsStack\';
|
||||||
|
|
||||||
|
numfids = length(fnames); M = 32; N = 32; R = 1; Rad = 0.75*M;
|
||||||
|
dskMskPstv = strel('disk', Rad); dskMskDust = strel('disk', Rad);
|
||||||
|
posCnt = 0; negCnt = 0; negChnk = 1; prevVidIndx = '';
|
||||||
|
for K = 1:numfids
|
||||||
|
K
|
||||||
|
AbsFNme = [BasePath '\ImgsMinAcrsStckTwoCls\' Folder '\' fnames(K).name];
|
||||||
|
%Get details needed to acces the Ground Truth file
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
for i = 1:length(FileName); if (FileName(i) == '_'); vid = i-1; break; end; end;
|
||||||
|
for j = vid+2:length(FileName); if (FileName(j) == '_'); stck = j-1; break; end; end;
|
||||||
|
vidIndx = FileName(1:vid); stckIndx = FileName(vid+2:stck);
|
||||||
|
slideName = [vidIndx '_' stckIndx];
|
||||||
|
%Read the min RGB image
|
||||||
|
img = imread(AbsFNme); [SizeR, SizeC, ~] = size(img);
|
||||||
|
if(isTherWBC([vidIndx '_' stckIndx]))
|
||||||
|
if (~alreadySegmented)
|
||||||
|
[segmentedImg, segWithBndry, WBCs] = getSegmentation(img);
|
||||||
|
else
|
||||||
|
IndxPosSlctd = getSegmentedIndx([vidIndx '_' stckIndx], segIndxNames);
|
||||||
|
segmentedImg = alreadySegImg(:, :, IndxPosSlctd);
|
||||||
|
WBCs = alreadyWBCImg(:, :, IndxPosSlctd);
|
||||||
|
if (sum(WBCs(:) > 0))
|
||||||
|
thereIsWBC = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
WBCs = false(SizeR, SizeC);
|
||||||
|
thereIsWBC = false;
|
||||||
|
end
|
||||||
|
imF1 = im2single(imread([FczStkPath vidIndx '_' stckIndx '_5.jpg']));
|
||||||
|
imF = imread([FczStkPath vidIndx '_' stckIndx '_21.jpg']); imF2 = im2single(imF);
|
||||||
|
imF3 = im2single(imread([FczStkPath vidIndx '_' stckIndx '_37.jpg']));
|
||||||
|
imG(:, :, 1:3) = imF1; imG(:, :, 4:6) = imF2; imG(:, :, 7:9) = imF3;
|
||||||
|
% imG = 0;
|
||||||
|
% imG = img; %(:, :, 2);
|
||||||
|
% imG = im2single(imG);
|
||||||
|
[SzM, SzN, SzO] = size(imG);
|
||||||
|
%Get the positive patches
|
||||||
|
load ([BasePath 'GndTrth\' vidIndx '_' stckIndx]);
|
||||||
|
if (~strcmp(prevVidIndx, vidIndx));
|
||||||
|
prevVidIndx = vidIndx;
|
||||||
|
DstMsk = getDstLocnsFor(vidIndx);
|
||||||
|
end
|
||||||
|
|
||||||
|
load ([BasePath 'GndTrth\Dst_' vidIndx '_' stckIndx]);
|
||||||
|
[PlocR, PlocC] = find (Msk);
|
||||||
|
falseMsk = false(size(Msk));
|
||||||
|
mskdPstv = imdilate(Msk, dskMskPstv);
|
||||||
|
mskdDust = imdilate(DstMsk, dskMskDust);
|
||||||
|
|
||||||
|
regmin = getMySuspectedRegion(img);
|
||||||
|
if (thereIsWBC && getWBCDataSet)
|
||||||
|
WBCMsks = WBCs & regmin;
|
||||||
|
Cntrids = regionprops(WBCMsks, 'centroid');
|
||||||
|
[numWBCPts, ~] = size(Cntrids);
|
||||||
|
%Add any missed location
|
||||||
|
newIntstRegMn = ~WBCs & regmin;
|
||||||
|
mYR = imF(:, :, 1); mYG = imF(:, :, 2); mYB = imF(:, :, 3);
|
||||||
|
mYR(newIntstRegMn) = 255; mYG(newIntstRegMn) = 0; mYB(newIntstRegMn) = 0;
|
||||||
|
showIm(:, :, 1) = mYR; showIm(:, :, 2) = mYG; showIm(:, :, 3) = mYB;
|
||||||
|
imshow(showIm); [NC, NR, Btn] = ginput(1);
|
||||||
|
while(Btn ~= 3) %until right button is pressed
|
||||||
|
numWBCPts = numWBCPts + 1;
|
||||||
|
Cntrids(numWBCPts).Centroid = [NC NR];
|
||||||
|
[NC, NR, Btn] = ginput(1);
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1:numWBCPts
|
||||||
|
CCntrids = round(Cntrids(i).Centroid);
|
||||||
|
%For the time being, if there is a patch of the required size
|
||||||
|
%around the point, then only we are considering it.
|
||||||
|
minRw = CCntrids(2) - M/2; minCl = CCntrids(1) - N/2;
|
||||||
|
maxRw = CCntrids(2) + M/2-1; maxCl = CCntrids(1) + N/2-1;
|
||||||
|
if (minRw > 0 && minCl > 0 && maxRw <= SzM && maxCl <= SzN)
|
||||||
|
currPatch = imG(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
posCnt = posCnt + 1;
|
||||||
|
WBCStackFcsRGB(1:M, 1:N, 1:SzO, posCnt) = currPatch;
|
||||||
|
WBCBestFczdRGB(1:M, 1:N, 1:3, posCnt) = imG(minRw:maxRw, minCl:maxCl, 4:6);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = true;
|
||||||
|
[FeatSet, ~] = getMyFeatures(falseMsk, imF, slideName);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = false;
|
||||||
|
WBCBstFczdFeat(posCnt, :) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
thereIsWBC = false;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if (getDstDataSet)
|
||||||
|
Cntrids = regionprops(DstMsk, 'centroid');
|
||||||
|
[numDstPts, ~] = size(Cntrids);
|
||||||
|
|
||||||
|
for i = 1:numDstPts
|
||||||
|
CCntrids = round(Cntrids(i).Centroid);
|
||||||
|
%For the time being, if there is a patch of the required size
|
||||||
|
%around the point, then only we are considering it.
|
||||||
|
minRw = CCntrids(2) - M/2; minCl = CCntrids(1) - N/2;
|
||||||
|
maxRw = CCntrids(2) + M/2-1; maxCl = CCntrids(1) + N/2-1;
|
||||||
|
if (minRw > 0 && minCl > 0 && maxRw <= SzM && maxCl <= SzN)
|
||||||
|
currPatch = imG(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
posCnt = posCnt + 1;
|
||||||
|
DustStackFcsRGB(1:M, 1:N, 1:SzO, posCnt) = currPatch;
|
||||||
|
DustBestFczdRGB(1:M, 1:N, 1:3, posCnt) = imG(minRw:maxRw, minCl:maxCl, 4:6);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = true;
|
||||||
|
[FeatSet, ~] = getMyFeatures(falseMsk, imF, slideName);
|
||||||
|
falseMsk (minRw:maxRw, minCl:maxCl) = false;
|
||||||
|
DustBstFczdFeat(posCnt, :) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (getDstDataSet)
|
||||||
|
save ([svPath 'FczRGBDsStk_' Folder], 'DustStackFcsRGB');
|
||||||
|
save ([svPath 'BFczdRGBDsStk_' Folder], 'DustBestFczdRGB');
|
||||||
|
save ([svPath 'BFczdFeatRGBDsStk_' Folder], 'DustBstFczdFeat');
|
||||||
|
end
|
||||||
|
if (getWBCDataSet)
|
||||||
|
save ([svPath 'FczRGBWcStk_' Folder], 'WBCStackFcsRGB');
|
||||||
|
save ([svPath 'BFczdRGBWcStk_' Folder], 'WBCBestFczdRGB');
|
||||||
|
save ([svPath 'BFczdFeatRGBWcStk_' Folder], 'WBCBstFczdFeat');
|
||||||
|
end
|
||||||
|
|
||||||
|
% negtvStackFcsRGB = negtvStackFcsRGB(1:M, 1:N, 1:SzO, 1:negCnt); %+1:end) = [];
|
||||||
|
% negtvBestFczdRGB = negtvBestFczdRGB(1:M, 1:N, :, 1:negCnt);
|
||||||
|
% negtvBstFczdFeat = negtvBstFczdFeat(1:negCnt, :);
|
||||||
|
%
|
||||||
|
% save ([svPath 'FczRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvStackFcsRGB');
|
||||||
|
% save ([svPath 'BFczdRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBestFczdRGB');
|
||||||
|
% save ([svPath 'BFczdFeatRGBNgStk_' Folder '_' num2str(negChnk)], 'negtvBstFczdFeat');
|
||||||
|
end
|
||||||
|
function IndxPosSlctd = getSegmentedIndx(indxName, segIndxNames)
|
||||||
|
[~, numNames] = size(segIndxNames);
|
||||||
|
for i = 1:numNames
|
||||||
|
if (strcmp(indxName, segIndxNames(i).name))
|
||||||
|
IndxPosSlctd = i;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function stat = isTherWBC(fileName)
|
||||||
|
stat = false;
|
||||||
|
indx = {'1_9', '2_19', '3_3', '3_4', '4_8', '5_1', 'A_6', 'A_14', 'BB_3', 'BB_13', ...
|
||||||
|
'BB_14', 'C_15', 'C_16', 'D_13', 'E_2', 'EE_4', 'F_3', 'F_5', 'F_9', 'FF_6', ...
|
||||||
|
'GG_4', 'G_16', 'G_17', 'H_5', 'H_16', 'I_1', 'J_18', 'KK_9', 'L_6', ...
|
||||||
|
'O_8', 'P_12', 'P_13', 'S_16', 'T_12', 'V_8', 'V_9', 'W_8', 'W_18', 'X_11', ...
|
||||||
|
'X_13', 'Y_2', 'Z_11'};
|
||||||
|
[~, num] = size(indx);
|
||||||
|
for i = 1:num
|
||||||
|
if (strcmp(fileName, indx(i)))
|
||||||
|
stat = true;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function cDstLoc = getDstLocnsFor(vidIndx)
|
||||||
|
Path = 'E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Images\GndTruth\Separate\NewEasy\DstLocnsPgm\';
|
||||||
|
load ([Path 'DstLocByPGM']); cnt = 0;
|
||||||
|
vidIndxs = DstLocByPGM.vidIndx;
|
||||||
|
[~, numVidIndxs] = size(vidIndxs);
|
||||||
|
for i = 1:numVidIndxs
|
||||||
|
if (strcmp(vidIndx, vidIndxs(i).name))
|
||||||
|
cDstLoc = DstLocByPGM.DstLocByPgm(:, :, i);
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function susReg = getMySuspectedRegion(img)
|
||||||
|
MnSz = 900;
|
||||||
|
hsv = rgb2hsv(img);
|
||||||
|
vlue = hsv(:, :, 3);
|
||||||
|
stDsk = strel('disk', 7);
|
||||||
|
openimg = imopen(vlue, stDsk);
|
||||||
|
mask = imregionalmin(openimg);
|
||||||
|
%First Filtering Exclude all the Bgnd
|
||||||
|
susReg = (bwareaopen((vlue < graythresh(vlue)), MnSz)) & mask;
|
||||||
|
end
|
||||||
649
src/gopa kumar code/getSegmentation.m
Normal file
649
src/gopa kumar code/getSegmentation.m
Normal file
@@ -0,0 +1,649 @@
|
|||||||
|
function [segmentedImg, segWithBndry, WBCs, remSetGTh] = getSegmentation(currImgUint8)
|
||||||
|
% load 'imgUint8'; currImgUint8 = imgUint8;
|
||||||
|
%2.19 micrometer 15 pixels
|
||||||
|
%note that the overlapping ellipses overwrite the labels. Fr the
|
||||||
|
%time being OK. need to improve later
|
||||||
|
currImg = currImgUint8;
|
||||||
|
[clearSetLTh, clearSetGTh, remSetGTh] = getBinaryImage(im2double(currImg));
|
||||||
|
clearSetLTh = bwfill(clearSetLTh, 'holes'); clearSetGTh = bwfill(clearSetGTh, 'holes');
|
||||||
|
|
||||||
|
clsLThP = bwperim(clearSetLTh); clsGThP = bwperim(clearSetGTh); remGThP = bwperim(remSetGTh);
|
||||||
|
|
||||||
|
fnalSeg = clearSetLTh | clearSetGTh| remSetGTh;
|
||||||
|
fnalSeg(clsLThP | clsGThP | remGThP) = false;
|
||||||
|
%Move WBCs to clear set.
|
||||||
|
[WBCs, pbRBC, pbWBC, pbBGD] = getWBCs(im2double(currImg), fnalSeg);
|
||||||
|
WBCs = bwfill(WBCs, 'holes');
|
||||||
|
wbcP = bwperim(WBCs);
|
||||||
|
clearSet = clearSetLTh | clearSetGTh | WBCs;
|
||||||
|
clearSet(clsLThP | clsGThP | wbcP) = false;
|
||||||
|
remSetGTh(WBCs) = false;
|
||||||
|
remSetGTh = bwareaopen(remSetGTh, 500);
|
||||||
|
% [clustImg, elpseLbld, fitImg] = kMeansByGeoDesicAutomatic(remSetGTh);
|
||||||
|
|
||||||
|
[segLbld, elpseLbld, fitImg] = kMeansByGeoDesicCentrWatershed(currImgUint8, clearSet, remSetGTh);
|
||||||
|
%Now assign a lable starting next to maxLbl assigned to ellipses
|
||||||
|
maxLb = max(segLbld(:));
|
||||||
|
cmp = bwconncomp(clearSet);
|
||||||
|
currLb = maxLb; segmentedImg = segLbld;
|
||||||
|
for lblOfst = 1:cmp.NumObjects
|
||||||
|
currLb = currLb+1;
|
||||||
|
segmentedImg(cmp.PixelIdxList{lblOfst}) = currLb;
|
||||||
|
end
|
||||||
|
segmentedImg = uint8(segmentedImg);
|
||||||
|
remP = bwperim(segLbld);
|
||||||
|
%For Display Purpose
|
||||||
|
fnalPerm = wbcP | remP | clsLThP | clsGThP;
|
||||||
|
R = currImgUint8(:, :, 1); G = currImgUint8(:, :, 2); B = currImgUint8(:, :, 3);
|
||||||
|
R(fnalPerm) = 255; G(fnalPerm) = 0; B(fnalPerm) = 0;
|
||||||
|
segWithBndry (:, :, 1) = R; segWithBndry (:, :, 2) = G; segWithBndry (:, :, 3) = B;
|
||||||
|
%Believing that there is max 255 cells
|
||||||
|
end
|
||||||
|
|
||||||
|
function remSetGTh = closelyFilter(remSetGTh, im)
|
||||||
|
close all;
|
||||||
|
intstLoc = im .* remSetGTh;
|
||||||
|
im = im2double(im);
|
||||||
|
figure; imshow(remSetGTh);
|
||||||
|
loG = fspecial('log');
|
||||||
|
GF = imfilter(im, loG);
|
||||||
|
avgK = fspecial('average', 3);
|
||||||
|
meanIm = imfilter(GF, avgK);
|
||||||
|
figure; imshow(GF.*remSetGTh);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [clearSetLTh, clearSetGTh, remSetGTh] = getBinaryImage(im)
|
||||||
|
imG = im2double(im(:, :, 2)); Sz = 21;
|
||||||
|
msk = fspecial('gaussian', Sz, Sz/6); hlfSz = round(Sz/2);
|
||||||
|
avG1 = imfilter(imG, msk);
|
||||||
|
msk(1:hlfSz, 1:hlfSz) = rot90(msk(1:hlfSz, 1:hlfSz), 2);
|
||||||
|
msk(1:hlfSz, hlfSz+1:end) = rot90(msk(1:hlfSz, hlfSz+1:end), 2);
|
||||||
|
msk(hlfSz+1:end, 1:hlfSz) = rot90(msk(hlfSz+1:end, 1:hlfSz), 2);
|
||||||
|
msk(hlfSz+1:end, hlfSz+1:end) = rot90(msk(hlfSz+1:end, hlfSz+1:end), 2);
|
||||||
|
|
||||||
|
% msk(:, 1:8) = fliplr(msk(:, 1:8)); msk(:, 9:15) = fliplr(msk(:, 9:15));
|
||||||
|
%Lets find weighted Mean
|
||||||
|
avG2 = imfilter(imG, msk);
|
||||||
|
avGB(:, :, 1) = avG1; avGB(:, :, 2) = avG2;
|
||||||
|
avG = min(avGB, [], 3);
|
||||||
|
%if the avg Belongs to White region? Exclude : In effect (set at least 0.1 +
|
||||||
|
%0.01) thresh
|
||||||
|
avG(avG > 0.7) = 0.6;
|
||||||
|
fildLThImg = bwfill(bwareaopen(imG < (avG - 0.005), 200), 'holes'); %note that simple avg with 0.015 thresh gave good results 0.01
|
||||||
|
fildGThImg = lOtThresh(im);
|
||||||
|
[clearSetLTh, ~, remClsSet] = getClearSet(bwfill(fildLThImg, 'holes'));
|
||||||
|
remSetGTh = bwareaopen(bwmorph(~(clearSetLTh | remClsSet) & fildGThImg, 'open', 3), 500);
|
||||||
|
[clearSetGTh, remSetGTh, clsGth] = getClearSet(bwfill(remSetGTh, 'holes'));
|
||||||
|
remSetGTh = remSetGTh | bwmorph(clsGth, 'erode', 1) | bwmorph(remClsSet, 'erode', 1);
|
||||||
|
clearSet = clearSetLTh | clearSetGTh; clearSet(bwperim(bwmorph(clearSetGTh, 'dilate', 1))) = false;
|
||||||
|
end
|
||||||
|
|
||||||
|
function [WBCsActual, pbRBC, pbWBC, pbBGD] = getWBCs(imRGBDble, segImg)
|
||||||
|
form = makecform ('srgb2lab');
|
||||||
|
LAB = applycform(imRGBDble, form);
|
||||||
|
A = LAB(:, :, 2);
|
||||||
|
B = LAB(:, :, 3);
|
||||||
|
pbRBC = (exp(-0.5*((A - 14.6585).^2/10.1368))) .* (exp(-0.5*((B - -2.8583).^2/8.6485))); %((1/sqrt(2*pi*8.6485)) *
|
||||||
|
pbWBC = (exp(-0.5*((A - 28.4699).^2/106.8322))) .* (exp(-0.5*((B - -31.1815).^2/207.2493))); %((1/sqrt(2*pi*97.4714)) *
|
||||||
|
pbBGD = (exp(-0.5*((A - -6.6678).^2/3.3932))) .* (exp(-0.5*((B - 1.5055).^2/3.6731)));
|
||||||
|
RBCs = (pbRBC > pbWBC) & (pbRBC > pbBGD) & (pbRBC > 0.1);
|
||||||
|
WBCs = (pbWBC > pbRBC) & (pbWBC > pbBGD) & (pbWBC > 0.01);
|
||||||
|
%Take better RBCs
|
||||||
|
WBCsErde = bwareaopen(bwmorph(WBCs, 'erode', 3), 500);
|
||||||
|
[~, WBCsActual] = maskAllSharingObjects(segImg, WBCsErde); WBCsActual = bwfill(bwmorph(WBCsActual, 'dilate', 1), 'holes');
|
||||||
|
WBCsCand = bwfill(bwmorph(bwareaopen(bwmorph(WBCsActual & ~RBCs, 'erode', 3),200), 'dilate', 3), 'holes');
|
||||||
|
if (sum(WBCsCand(:)))
|
||||||
|
WBCsActual = ensureWBCs(imRGBDble, WBCsCand);
|
||||||
|
end
|
||||||
|
%If the solididty of this one identified is too small, probably it is
|
||||||
|
%an RBC infected by parasite
|
||||||
|
|
||||||
|
%Note that the WBC from pbWBC is much better than the WBC just found.
|
||||||
|
%except that it contain some RBC parts. This can be solved by taking out
|
||||||
|
%RBCs and masking out. Rather than masking in WBCs.
|
||||||
|
end
|
||||||
|
|
||||||
|
function WBCsActual = ensureWBCs(imRGBDble, WBCsCand)
|
||||||
|
regProps = regionprops(WBCsCand, {'PixelIdxList', 'Solidity'});
|
||||||
|
[numObj, ~] = size(regProps);
|
||||||
|
RC = imRGBDble(:, :, 1); GC = imRGBDble(:, :, 2); BC = imRGBDble(:, :, 3);
|
||||||
|
WBCsActual = WBCsCand; thresh = 100/255;
|
||||||
|
for i = 1:numObj
|
||||||
|
currObj = regProps(i).PixelIdxList;
|
||||||
|
%If heavily infected by parasite, there will be darker pixels
|
||||||
|
numPixBlack = sum((RC(currObj) < thresh) & (GC(currObj) < thresh) & (BC(currObj) < thresh));
|
||||||
|
if(numPixBlack > 10)
|
||||||
|
%Infected RBC
|
||||||
|
WBCsActual(currObj) = false;
|
||||||
|
elseif (regProps(i).Solidity < 0.75)
|
||||||
|
WBCsActual(currObj) = false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function [clearSet, remSet, remClseSet] = getClearSet(bwImg)
|
||||||
|
remSet = bwImg; clearSet = false(size(remSet)); remClseSet = clearSet;
|
||||||
|
cmps = regionprops(bwImg, {'PixelIdxList', 'Solidity', 'ConvexImage', 'BoundingBox', 'Eccentricity'});
|
||||||
|
[numObj, ~] = size(cmps);
|
||||||
|
lowThresh = 750; highThresh = 1750; maxThresh = 2200;
|
||||||
|
for i = 1:numObj
|
||||||
|
currObj = cmps(i).PixelIdxList;
|
||||||
|
objArea = length(currObj);
|
||||||
|
if (objArea >= highThresh && objArea < maxThresh)
|
||||||
|
Tlr = 0.1;
|
||||||
|
else
|
||||||
|
Tlr = 0;
|
||||||
|
end
|
||||||
|
if ((objArea > lowThresh && objArea < maxThresh))
|
||||||
|
if (cmps(i).Solidity > (0.85 + Tlr))
|
||||||
|
clearSet(currObj) = true;
|
||||||
|
remSet(currObj) = false;
|
||||||
|
elseif (cmps(i).Solidity > (0.85 + Tlr))
|
||||||
|
remClseSet (currObj) = true;
|
||||||
|
remSet(currObj) = false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ThImg = lOtThresh(im)
|
||||||
|
globTh = graythresh(im);
|
||||||
|
div = 2;
|
||||||
|
[SzM, SzN, SzO] = size(im);
|
||||||
|
if (SzO == 3)
|
||||||
|
im = rgb2gray(im); %im(:, :, 2);
|
||||||
|
end
|
||||||
|
im = im2double(im);
|
||||||
|
rOfst = round(SzM/div); cOfst = round(SzN/div);
|
||||||
|
ThImg = false(SzM, SzN);
|
||||||
|
for i = 1:div
|
||||||
|
startR = (i-1)*rOfst+1;
|
||||||
|
if (i == div)
|
||||||
|
endR = SzM;
|
||||||
|
else
|
||||||
|
endR = i*rOfst;
|
||||||
|
end
|
||||||
|
for j = 1:div
|
||||||
|
startC = (j-1)*cOfst+1;
|
||||||
|
if (j == div)
|
||||||
|
endC = SzN;
|
||||||
|
else
|
||||||
|
endC = j*cOfst;
|
||||||
|
end
|
||||||
|
divImg = im(startR:endR, startC:endC);
|
||||||
|
locTh = graythresh(divImg);
|
||||||
|
if (locTh > 1.1*globTh)
|
||||||
|
ThImg(startR:endR, startC:endC) = false(size(divImg)); %probably there is no cell here
|
||||||
|
else
|
||||||
|
ThImg(startR:endR, startC:endC) = divImg < (locTh + 0.01);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ThImg = bwareaopen(ThImg, 500); %bwfill(, 'holes');
|
||||||
|
% else
|
||||||
|
%
|
||||||
|
% end
|
||||||
|
end
|
||||||
|
function ClustImg = waterShedBasedOnGeoDesicDist(img)
|
||||||
|
ClustImg = [];
|
||||||
|
close all;
|
||||||
|
imb = img; %img(22:129, 393:525); %img; %
|
||||||
|
% imb = imb(20:35, 70:90);
|
||||||
|
imshow(imb);
|
||||||
|
% imb = true(7, 8); imb(1, 1:5) = false; imb(2, 3:4) = false; imb(3, 4) = false;
|
||||||
|
[SzR, SzC] = size(imb);
|
||||||
|
imagesc(imb); title('Click On rough Center Posns : To return, click right button'); C = []; R = [];
|
||||||
|
while (true)
|
||||||
|
[Cc, Rr, Btn] = ginput(1);
|
||||||
|
if (Btn ~= 1)
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
C = [C Cc]; R = [R Rr];
|
||||||
|
end
|
||||||
|
% C = [38 66 96]; R = [71 46 28];
|
||||||
|
C = round(C); R = round(R); numCells = length(C);
|
||||||
|
imbc = imb; imbc(R(1), C(1)) = 0; imbc(R(2), C(2)) = 0; imbc(R(3), C(3)) = 0;
|
||||||
|
imagesc(imbc);
|
||||||
|
|
||||||
|
[X, Y] = meshgrid(1:SzC, 1:SzR);
|
||||||
|
FlImg = true(size(imb));
|
||||||
|
figure;
|
||||||
|
|
||||||
|
% for i = 1:numCells
|
||||||
|
% CGD = bwdistgeodesic(imb, C(i), R(i), 'quasi-euclidean'); GD(:, :, i) = CGD;
|
||||||
|
% TED = bwdistgeodesic(FlImg, C(i), R(i), 'quasi-euclidean'); ED(:, :, i) = TED;
|
||||||
|
% CCD = CGD + abs(TED - CGD); CD(:, :, i) = CCD; %CGD+
|
||||||
|
% imagesc(CGD > TED); figure;
|
||||||
|
% end
|
||||||
|
%
|
||||||
|
% Cm = min(CD, [], 3);
|
||||||
|
Cm = bwdistgeodesic(imb, C, R, 'quasi-euclidean');
|
||||||
|
Cm(isnan(Cm)) = Inf;
|
||||||
|
lb = watershed(Cm);
|
||||||
|
figure; imshow(lb .* uint8(imb), []);
|
||||||
|
|
||||||
|
% DistU = D; DistU(isnan(D)) = Inf;
|
||||||
|
% Lbl = watershed(DistU);
|
||||||
|
% ClustImg = uint8(imb) .* uint8(Lbl);
|
||||||
|
% figure; imshow(ClustImg, []);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [ClustImg, elpseLbld, fitImg] = kMeansByGeoDesic(img)
|
||||||
|
% close all;
|
||||||
|
% imb = img(22:129, 393:525); %img; %img(182:228, 127:198); %
|
||||||
|
imb = img; %im2bw(imread('C:\Users\GGG\Desktop\b.jpg')); %
|
||||||
|
[SzR, SzC] = size(imb);
|
||||||
|
figure;
|
||||||
|
imshow(imb); title('Click On rough Center Posns : To return, click right button'); C = []; R = [];
|
||||||
|
while (true)
|
||||||
|
[Cc, Rr, Btn] = ginput(1);
|
||||||
|
if (Btn ~= 1)
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
C = [C Cc]; R = [R Rr];
|
||||||
|
end
|
||||||
|
C = round(C); R = round(R); numCells = length(C);
|
||||||
|
[X, Y] = meshgrid(1:SzC, 1:SzR);
|
||||||
|
MaxItrn = 4; FlImg = true(size(imb));
|
||||||
|
for itrn = 1:MaxItrn
|
||||||
|
for i = 1:numCells
|
||||||
|
CGD = bwdistgeodesic(imb, C(i), R(i), 'quasi-euclidean');
|
||||||
|
FGD = bwdistgeodesic(FlImg, C(i), R(i), 'quasi-euclidean');
|
||||||
|
GD(:, :, i) = CGD + abs(CGD - FGD).*(0.75*CGD);
|
||||||
|
end
|
||||||
|
%Assign to cluster
|
||||||
|
[~, lbl] = min(GD, [], 3);
|
||||||
|
Lbls = lbl.*imb;
|
||||||
|
% figure; imshow(Lbls, [])
|
||||||
|
%Update Centroid
|
||||||
|
for i = 1:numCells
|
||||||
|
cLbl = (Lbls == i);
|
||||||
|
C(i) = mean(X(cLbl)); R(i) = mean(Y(cLbl));
|
||||||
|
end
|
||||||
|
C = round(C); R = round(R);
|
||||||
|
end
|
||||||
|
ClustImg = Lbls;
|
||||||
|
|
||||||
|
[elpseLbld, fitImg] = improveSheds(Lbls, imb);
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function [ClustImg, elpseLbld, fitImg] = kMeansByGeoDesicAutomatic(bwImg)
|
||||||
|
%Clean my binary image. I.e., remove spurious projections
|
||||||
|
dsk = strel('disk', 5); bwImg = imdilate(imerode(bwImg, dsk), dsk);
|
||||||
|
ClustImg = false(size(bwImg)); elpseLbld = ClustImg; fitImg = ClustImg;
|
||||||
|
imb = bwImg; %im2bw(imread('C:\Users\GGG\Desktop\b.jpg')); %
|
||||||
|
[SzR, SzC] = size(imb);
|
||||||
|
% figure;
|
||||||
|
% imshow(imb); title('Click On rough Center Posns : To return, click right button'); C = []; R = [];
|
||||||
|
%Initialis the cluster centroids
|
||||||
|
[R, C] = initClutsreCentres(bwImg, 'distT');
|
||||||
|
load ('flDet'); flDet.remSet.R = R; flDet.remSet.C = C; save('flDet', 'flDet');
|
||||||
|
numCells = length(R);
|
||||||
|
if (numCells > 0)
|
||||||
|
[X, Y] = meshgrid(1:SzC, 1:SzR);
|
||||||
|
MaxItrn = 1; FlImg = true(size(imb));
|
||||||
|
for itrn = 1:MaxItrn
|
||||||
|
showTime = bwImg; showTime(sub2ind(size(bwImg), R,C)) = false; %figure; imshow(showTime); title('hi');
|
||||||
|
% itrn
|
||||||
|
imb = doTheSmallestClosing(imb, C, R, 'line');
|
||||||
|
for i = 1:numCells
|
||||||
|
% itrn
|
||||||
|
% [C R]
|
||||||
|
CGD = bwdistgeodesic(imb, C(i), R(i), 'quasi-euclidean');
|
||||||
|
% [C R]
|
||||||
|
FGD = bwdistgeodesic(FlImg, C(i), R(i), 'quasi-euclidean');
|
||||||
|
GD(:, :, i) = CGD + abs(CGD - FGD).*(0.75*CGD);
|
||||||
|
end
|
||||||
|
%Assign to cluster
|
||||||
|
[~, lbl] = min(GD, [], 3);
|
||||||
|
Lbls = lbl.*imb;
|
||||||
|
% figure; imshow(Lbls, [])
|
||||||
|
%Update Centroid
|
||||||
|
for i = 1:numCells
|
||||||
|
cLbl = (Lbls == i);
|
||||||
|
C(i) = mean(X(cLbl)); R(i) = mean(Y(cLbl));
|
||||||
|
end
|
||||||
|
C = round(C); R = round(R);
|
||||||
|
% if (sum(isnan(C)) > 0)
|
||||||
|
% hld = 1;
|
||||||
|
% end
|
||||||
|
end
|
||||||
|
imwrite(showTime, 'showTime.jpg');
|
||||||
|
|
||||||
|
ClustImg = Lbls;
|
||||||
|
[elpseLbld, fitImg] = improveSheds(Lbls, imb);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [SegLbld, elpseLbld, fitImg] = kMeansByGeoDesicCentrWatershed(imgUint8, clearSet, remSet)
|
||||||
|
%Clean my binary image. I.e., remove spurious projections
|
||||||
|
dsk = strel('disk', 5); remSet = imdilate(imerode(remSet, dsk), dsk);
|
||||||
|
[R, C] = initClutsreCentres(remSet, 'distT');
|
||||||
|
centRemSetRC = [R C];
|
||||||
|
SegLbld = markrBasedWshed(imgUint8, clearSet, remSet, centRemSetRC);
|
||||||
|
%repeat once again for those missed
|
||||||
|
SegLbldN = doASecondPass(imgUint8, SegLbld, clearSet, remSet);
|
||||||
|
%Make a single seg image
|
||||||
|
SegLbld = SegLbld + SegLbldN;
|
||||||
|
[elpseLbld, fitImg] = improveSheds(SegLbld, remSet);
|
||||||
|
end
|
||||||
|
|
||||||
|
function SegLbldN = doASecondPass(imgUint8, SegLbld, clearSet, remSet)
|
||||||
|
cmpLbl = 0; stDsk = strel('disk', 5);
|
||||||
|
firstPassSet = (SegLbld > 0);
|
||||||
|
clearSet = clearSet | firstPassSet;
|
||||||
|
remSet = remSet & ~firstPassSet;
|
||||||
|
%remove spurious projections
|
||||||
|
remSet = bwareaopen(imdilate(imerode(remSet, stDsk), stDsk), ceil(0.5*(41*41)));
|
||||||
|
[R, C] = initClutsreCentres(remSet, 'distT');
|
||||||
|
centRemSetRC = [R C];
|
||||||
|
SegLbldN = markrBasedWshed(imgUint8, clearSet, remSet, centRemSetRC);
|
||||||
|
%update the labels with respect to SegLbld
|
||||||
|
SegLbldN(SegLbldN > 0) = SegLbldN(SegLbldN > 0) + max(SegLbld(:));
|
||||||
|
end
|
||||||
|
function SegLbld = markrBasedWshed(img, clearSet, remSet, centRemSetRC)
|
||||||
|
%%Make our image where watershed is to be performed.
|
||||||
|
img = rgb2gray(img); remSetImg = img;
|
||||||
|
dilremSet = bwmorph(remSet, 'dilate');
|
||||||
|
remSetImg(~dilremSet) = 0;
|
||||||
|
remSetImg(clearSet) = 0;
|
||||||
|
%%
|
||||||
|
%%Select the watershed function. We use gradient
|
||||||
|
hy = fspecial('sobel'); hx = hy';
|
||||||
|
Iy = imfilter(double(remSetImg), hy, 'replicate');
|
||||||
|
Ix = imfilter(double(remSetImg), hx, 'replicate');
|
||||||
|
gradmag = sqrt(Ix.^2 + Iy.^2);
|
||||||
|
|
||||||
|
%%get the foreground markers
|
||||||
|
stdsk = strel('disk', 3);
|
||||||
|
centDil = false(size(remSet)); centDil(sub2ind(size(remSet), centRemSetRC(:, 1), centRemSetRC(:, 2))) = true;
|
||||||
|
fgm = imdilate(centDil, stdsk);
|
||||||
|
%%
|
||||||
|
%%get background markers
|
||||||
|
bw = remSet | clearSet;
|
||||||
|
D = bwdist(bw);
|
||||||
|
DL = watershed(D);
|
||||||
|
bgm = DL == 0;
|
||||||
|
%%
|
||||||
|
%%apply watershed
|
||||||
|
gradmagMdfd = imimposemin(gradmag, bgm | fgm);
|
||||||
|
L = watershed(gradmagMdfd);
|
||||||
|
% remSetImg(L == 0) = 0;
|
||||||
|
%%
|
||||||
|
%%Post processing, remove small extensions, merge adjacent small cells
|
||||||
|
SegLbld = postprocessing(L);
|
||||||
|
end
|
||||||
|
|
||||||
|
function SegLbld = postprocessing(L)
|
||||||
|
%Remove all components which are bigger & smaller compared to 41*41
|
||||||
|
cmpLbl = 0; stDsk = strel('disk', 3);
|
||||||
|
SegLbld = uint8(zeros(size(L)));
|
||||||
|
typArea = 41*41; maxArea = 1.5*typArea; minArea = 0.5*typArea;
|
||||||
|
numCmp = max(L(:));
|
||||||
|
for i = 1:numCmp
|
||||||
|
currCmp = (L == i); areaCmp = sum(currCmp(:));
|
||||||
|
if (areaCmp > minArea && areaCmp < maxArea)
|
||||||
|
cmpLbl = cmpLbl + 1;
|
||||||
|
%remove small extensions
|
||||||
|
% currCmp = bwmorph(currCmp, 'open', 5);
|
||||||
|
currCmp = bwareaopen(imdilate(imerode(currCmp, stDsk), stDsk), 100);
|
||||||
|
SegLbld(currCmp) = cmpLbl;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function imb = doTheSmallestClosing(imb, C, R, by)
|
||||||
|
[SzM, SzN] = size(imb);
|
||||||
|
len = length(C); baseIm = false(size(imb));
|
||||||
|
stDsk = strel('disk', 5);
|
||||||
|
for i = 1:len
|
||||||
|
if (imb(R(i), C(i)))
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
if (strcmp(by, 'line'))
|
||||||
|
len = 30; strt = floor(len/2);
|
||||||
|
lin000SL = -Inf; lin000EL = Inf;
|
||||||
|
lin045SL = -Inf; lin045EL = Inf;
|
||||||
|
lin090SL = -Inf; lin090EL = Inf;
|
||||||
|
lin135SL = -Inf; lin135EL = Inf;
|
||||||
|
|
||||||
|
cR = R(i); cC = C(i);
|
||||||
|
%for zero degree line
|
||||||
|
flag = false; for j = 0:-1:-1*strt; if ((cC+j < 1) || (cC + j > SzN)); flag = false; break; end; if (imb(cR, cC+j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin000SL = indx; end;
|
||||||
|
flag = false; for j = 0:1:strt; if ((cC+j < 1) || (cC + j > SzN)); flag = false; break; end; if (imb(cR, cC+j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin000EL = indx; end;
|
||||||
|
%for 90 degree line
|
||||||
|
flag = false; for j = 0:-1:-1*strt; if ((cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC) == false); indx = j; else; flag = true; break; end; end; if (flag); lin090SL = indx; end;
|
||||||
|
flag = false; for j = 0:1:strt; if ((cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC) == false); indx = j; else; flag = true; break; end; end; if (flag); lin090EL = indx; end;
|
||||||
|
%for 45 degree line
|
||||||
|
flag = false; for j = 0:-1:-1*strt; if ((cC-j < 1) || (cC - j > SzN) || (cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC-j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin045SL = indx; end;
|
||||||
|
flag = false; for j = 0:1:strt; if ((cC-j < 1) || (cC - j > SzN) || (cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC-j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin045EL = indx; end;
|
||||||
|
%for 135 degree line
|
||||||
|
flag = false; for j = 0:-1:-1*strt; if ((cC+j < 1) || (cC + j > SzN) || (cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC+j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin135SL = indx; end;
|
||||||
|
flag = false; for j = 0:1:strt; if ((cC+j < 1) || (cC + j > SzN) || (cR+j < 1) || (cR+j > SzM)); flag = false; break; end; if (imb(cR+j, cC+j) == false); indx = j; else; flag = true; break; end; end; if (flag); lin135EL = indx; end;
|
||||||
|
lngths = [lin000EL - lin000SL + 1; lin045EL - lin045SL + 1; lin090EL - lin090SL + 1; lin135EL - lin135SL + 1];
|
||||||
|
[minVl, pos] = min(lngths);
|
||||||
|
if (~isfinite(minVl))
|
||||||
|
imb(cR, cC) = true;
|
||||||
|
else
|
||||||
|
if (pos == 1)
|
||||||
|
%0 degree qualified
|
||||||
|
imb(cR, cC+lin000SL:cC+lin000EL) = true;
|
||||||
|
elseif (pos == 2)
|
||||||
|
%45 degree qualified
|
||||||
|
% imb(cR+lin045SL:cR+lin045EL, cC+lin045SL:cC+lin045EL) = true;
|
||||||
|
for k = lin045SL:lin045EL
|
||||||
|
imb(cR+k, cC - k) = true;
|
||||||
|
end
|
||||||
|
elseif (pos == 3)
|
||||||
|
%90 degree qualified
|
||||||
|
imb(cR+lin090SL:cR+lin090EL, cC) = true;
|
||||||
|
else
|
||||||
|
%135 dgree qualified
|
||||||
|
% imb(cR+lin135SL:cR+lin135EL, cC+lin135SL:cC+lin135EL) = true;
|
||||||
|
for k = lin135SL:lin135EL
|
||||||
|
imb(cR+k, cC + k) = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
imb = bwfill(imb, 'holes');
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif (strcmp(by, 'disk'))
|
||||||
|
tmpIm = baseIm; tmpIm(R(i), C(i)) = true;
|
||||||
|
while(true)
|
||||||
|
tmpIm = imdilate(tmpIm,stDsk);
|
||||||
|
stat = (tmpIm & imb);
|
||||||
|
if (sum(stat(:)) > 0)
|
||||||
|
imb = imb | tmpIm;
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
imb = bwfill(imb, 'holes');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
function [R, C] = initClutsreCentres(bwImg, Method)
|
||||||
|
R = []; C = []; flseIm = false(size(bwImg));
|
||||||
|
if (strcmp(Method, 'manual'))
|
||||||
|
while (true)
|
||||||
|
[Cc, Rr, Btn] = ginput(1);
|
||||||
|
if (Btn ~= 1)
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
C = [C; Cc]; R = [R; Rr];
|
||||||
|
end
|
||||||
|
C = round(C); R = round(R); numCells = length(C);
|
||||||
|
elseif (strcmp(Method, 'random'))
|
||||||
|
lbls = bwlabel(bwImg);
|
||||||
|
cellArea = 37*37;
|
||||||
|
numObj = max(lbls(:));
|
||||||
|
for i = 1:numObj
|
||||||
|
[Rs, Cs] = find(lbls == i);
|
||||||
|
objArea = length(Rs);
|
||||||
|
numCells = max(round(objArea/cellArea), 1); %We set 0.2 (500/(40*40))
|
||||||
|
% numCells = 9;
|
||||||
|
slctdIndx = randperm(objArea, numCells);
|
||||||
|
R = [R; Rs(slctdIndx)];
|
||||||
|
C = [C; Cs(slctdIndx)];
|
||||||
|
end
|
||||||
|
elseif (strcmp(Method, 'distT'))
|
||||||
|
distTImg = bwdist(~bwImg); Radius = 12;
|
||||||
|
[KeyPoints, Rows, Cols] = doNonMaximaSuppression(distTImg, Radius);
|
||||||
|
KeyPoints = KeyPoints & bwImg;
|
||||||
|
Centroids = getCentroids(KeyPoints);
|
||||||
|
initKPImg = flseIm; indxKP = sub2ind(size(bwImg), Centroids(2, :), Centroids(1, :));
|
||||||
|
initKPImg(indxKP) = true;
|
||||||
|
fnalKPImg = confirmCentroids(bwImg, initKPImg, Radius);
|
||||||
|
[R, C] = find(fnalKPImg);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function Centroids = getCentroids(KeyPoints)
|
||||||
|
Centroids = [];
|
||||||
|
propsCent = regionprops(KeyPoints, 'centroid');
|
||||||
|
[numCmp, ~] = size(propsCent);
|
||||||
|
dp = [Centroids; propsCent.Centroid];
|
||||||
|
Centroids = round(reshape(dp, 2, numCmp));
|
||||||
|
end
|
||||||
|
function fnalKPImg = confirmCentroids(bwImg, initKPImg, Radius)
|
||||||
|
fnalKPImg = initKPImg;
|
||||||
|
typcalArea = 41*41; Radius = 0.75*Radius;
|
||||||
|
diskSt = strel('disk', Radius);
|
||||||
|
falseIm = false(size(bwImg));
|
||||||
|
cmps = bwconncomp(bwImg);
|
||||||
|
numSeg = cmps.NumObjects;
|
||||||
|
for i = 1:numSeg
|
||||||
|
pxls = cmps.PixelIdxList{i};
|
||||||
|
cArea = length(pxls);
|
||||||
|
cSeg = falseIm; cSeg(pxls) = true;
|
||||||
|
cCentr = cSeg & initKPImg;
|
||||||
|
numClsExpctd = max(round(cArea/typcalArea), 1);
|
||||||
|
numClsIdntfd = sum(cCentr(:));
|
||||||
|
if (numClsExpctd > 1)
|
||||||
|
TBIdntfd = numClsExpctd - numClsIdntfd;
|
||||||
|
if (TBIdntfd > 0)
|
||||||
|
cCentrD = imdilate(cCentr, diskSt);
|
||||||
|
distImage = bwdist(~(~cCentrD & cSeg));
|
||||||
|
[KeyPoints, Rows, Cols] = doNonMaximaSuppression(distImage, Radius);
|
||||||
|
Centroids = getCentroids(KeyPoints);
|
||||||
|
indxKP = sub2ind(size(bwImg), Centroids(2, :), Centroids(1, :));
|
||||||
|
[distnCs, posns] = sort(distImage(indxKP), 'descend');
|
||||||
|
TBIdntfd = min(TBIdntfd, length(posns));
|
||||||
|
indxUpdtd = indxKP(posns(1:TBIdntfd));
|
||||||
|
fnalKPImg(indxUpdtd) = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function applyMarkrBasedWatershed(img, ROIntst, foreGnd, backGnd)
|
||||||
|
|
||||||
|
end
|
||||||
|
function ClustImg = waterShedBasedOnGeoDesicDistNew(img)
|
||||||
|
ClustImg = [];
|
||||||
|
close all;
|
||||||
|
imb = img; %img(22:129, 393:525); %img; %
|
||||||
|
imshow(imb);
|
||||||
|
[SzR, SzC] = size(imb);
|
||||||
|
imagesc(imb); title('Click On rough Center Posns : To return, click right button'); C = []; R = [];
|
||||||
|
while (true)
|
||||||
|
[Cc, Rr, Btn] = ginput(1);
|
||||||
|
if (Btn ~= 1)
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
C = [C Cc]; R = [R Rr];
|
||||||
|
end
|
||||||
|
C = round(C); R = round(R); numCells = length(C);
|
||||||
|
imbc = imb; imbc(R(1), C(1)) = 0; imbc(R(2), C(2)) = 0; imbc(R(3), C(3)) = 0;
|
||||||
|
imagesc(imbc);
|
||||||
|
|
||||||
|
[X, Y] = meshgrid(1:SzC, 1:SzR);
|
||||||
|
FlImg = true(size(imb));
|
||||||
|
figure;
|
||||||
|
Cm = bwdistgeodesic(imb, C, R, 'quasi-euclidean');
|
||||||
|
Cm(isnan(Cm)) = Inf;
|
||||||
|
lb = watershed(Cm);
|
||||||
|
figure; imshow(lb .* uint8(imb), []);
|
||||||
|
figure; imshow(lb == 0);
|
||||||
|
fnlLbl = improveSheds(lb, imb)
|
||||||
|
end
|
||||||
|
|
||||||
|
function [elpseLbld, fitImg] = improveSheds(Lbls, img)
|
||||||
|
numCells = max(Lbls(:));
|
||||||
|
[SzR, SzC] = size(img);
|
||||||
|
[X, Y] = meshgrid(1:SzC, 1:SzR);
|
||||||
|
FnalImg = img;
|
||||||
|
for i = 1:numCells
|
||||||
|
cBin = (Lbls == i);
|
||||||
|
% figure; imshow(cBin);
|
||||||
|
FnalImg(bwperim(cBin)) = false;
|
||||||
|
%Compute Major and Minor Axis of this
|
||||||
|
end
|
||||||
|
props = regionprops(FnalImg, {'MajorAxisLength', ...
|
||||||
|
'MinorAxisLength', 'Orientation', 'Centroid'});
|
||||||
|
[elpseLbld, fitImg] = getTheEllipses(props, img);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [ellipses, fitImg] = getTheEllipses(props, img)
|
||||||
|
close all;
|
||||||
|
% imshow(img);
|
||||||
|
[MxR, MxC] = size(img);
|
||||||
|
[numEllpse, ~] = size(props);
|
||||||
|
falsEImg = false(size(img));
|
||||||
|
ellipses = zeros(size(img));
|
||||||
|
for i = 1:numEllpse
|
||||||
|
CCC = props(i).Centroid(1); CCR = props(i).Centroid(2);
|
||||||
|
CMJ = round(props(i).MajorAxisLength);
|
||||||
|
CMN = round(props(i).MinorAxisLength);
|
||||||
|
CON = props(i).Orientation;
|
||||||
|
%[X, Y] = meshgrid(1:CMN, 1:CMJ);
|
||||||
|
|
||||||
|
if (abs(CON) >= 45)
|
||||||
|
X = repmat(-CMN/2:CMN/(CMN-1):CMN/2, CMJ, 1);
|
||||||
|
Y = repmat((-CMJ/2:CMJ/(CMJ-1):CMJ/2)', 1, CMN);
|
||||||
|
a = CMJ/2; b = CMN/2;
|
||||||
|
%vertical eelipse
|
||||||
|
el = (Y/a).^2 + (X/b).^2 < 1;
|
||||||
|
else
|
||||||
|
Y = repmat(-CMN/2:CMN/(CMN-1):CMN/2, CMJ, 1);
|
||||||
|
X = repmat((-CMJ/2:CMJ/(CMJ-1):CMJ/2)', 1, CMN);
|
||||||
|
a = CMJ/2; b = CMN/2;
|
||||||
|
el = (X/a).^2 + (Y/b).^2 < 1;
|
||||||
|
end
|
||||||
|
% imshow(el);
|
||||||
|
rotImg = imrotate(el, CON+90);
|
||||||
|
% imshow(rotImg);
|
||||||
|
%placeAtCentroid
|
||||||
|
[NSr, NSc] = size(rotImg);
|
||||||
|
%This is the minimum sampling. Mke it higher
|
||||||
|
CX = repmat(-NSc/2:NSc/(NSc-1):NSc/2, NSr, 1);
|
||||||
|
CY = repmat((-NSr/2:NSr/(NSr-1):NSr/2)', 1, NSc);
|
||||||
|
|
||||||
|
CIX = CX(rotImg); CIY = CY(rotImg);
|
||||||
|
CIXs = round(CIX + CCC); CIYs = round(CIY + CCR);
|
||||||
|
outSub = ((CIYs > MxR) | (CIXs > MxC) | (CIYs < 1) | (CIXs < 1));
|
||||||
|
CIYs(outSub) = []; CIXs(outSub) = [];
|
||||||
|
indX = sub2ind(size(falsEImg), CIYs, CIXs);
|
||||||
|
falsEImg(indX) = true;
|
||||||
|
ellipses(indX) = i;
|
||||||
|
end
|
||||||
|
ellipses = medfilt2(ellipses);
|
||||||
|
fitImg = ellipses > 0;
|
||||||
|
end
|
||||||
|
function [remMsk, Mskd] = maskAllSharingObjects(BaseImg, ShareObjs)
|
||||||
|
ToBMaskd = BaseImg & ShareObjs;
|
||||||
|
LblsFrmBase = bwlabel(BaseImg);
|
||||||
|
Mskd = false(size(BaseImg));
|
||||||
|
lbls2BMaskd = LblsFrmBase(ToBMaskd);
|
||||||
|
unqLbls = unique(lbls2BMaskd(:));
|
||||||
|
for lbl = 1:length(unqLbls)
|
||||||
|
Mskd(LblsFrmBase == (unqLbls(lbl))) = true;
|
||||||
|
end
|
||||||
|
remMsk = BaseImg & ~Mskd;
|
||||||
|
end
|
||||||
|
function [KeyPoints, Rows, Cols] = doNonMaximaSuppression(distImage, Radius)
|
||||||
|
Threshold = Radius;
|
||||||
|
SizeOfMask = 2*Radius+1; % Size of mask.
|
||||||
|
Max = ordfilt2(distImage,SizeOfMask^2,ones(SizeOfMask)); % Grey-scale dilate.
|
||||||
|
KeyPoints = (distImage == Max)&(distImage > Threshold); % Find maxima.
|
||||||
|
[Rows, Cols] = find(KeyPoints);
|
||||||
|
end
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
function net = initializeCharacterCNNBNNEx6ColorFczRGB()
|
||||||
|
|
||||||
|
f=1/100 ;
|
||||||
|
net.layers = {} ;
|
||||||
|
net.layers{end+1} = struct('type', 'conv', ...
|
||||||
|
'filters', f*randn(5,5,9,20, 'single'), ...
|
||||||
|
'biases', zeros(1, 20, 'single'), ...
|
||||||
|
'stride', 1, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'relu') ;
|
||||||
|
net.layers{end+1} = struct('type', 'pool', ...
|
||||||
|
'method', 'max', ...
|
||||||
|
'pool', [2 2], ...
|
||||||
|
'stride', 2, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'conv', ...
|
||||||
|
'filters', f*randn(5,5,20,50, 'single'),...
|
||||||
|
'biases', zeros(1,50,'single'), ...
|
||||||
|
'stride', 1, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'pool', ...
|
||||||
|
'method', 'max', ...
|
||||||
|
'pool', [2 2], ...
|
||||||
|
'stride', 2, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'conv', ...
|
||||||
|
'filters', f*randn(4,4,50,500, 'single'),...
|
||||||
|
'biases', zeros(1,500,'single'), ...
|
||||||
|
'stride', 1, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'relu') ;
|
||||||
|
net.layers{end+1} = struct('type', 'conv', ...
|
||||||
|
'filters', f*randn(2,2,500,2, 'single'),...
|
||||||
|
'biases', zeros(1,2,'single'), ...
|
||||||
|
'stride', 1, ...
|
||||||
|
'pad', 0) ;
|
||||||
|
net.layers{end+1} = struct('type', 'softmaxloss') ;
|
||||||
310
src/gopa kumar code/makeDataSetForTrainingBest.m
Normal file
310
src/gopa kumar code/makeDataSetForTrainingBest.m
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
function makeDataSetForTrainingBest()
|
||||||
|
clear all; clc; close all;
|
||||||
|
params.PstvTnVnTtRaio = [60 20 20];
|
||||||
|
params.DatasetLoc = 'CNNPatches\AllDataSet\';
|
||||||
|
params.typeStrt = 1; params.typeEnd = 2;
|
||||||
|
params.wbc = true;
|
||||||
|
params.dst = false;
|
||||||
|
params.ngtvProp = 0.8;
|
||||||
|
params.wbcProp = 0.2;
|
||||||
|
params.dstProp = 0;
|
||||||
|
|
||||||
|
if (params.wbc)
|
||||||
|
if (params.dst)
|
||||||
|
params.DatasetSve = 'CNNPatches\WithDstWBC\';
|
||||||
|
else
|
||||||
|
params.DatasetSve = 'CNNPatches\WithWBCNoDst\';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if (params.dst)
|
||||||
|
params.DatasetSve = 'CNNPatches\WithDstNoWBC\';
|
||||||
|
else
|
||||||
|
params.DatasetSve = 'CNNPatches\WithOutDstWBC\';
|
||||||
|
end
|
||||||
|
end
|
||||||
|
params.isForCNN = true; params.cpy = false;
|
||||||
|
IdString = 'FczRGB'; makeDataSetCNNTrain(IdString, params);
|
||||||
|
display('First Pass');
|
||||||
|
params.isForCNN = true; params.cpy = true; params.cpyString = 'FczRGB';
|
||||||
|
IdString = 'BFczdRGB'; makeDataSetCNNTrain(IdString, params);
|
||||||
|
display('Second Pass');
|
||||||
|
params.isForCNN = false; params.cpy = true; params.cpyString = 'FczRGB';
|
||||||
|
IdString = 'BFczdFeatRGB'; makeDataSetCNNTrain(IdString, params);
|
||||||
|
display('Third Pass');
|
||||||
|
end
|
||||||
|
function makeDataSetCNNTrain(IdString, params)
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ps*Type1*.mat']);
|
||||||
|
numPstvStk(1) = length(fnames);
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ps*Type2*.mat']);
|
||||||
|
numPstvStk(2) = length(fnames);
|
||||||
|
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ng*Type1*.mat']);
|
||||||
|
numNgtvStk(1) = length(fnames);
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ng*Type2*.mat']);
|
||||||
|
numNgtvStk(2) = length(fnames);
|
||||||
|
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Wc*Type1*.mat']);
|
||||||
|
numWbcStk(1) = length(fnames);
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Wc*Type2*.mat']);
|
||||||
|
numWbcStk(2) = length(fnames);
|
||||||
|
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ds*Type1*.mat']);
|
||||||
|
numDstStk(1) = length(fnames);
|
||||||
|
fnames = dir([params.DatasetLoc IdString 'Ds*Type2*.mat']);
|
||||||
|
numDstStk(2) = length(fnames);
|
||||||
|
|
||||||
|
%Process positive stack
|
||||||
|
numPstvImgs = 0;
|
||||||
|
for i = params.typeStrt:params.typeEnd
|
||||||
|
load ([params.DatasetLoc IdString 'PsStk_' 'Type' num2str(i)]);
|
||||||
|
if (params.isForCNN)
|
||||||
|
ptvStack = augmentDataSetByRotation(postvStack);
|
||||||
|
[~, ~, ~, cPstvCnt] = size(ptvStack);
|
||||||
|
POSTVSTACK(:, :, :, numPstvImgs+1: numPstvImgs+cPstvCnt) = ptvStack;
|
||||||
|
else
|
||||||
|
ptvStack = augmentDataSetSimply(postvStack);
|
||||||
|
[cPstvCnt, ~] = size(ptvStack);
|
||||||
|
POSTVSTACK(numPstvImgs+1: numPstvImgs+cPstvCnt, :) = ptvStack;
|
||||||
|
end
|
||||||
|
numPstvImgs = numPstvImgs+cPstvCnt;
|
||||||
|
end
|
||||||
|
clear ptvStack; clear postvStack;
|
||||||
|
|
||||||
|
PstvTrain = params.PstvTnVnTtRaio(1);
|
||||||
|
PstvValdn = params.PstvTnVnTtRaio(2);
|
||||||
|
PstvTest = params.PstvTnVnTtRaio(3);
|
||||||
|
numSamPTn = round(numPstvImgs*PstvTrain/100);
|
||||||
|
numSamPVn = round(numPstvImgs*PstvValdn/100);
|
||||||
|
numSamPTt = numPstvImgs - (numSamPTn + numSamPVn);
|
||||||
|
PtvTnVnTt = [PstvTrain PstvValdn PstvTest];
|
||||||
|
|
||||||
|
%negative can be many and hence read in batches
|
||||||
|
numNgtvImgs = 0;
|
||||||
|
for i = params.typeStrt:params.typeEnd
|
||||||
|
for j = 1:numNgtvStk(i)
|
||||||
|
load ([params.DatasetLoc IdString 'NgStk_' 'Type' num2str(i) '_' num2str(j)]);
|
||||||
|
if (params.isForCNN)
|
||||||
|
[~, ~, ~, currNcnt] = size(negtvStack);
|
||||||
|
else
|
||||||
|
[currNcnt, ~] = size(negtvStack);
|
||||||
|
end
|
||||||
|
numNgtvImgs = numNgtvImgs + currNcnt;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
numSamNTn = round(numSamPTn * params.ngtvProp);
|
||||||
|
numSamNVn = round(numSamPVn * params.ngtvProp);
|
||||||
|
numSamNTt = numNgtvImgs - (numSamNTn + numSamNVn);
|
||||||
|
NgtvTrain = (numSamNTn/numNgtvImgs)*100;
|
||||||
|
NgtvVlidn = (numSamNVn/numNgtvImgs)*100;
|
||||||
|
NgtvTest = 100 - (NgtvTrain + NgtvVlidn);
|
||||||
|
NtvTnVnTt = [NgtvTrain NgtvVlidn NgtvTest];
|
||||||
|
|
||||||
|
|
||||||
|
if (params.wbc)
|
||||||
|
numWbcImgs = 0;
|
||||||
|
for i = params.typeStrt:params.typeEnd
|
||||||
|
load ([params.DatasetLoc IdString 'WcStk_' 'Type' num2str(i)]);
|
||||||
|
if (params.isForCNN)
|
||||||
|
[~, ~, ~, cWbcCnt] = size(wbcStack);
|
||||||
|
WBCSTACK(:, :, :, numWbcImgs+1: numWbcImgs+cWbcCnt) = wbcStack;
|
||||||
|
else
|
||||||
|
[cWbcCnt, ~] = size(wbcStack);
|
||||||
|
WBCSTACK(numWbcImgs+1: numWbcImgs+cWbcCnt, :) = wbcStack;
|
||||||
|
end
|
||||||
|
numWbcImgs = numWbcImgs+cWbcCnt;
|
||||||
|
end
|
||||||
|
clear wbcStack;
|
||||||
|
|
||||||
|
numSamWTn = round(numSamPTn * params.wbcProp);
|
||||||
|
numSamWVn = round(numSamPVn * params.wbcProp);
|
||||||
|
numSamWTt = numNgtvImgs - (numSamWTn + numSamWVn);
|
||||||
|
WbcTrain = (numSamWTn/numWbcImgs)*100;
|
||||||
|
WbcVlidn = (numSamWVn/numWbcImgs)*100;
|
||||||
|
WbcTest = 100 - (WbcTrain + WbcVlidn);
|
||||||
|
WbcTnVnTt = [WbcTrain WbcVlidn WbcTest];
|
||||||
|
else
|
||||||
|
WBCSTACK = []; numWbcImgs = 0;
|
||||||
|
numSamWTn = 0; numSamWVn = 0; numSamWTt = 0;
|
||||||
|
WbcTnVnTt = [0 0 0];
|
||||||
|
end
|
||||||
|
|
||||||
|
if (params.dst)
|
||||||
|
numDstImgs = 0;
|
||||||
|
for i = params.typeStrt:params.typeEnd
|
||||||
|
load ([params.DatasetLoc IdString 'DsStk_' 'Type' num2str(i)]);
|
||||||
|
if (params.isForCNN)
|
||||||
|
[~, ~, ~, cDstCnt] = size(dustStack);
|
||||||
|
DUSTSTACK(:, :, :, numDstImgs+1: numDstImgs + cDstCnt) = dustStack;
|
||||||
|
else
|
||||||
|
[cDstCnt, ~] = size(dustStack);
|
||||||
|
DUSTSTACK(numDstImgs+1: numDstImgs + cDstCnt, :) = dustStack;
|
||||||
|
end
|
||||||
|
numDstImgs = numDstImgs+cDstCnt;
|
||||||
|
end
|
||||||
|
clear dustStack;
|
||||||
|
|
||||||
|
numSamDTn = round(numSamPTn * params.dstProp);
|
||||||
|
numSamDVn = round(numSamPVn * params.dstProp);
|
||||||
|
numSamDTt = numDstImgs - (numSamDTn + numSamDVn);
|
||||||
|
DstTrain = (numSamDTn/numDstImgs)*100;
|
||||||
|
DstVlidn = (numSamDVn/numDstImgs)*100;
|
||||||
|
DstTest = 100 - (DstTrain + DstVlidn);
|
||||||
|
DstTnVnTt = [DstTrain DstVlidn DstTest];
|
||||||
|
else
|
||||||
|
DUSTSTACK = []; numDstImgs = 0;
|
||||||
|
numSamDTn = 0; numSamDVn = 0; numSamDTt = 0;
|
||||||
|
DstTnVnTt = [0 0 0];
|
||||||
|
end
|
||||||
|
|
||||||
|
%Create a full Databas clear all
|
||||||
|
if (~(params.cpy))
|
||||||
|
FullImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
FullImdb.meta.sets = {'train', 'val', 'test'};
|
||||||
|
FullImdb.meta.infn = ['Patches Cells : ' IdString];
|
||||||
|
FullImdb.images.id = 1:(numPstvImgs+numNgtvImgs+numWbcImgs+numDstImgs);
|
||||||
|
%Not Storing the data as it is huge. May be difficult to load
|
||||||
|
FullImdb.images.label = [ones(1, numPstvImgs) 2*ones(1, numNgtvImgs+numWbcImgs+numDstImgs)];
|
||||||
|
%Identify and store the train, validn and Test indexes
|
||||||
|
|
||||||
|
pstvSplit = divideDataInRatio(numPstvImgs, PtvTnVnTt);
|
||||||
|
ngtvSplit = divideDataInRatio(numNgtvImgs, NtvTnVnTt);
|
||||||
|
wbcSplit = divideDataInRatio(numWbcImgs, WbcTnVnTt);
|
||||||
|
dstSplit = divideDataInRatio(numDstImgs, DstTnVnTt);
|
||||||
|
|
||||||
|
FullImdb.images.set = [pstvSplit ngtvSplit wbcSplit dstSplit];
|
||||||
|
save([params.DatasetSve IdString '_FullImdb'], 'FullImdb');
|
||||||
|
else
|
||||||
|
load ([params.DatasetSve params.cpyString '_FullImdb'], 'FullImdb');
|
||||||
|
end
|
||||||
|
|
||||||
|
%Select dataset for training
|
||||||
|
FllLbl = FullImdb.images.label;
|
||||||
|
lbelCatgry = FullImdb.images.set;
|
||||||
|
slectdFrTraining = (lbelCatgry == 1) | (lbelCatgry == 2);
|
||||||
|
|
||||||
|
MalImdb.meta.classes = 'Malaria,Healthy';
|
||||||
|
MalImdb.meta.sets = {'train', 'val'};
|
||||||
|
MalImdb.images.id = 1:sum(slectdFrTraining);
|
||||||
|
MalImdb.images.label = FllLbl(slectdFrTraining);
|
||||||
|
MalImdb.images.set = lbelCatgry(slectdFrTraining);
|
||||||
|
|
||||||
|
pstvTrainRegion = slectdFrTraining(1:numPstvImgs);
|
||||||
|
if (params.isForCNN)
|
||||||
|
pstVDataSlctd = POSTVSTACK(:, :, :, pstvTrainRegion); %we did not clear the positive set
|
||||||
|
[~, ~, ~, cntPstvTnSlctd] = size(pstVDataSlctd);
|
||||||
|
else
|
||||||
|
pstVDataSlctd = POSTVSTACK(pstvTrainRegion, :); %we did not clear the positive set
|
||||||
|
[cntPstvTnSlctd, ~] = size(pstVDataSlctd);
|
||||||
|
end
|
||||||
|
|
||||||
|
nextStart = 1+numPstvImgs;
|
||||||
|
NgStart = 1;
|
||||||
|
for i = params.typeStrt:params.typeEnd
|
||||||
|
for j = 1:numNgtvStk(i)
|
||||||
|
load ([params.DatasetLoc IdString 'NgStk_' 'Type' num2str(i) '_' num2str(j)]);
|
||||||
|
if (params.isForCNN)
|
||||||
|
[~, ~, ~, currNcnt] = size(negtvStack);
|
||||||
|
else
|
||||||
|
[currNcnt, ~] = size(negtvStack);
|
||||||
|
end
|
||||||
|
|
||||||
|
ngtvTrainRegion = slectdFrTraining(nextStart:nextStart-1+currNcnt);
|
||||||
|
nextStart = nextStart+currNcnt;
|
||||||
|
currSegmntNgtvs = sum(ngtvTrainRegion);
|
||||||
|
NgEnd = NgStart-1+currSegmntNgtvs;
|
||||||
|
if (params.isForCNN)
|
||||||
|
ngtVDataSlctd(:, :, :, NgStart:NgEnd) = negtvStack(:, :, :, ngtvTrainRegion);
|
||||||
|
else
|
||||||
|
ngtVDataSlctd(NgStart:NgEnd, :) = negtvStack(ngtvTrainRegion, :);
|
||||||
|
end
|
||||||
|
NgStart = NgEnd+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (params.isForCNN)
|
||||||
|
[~, ~, ~, cntNgtvTnSlctd] = size(ngtVDataSlctd);
|
||||||
|
else
|
||||||
|
[cntNgtvTnSlctd, ~] = size(ngtVDataSlctd);
|
||||||
|
end
|
||||||
|
|
||||||
|
%Now select WBC data
|
||||||
|
nextStart = 1+numPstvImgs+numNgtvImgs;
|
||||||
|
wbcTrainRegion = slectdFrTraining(nextStart:nextStart-1+numWbcImgs);
|
||||||
|
if (params.isForCNN)
|
||||||
|
wbcDataSlctd = WBCSTACK(:, :, :, wbcTrainRegion);
|
||||||
|
[~, ~, ~, cntWbcTnSlctd] = size(wbcDataSlctd);
|
||||||
|
else
|
||||||
|
wbcDataSlctd = WBCSTACK(wbcTrainRegion, :);
|
||||||
|
[cntWbcTnSlctd, ~] = size(wbcDataSlctd);
|
||||||
|
end
|
||||||
|
|
||||||
|
%Now select Dst data
|
||||||
|
nextStart = 1+numPstvImgs+numNgtvImgs+numWbcImgs;
|
||||||
|
dstTrainRegion = slectdFrTraining(nextStart:nextStart-1+numDstImgs);
|
||||||
|
if (params.isForCNN)
|
||||||
|
dstDataSlctd = DUSTSTACK(:, :, :, dstTrainRegion);
|
||||||
|
[~, ~, ~, cntDstTnSlctd] = size(dstDataSlctd);
|
||||||
|
else
|
||||||
|
dstDataSlctd = DUSTSTACK(dstTrainRegion, :);
|
||||||
|
[cntDstTnSlctd, ~] = size(dstDataSlctd);
|
||||||
|
end
|
||||||
|
|
||||||
|
if (params.isForCNN)
|
||||||
|
strt = 1; endLc = cntPstvTnSlctd;
|
||||||
|
FllData(:, :, :,strt:endLc) = pstVDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntNgtvTnSlctd;
|
||||||
|
FllData(:, :, :,strt:endLc) = ngtVDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntWbcTnSlctd;
|
||||||
|
FllData(:, :, :,strt:endLc) = wbcDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntDstTnSlctd;
|
||||||
|
FllData(:, :, :,strt:endLc) = dstDataSlctd;
|
||||||
|
else
|
||||||
|
strt = 1; endLc = cntPstvTnSlctd;
|
||||||
|
FllData(strt:endLc, :) = pstVDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntNgtvTnSlctd;
|
||||||
|
FllData(strt:endLc, :) = ngtVDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntWbcTnSlctd;
|
||||||
|
FllData(strt:endLc, :) = wbcDataSlctd;
|
||||||
|
strt = endLc+1; endLc = strt-1+cntDstTnSlctd;
|
||||||
|
FllData(strt:endLc, :) = dstDataSlctd;
|
||||||
|
end
|
||||||
|
|
||||||
|
MalImdb.images.data = FllData;
|
||||||
|
save ([params.DatasetSve IdString '_MalImdb'], 'MalImdb');
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function TnTtVn = divideDataInRatio(MaxLt, Ratio)
|
||||||
|
blck = randperm(MaxLt); strt = 1;
|
||||||
|
cmSum = cumsum(Ratio);
|
||||||
|
TnTtVn = zeros(1, MaxLt);
|
||||||
|
for i = 1:length(Ratio)
|
||||||
|
intstd = round(cmSum(i)/100*MaxLt);
|
||||||
|
TnTtVn((blck >= strt) & (blck <= intstd)) = i;
|
||||||
|
strt = intstd+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function augStack = augmentDataSetByRotation(postvStack)
|
||||||
|
[SzM, SzN, SzO, numImgs] = size(postvStack);
|
||||||
|
augStack = single(zeros(SzM, SzN, SzO, 4*numImgs));
|
||||||
|
augCnt = 0;
|
||||||
|
for i = 1:numImgs
|
||||||
|
currIm = postvStack(:, :, :, i);
|
||||||
|
augStack(:, :, :, augCnt+1) = currIm; %0 degree
|
||||||
|
augStack(:, :, :, augCnt+2) = rot90(currIm, 1); %90
|
||||||
|
augStack(:, :, :, augCnt+3) = rot90(currIm, 2); %180
|
||||||
|
augStack(:, :, :, augCnt+4) = rot90(currIm, 3); %270
|
||||||
|
augCnt = augCnt + 4;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function augStack = augmentDataSetSimply(postvStack)
|
||||||
|
[numImgs, FeatD] = size(postvStack);
|
||||||
|
augStack = single(zeros(4*numImgs, FeatD));
|
||||||
|
augCnt = 0;
|
||||||
|
for i = 1:numImgs
|
||||||
|
currIm = postvStack(i, :);
|
||||||
|
augStack(augCnt+1:augCnt+4, :) = [currIm; currIm;currIm;currIm]; %0 degree
|
||||||
|
augCnt = augCnt + 4;
|
||||||
|
end
|
||||||
|
end
|
||||||
30
src/gopa kumar code/reName.m
Normal file
30
src/gopa kumar code/reName.m
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
function reName()
|
||||||
|
clear all; clc; close all;
|
||||||
|
IdString = 'FczRGB';
|
||||||
|
Categry = 'Ds'; % 'Wc'; % 'Ng' % 'Ps'; % % %
|
||||||
|
DatasetLoc = 'CNNPatches\AllDataSet\';
|
||||||
|
fnames = dir([DatasetLoc IdString '*' Categry '*.mat']);
|
||||||
|
[cnt, ~] = size(fnames);
|
||||||
|
for i = 1:cnt
|
||||||
|
load ([DatasetLoc fnames(i).name]);
|
||||||
|
if (strcmp(Categry, 'Ps'))
|
||||||
|
postvStack = postvStackFcsRGB;
|
||||||
|
save ([DatasetLoc fnames(i).name], 'postvStack');
|
||||||
|
clear postvStack;
|
||||||
|
elseif (strcmp(Categry, 'Ng'))
|
||||||
|
negtvStack = negtvStackFcsRGB;
|
||||||
|
save ([DatasetLoc fnames(i).name], 'negtvStack');
|
||||||
|
clear negtvStack;
|
||||||
|
elseif (strcmp(Categry, 'Wc'))
|
||||||
|
wbcStack = WBCStackFcsRGB ;
|
||||||
|
save ([DatasetLoc fnames(i).name], 'wbcStack');
|
||||||
|
clear wbcStack;
|
||||||
|
elseif (strcmp(Categry, 'Ds'))
|
||||||
|
dustStack = DustStackFcsRGB;
|
||||||
|
save ([DatasetLoc fnames(i).name], 'dustStack');
|
||||||
|
clear dustStack;
|
||||||
|
else
|
||||||
|
df = 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
25
src/gopa kumar code/setup.m
Normal file
25
src/gopa kumar code/setup.m
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
function setup(varargin)
|
||||||
|
FeetBase = 'E:\Gopakumar\Dataset IIST RSDAY\IIST RSDAY MY WORK\Work\Code\matconvnet-1.0-beta11\practical-cnn-2015a\practical-cnn-2015a';
|
||||||
|
run ([FeetBase '\vlfeat\toolbox\vl_setup']);
|
||||||
|
run ([FeetBase '\matconvnet\matlab\vl_setupnn']);
|
||||||
|
addpath ([FeetBase '\matconvnet\examples']);
|
||||||
|
|
||||||
|
opts.useGpu = false ;
|
||||||
|
opts.verbose = false ;
|
||||||
|
opts = vl_argparse(opts, varargin) ;
|
||||||
|
|
||||||
|
try
|
||||||
|
vl_nnconv(single(1),single(1),[]) ;
|
||||||
|
catch
|
||||||
|
warning('VL_NNCONV() does not seem to be compiled. Trying to compile it now.') ;
|
||||||
|
vl_compilenn('enableGpu', opts.useGpu, 'verbose', opts.verbose) ;
|
||||||
|
end
|
||||||
|
|
||||||
|
if opts.useGpu
|
||||||
|
try
|
||||||
|
vl_nnconv(gpuArray(single(1)),gpuArray(single(1)),[]) ;
|
||||||
|
catch
|
||||||
|
vl_compilenn('enableGpu', opts.useGpu, 'verbose', opts.verbose) ;
|
||||||
|
warning('GPU support does not seem to be compiled in MatConvNet. Trying to compile it now') ;
|
||||||
|
end
|
||||||
|
end
|
||||||
13
src/gopa kumar code/testCNNBNNEx6Color.m
Normal file
13
src/gopa kumar code/testCNNBNNEx6Color.m
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
function Lbls = testCNNBNNEx6Color(testImdb, net)
|
||||||
|
numImages = length(testImdb.images.id);
|
||||||
|
clasfdLb = zeros(1, numImages);
|
||||||
|
for i = 1:numImages
|
||||||
|
im = testImdb.images.data(:, :, :, i);
|
||||||
|
im = 256 * (im - net.imageMean) ;
|
||||||
|
% Apply the CNN to the larger image
|
||||||
|
res = vl_simplenn(net, im);
|
||||||
|
[~, clsfd] = max(res(end).x);
|
||||||
|
clasfdLb(i) = clsfd;
|
||||||
|
end
|
||||||
|
Lbls = [clasfdLb; testImdb.images.label];
|
||||||
|
end
|
||||||
582
src/gopa kumar code/testTrainedCNNSVMAutoCnt.m
Normal file
582
src/gopa kumar code/testTrainedCNNSVMAutoCnt.m
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
function testTrainedCNNSVMAutoCnt(params) %bkUpName, NetId, isModelSvm)
|
||||||
|
lstAccsd = 0; featCnt = 0;
|
||||||
|
alreadySegmented = params.alreadySegmented;
|
||||||
|
useMyMdlFrm = params.UseMdlFrm;
|
||||||
|
if (alreadySegmented)
|
||||||
|
load('CNNPatches\Segment\alreadySegImg');
|
||||||
|
load('CNNPatches\Segment\alreadyWBCImg');
|
||||||
|
end
|
||||||
|
%%This function reads each image, Identify patches 32x32 where there is
|
||||||
|
%%a chance of parasites (Regional Minima) and then test the location
|
||||||
|
%%for the possible parasite and mark it on the slide if it is there.
|
||||||
|
TPSTV = 0; FPSTV = 0; FNGTV = 0; uWntToCnt = true; diFCnt = 0; uwntToPrint = true;
|
||||||
|
wrngCnt = 0; WrngImExclDiffclt =single([]); WrngTrtExclDiffclt = single([]); LblsWrng = uint8([]);
|
||||||
|
TrthDifcltStack = logical([]); ImgsDifcltStack = single([]); LblsDifcltStack = uint8([]);
|
||||||
|
filtrOutDifclt = false;
|
||||||
|
if (uWntToCnt)
|
||||||
|
TotStat.Tp = 0; TotStat.Fn = 0;
|
||||||
|
TotStat.Fp = 0; TotStat.Tn = 0;
|
||||||
|
IndStat.stat = [];
|
||||||
|
end
|
||||||
|
|
||||||
|
bkUpName = params.dataSet;
|
||||||
|
trainedPath = ['myExp6\' useMyMdlFrm '\' bkUpName '_MalImdb\'];
|
||||||
|
% ['E:\Gopakumar\Dataset IIST RSDAY\IIST RSDAY MY WORK\Work\' ...
|
||||||
|
% 'Code\matconvnet-1.0-beta11\practical-cnn-2015a\practical-cnn-2015a\myExp6\60_20_20_60_20_20'];
|
||||||
|
% = 60;
|
||||||
|
if (params.isSVMModel)
|
||||||
|
load ([trainedPath 'SvMModel.mat']);
|
||||||
|
SVMModel = SvMModel.model;
|
||||||
|
NetId = 0;
|
||||||
|
if (params.loadFeat)
|
||||||
|
load ('CNNPatches\Features\saveFeat');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
%OK. Run the set up for MATCONVNET ENVIRONMENT
|
||||||
|
setup ;
|
||||||
|
NetId = params.NetId;
|
||||||
|
%%%%load the trained net and make it ready for testing
|
||||||
|
load ([trainedPath 'net-epoch-' num2str(NetId)]);
|
||||||
|
load ([trainedPath 'imageMean']);
|
||||||
|
net.layers(end) = [] ; net.imageMean = imageMean ;
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
end
|
||||||
|
%Get the minima R,G,B across stack
|
||||||
|
BasePath = '';
|
||||||
|
fnames = dir([BasePath 'ImgesMinAcrsStck\*B.jpg']);
|
||||||
|
fczPath = 'AllFcsStack\';
|
||||||
|
|
||||||
|
numfids = length(fnames); PtchSzM = 32; PtchSzN = 32;
|
||||||
|
prevVidIndx = '';
|
||||||
|
fh = figure;
|
||||||
|
for K = 1:numfids
|
||||||
|
% tic
|
||||||
|
K
|
||||||
|
numPstv = 0;
|
||||||
|
% fnames(K).name
|
||||||
|
AbsFNme = [BasePath 'ImgesMinAcrsStck\' fnames(K).name];
|
||||||
|
%Get details needed to acces the Ground Truth file
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
for i = 1:length(FileName); if (FileName(i) == '_'); vid = i-1; break; end; end;
|
||||||
|
for j = vid+2:length(FileName); if (FileName(j) == '_'); stck = j-1; break; end; end;
|
||||||
|
vidIndx = FileName(1:vid); stckIndx = FileName(vid+2:stck);
|
||||||
|
load ([BasePath 'GndTrth\' vidIndx '_' stckIndx]);
|
||||||
|
if (~strcmp(prevVidIndx, vidIndx));
|
||||||
|
prevVidIndx = vidIndx;
|
||||||
|
cDstLoc = getDstLocnsFor(vidIndx);
|
||||||
|
end
|
||||||
|
%Read the image and Make it Single precision
|
||||||
|
imgUint8 = imread([fczPath vidIndx '_' stckIndx '_21.jpg']); imSingle = im2single(imgUint8);
|
||||||
|
impUint8 = imread([fczPath vidIndx '_' stckIndx '_5.jpg']); impSingle = im2single(impUint8);
|
||||||
|
imnUint8 = imread([fczPath vidIndx '_' stckIndx '_37.jpg']); imnSingle = im2single(imnUint8);
|
||||||
|
if (strcmp(bkUpName, 'BFczdRGB'))
|
||||||
|
imGCombinedFcz(:, :, 1:3) = imSingle;
|
||||||
|
else
|
||||||
|
imGCombinedFcz(:, :, 1:3) = impSingle; imGCombinedFcz(:, :, 4:6) = imSingle; imGCombinedFcz(:, :, 7:9) = imnSingle;
|
||||||
|
end
|
||||||
|
|
||||||
|
clear impUint8; clear impSingle; clear imnUint8; clear imnSingle;
|
||||||
|
% tic;
|
||||||
|
if (~alreadySegmented)
|
||||||
|
[segmentedImg, segWithBndry, WBCs] = getSegmentation(imgUint8);
|
||||||
|
alreadySegImg(:, :, K) = segmentedImg; alreadyWBCImg(:, :, K) = WBCs;
|
||||||
|
if (mod(K, 50) == 0)
|
||||||
|
save('CNNPatches\Segment\alreadySegImg', 'alreadySegImg');
|
||||||
|
save('CNNPatches\Segment\alreadyWBCImg', 'alreadyWBCImg');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
segmentedImg = alreadySegImg(:, :, K);
|
||||||
|
WBCs = alreadyWBCImg(:, :, K);
|
||||||
|
end
|
||||||
|
% toc;
|
||||||
|
RC = imgUint8(:, :, 1); GC = imgUint8(:, :, 2); BC = imgUint8(:, :, 3);
|
||||||
|
[SzM, SzN, ~] = size(imgUint8); LblMsk = false(SzM, SzN);
|
||||||
|
%Compute regional Minima
|
||||||
|
[regMin, bgndMsk] = getMyRegionalMinima(imgUint8);
|
||||||
|
%Note that regMin is already filtered wrt bgnd
|
||||||
|
%This is for SVM
|
||||||
|
cellsImg = false(size(Msk));
|
||||||
|
slideName = [vidIndx '_' stckIndx];
|
||||||
|
|
||||||
|
%Filter out regional minima at the location of WBC s
|
||||||
|
regMin = regMin & ~WBCs;
|
||||||
|
|
||||||
|
%If postv to be checkd closer
|
||||||
|
chkClsr = cDstLoc & regMin;
|
||||||
|
|
||||||
|
%Now test Each suspected Locns
|
||||||
|
Cntrids = regionprops(regMin, 'centroid');
|
||||||
|
[numPosns, ~] = size(Cntrids);
|
||||||
|
vlidPosCnt = 0;
|
||||||
|
for posCnt = 1:numPosns
|
||||||
|
%For the time being, if there is a patch of the required size
|
||||||
|
%around the point, then only we are considering it.
|
||||||
|
CCntrids = round(Cntrids(posCnt).Centroid);
|
||||||
|
CR = CCntrids(2); CC = CCntrids(1);
|
||||||
|
minRw = CR - PtchSzM/2; minCl = CC - PtchSzN/2;
|
||||||
|
maxRw = CR + PtchSzM/2-1; maxCl = CC + PtchSzN/2-1;
|
||||||
|
if (minRw > 0 && minCl > 0 && maxRw <= SzM && maxCl <= SzN)
|
||||||
|
vlidPosCnt = vlidPosCnt + 1;
|
||||||
|
%Get curr patch
|
||||||
|
currPatch = imSingle(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
iptPatch = imGCombinedFcz(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
if (filtrOutDifclt)
|
||||||
|
tmpDel = currPatch;
|
||||||
|
TthMskPatch = Msk(minRw:maxRw, minCl:maxCl, :);
|
||||||
|
end
|
||||||
|
%Test it and Get the label
|
||||||
|
if (params.isSVMModel)
|
||||||
|
if(params.loadFeat)
|
||||||
|
[FeatSet, lstAccsd] = loadFeat(saveFeat, [vidIndx '_' stckIndx], CR, CC, lstAccsd);
|
||||||
|
else
|
||||||
|
cellsImg (minRw:maxRw, minCl:maxCl) = true;
|
||||||
|
[FeatSet, ~] = getMyFeatures(cellsImg, imgUint8, slideName);
|
||||||
|
cellsImg (minRw:maxRw, minCl:maxCl) = false;
|
||||||
|
featCnt = featCnt+1;
|
||||||
|
saveFeat(featCnt).FeatSet = FeatSet;
|
||||||
|
saveFeat(featCnt).FeatName = [vidIndx '_' stckIndx];
|
||||||
|
saveFeat(featCnt).FeatR = CR;
|
||||||
|
saveFeat(featCnt).FeatC = CC;
|
||||||
|
end
|
||||||
|
Lbl = svmclassify(SVMModel, FeatSet);
|
||||||
|
else
|
||||||
|
iptPatch = 256*(iptPatch - net.imageMean);
|
||||||
|
res = vl_simplenn(net, iptPatch);
|
||||||
|
[~, Lbl] = max(res(end).x);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
if (filtrOutDifclt)
|
||||||
|
rsp = res(end).x;
|
||||||
|
vld = abs(rsp(:, :, 1) - rsp(:, :, 2));
|
||||||
|
if (vld < 3.0)
|
||||||
|
diFCnt = diFCnt + 1;
|
||||||
|
TrthDifcltStack (:, :, diFCnt) = TthMskPatch;
|
||||||
|
ImgsDifcltStack (:, :, :, diFCnt) = tmpDel;
|
||||||
|
LblsDifcltStack (:, diFCnt) = Lbl;
|
||||||
|
else
|
||||||
|
%Irrespective of Dst Loc
|
||||||
|
ofst = 5;
|
||||||
|
cntrPatch = TthMskPatch(PtchSzM/2-ofst:PtchSzM/2+ofst, PtchSzN/2-ofst:PtchSzN/2+ofst);
|
||||||
|
fpWrng = (Lbl == 1) && (sum(cntrPatch(:)) == 0); %flase pstv wrong
|
||||||
|
fnWrng = (Lbl == 2) && (sum(cntrPatch(:)) ~= 0); %flase ngtv wrong
|
||||||
|
if (fpWrng || fnWrng)
|
||||||
|
wrngCnt = wrngCnt + 1;
|
||||||
|
WrngTrtExclDiffclt(:, :, wrngCnt) = TthMskPatch;
|
||||||
|
WrngImExclDiffclt (:, :, :, wrngCnt) = tmpDel;
|
||||||
|
LblsWrng(:,wrngCnt) = Lbl;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
%If the label is postive, closely examine if it is dust?
|
||||||
|
if (Lbl == 1)
|
||||||
|
LblMsk(CR, CC) = true;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%Now Examine the Msks with the Mask of Dst Pos we have
|
||||||
|
LblMskDil = bwmorph(LblMsk, 'dilate', 3);
|
||||||
|
ToBExmnd = (LblMskDil & chkClsr);
|
||||||
|
[~, ToBExmnd] = maskAllSharingObjects(LblMskDil, ToBExmnd);
|
||||||
|
[~, ToBExmnd] = maskAllSharingObjects(LblMsk, ToBExmnd);
|
||||||
|
%If the average pixel intensity in the region 7x7 is not below 128
|
||||||
|
%Exclude it from Positive
|
||||||
|
[clsR, clsC] = find(ToBExmnd);
|
||||||
|
for cntCls = 1:length(clsR)
|
||||||
|
cClsR = clsR(cntCls); cClsC = clsC(cntCls);
|
||||||
|
patchClse = GC(cClsR-3:cClsR+3, cClsC-3:cClsC+3);
|
||||||
|
meanPatch = mean(patchClse(:));
|
||||||
|
if (meanPatch > 100)
|
||||||
|
LblMsk(cClsR , cClsC) = false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%Show
|
||||||
|
LD = bwmorph(LblMsk, 'dilate', 4);
|
||||||
|
RC(LD) = 255; GC(LD) = 0; BC(LD) = 0;
|
||||||
|
RGBCmbnd1(:, :, 1) = RC; RGBCmbnd1(:, :, 2) = GC; RGBCmbnd1(:, :, 3) = BC;
|
||||||
|
subplot(1, 2, 1); imshow(RGBCmbnd1); title('Detected');
|
||||||
|
|
||||||
|
%Mask out the area that we did not consider ; boundry and bgnd
|
||||||
|
exclRfst = ceil(PtchSzM/2); exclCfst = ceil(PtchSzN/2);
|
||||||
|
MskExclded = false(size(Msk)); MskExclded(exclRfst:SzM-exclRfst, exclCfst:SzN-exclCfst) = true;
|
||||||
|
remFrmTruth = Msk & MskExclded & bwmorph(bwfill(bgndMsk, 'holes'), 'dilate', 3); %lets consider a little more towards the wall
|
||||||
|
TrthDidNtConsder = ~remFrmTruth & Msk;
|
||||||
|
|
||||||
|
MD = bwmorph(remFrmTruth, 'dilate', 4); RD = bwmorph(TrthDidNtConsder, 'dilate', 4);
|
||||||
|
|
||||||
|
RC = imgUint8(:, :, 1); GC = imgUint8(:, :, 2); BC = imgUint8(:, :, 3);
|
||||||
|
RC(MD) = 0; GC(MD) = 255; BC(MD) = 0; RC(RD) = 0; GC(RD) = 0; BC(RD) = 255;
|
||||||
|
RGBCmbnd2(:, :, 1) = RC; RGBCmbnd2(:, :, 2) = GC; RGBCmbnd2(:, :, 3) = BC;
|
||||||
|
subplot(1, 2, 2); imshow(RGBCmbnd2);
|
||||||
|
|
||||||
|
if (uwntToPrint)
|
||||||
|
PrintPath = ['PrintPath\' useMyMdlFrm '\'];
|
||||||
|
print (fh, [PrintPath bkUpName '\' vidIndx '_' stckIndx], '-djpeg');
|
||||||
|
imwrite (RGBCmbnd1, [PrintPath 'IndVid\' bkUpName '\' vidIndx '_' stckIndx '_Det.jpg']);
|
||||||
|
imwrite (RGBCmbnd2, [PrintPath 'IndVid\' bkUpName '\' vidIndx '_' stckIndx '_Trt.jpg']);
|
||||||
|
end
|
||||||
|
|
||||||
|
%Lets count here
|
||||||
|
if (uWntToCnt)
|
||||||
|
Classfd = LblMsk; GndTruth = remFrmTruth;
|
||||||
|
[TP, FN, FP, TN] = countTPFNFPTN(segmentedImg, GndTruth, Classfd);
|
||||||
|
TotStat.Tp = TotStat.Tp+TP; TotStat.Fn = TotStat.Fn+FN;
|
||||||
|
TotStat.Fp = TotStat.Fp+FP; TotStat.Tn = TotStat.Tn+TN;
|
||||||
|
IndStat.name{K} = fnames(K).name;
|
||||||
|
IndStat.stat = [IndStat.stat; TP, FN, FP, TN];
|
||||||
|
% IndStat
|
||||||
|
end
|
||||||
|
if (params.isSVMModel && ~params.loadFeat && (mod(K, 300) == 0))
|
||||||
|
save('CNNPatches\Features\saveFeat', 'saveFeat');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% alreadySegImg
|
||||||
|
if (~alreadySegmented)
|
||||||
|
save('CNNPatches\Segment\alreadySegImg', 'alreadySegImg');
|
||||||
|
save('CNNPatches\Segment\alreadyWBCImg', 'alreadyWBCImg');
|
||||||
|
end
|
||||||
|
if (params.isSVMModel && ~params.loadFeat)
|
||||||
|
save('CNNPatches\Features\saveFeat', 'saveFeat');
|
||||||
|
end
|
||||||
|
if (uWntToCnt)
|
||||||
|
save (['myExp6\' useMyMdlFrm '\' bkUpName '_MalImdb\TotStat_' num2str(NetId)], 'TotStat');
|
||||||
|
save (['myExp6\' useMyMdlFrm '\' bkUpName '_MalImdb\IndStat_' num2str(NetId)], 'IndStat');
|
||||||
|
end
|
||||||
|
if (filtrOutDifclt)
|
||||||
|
DifSamSlctdByPgm.TrthDifcltStack = TrthDifcltStack;
|
||||||
|
DifSamSlctdByPgm.ImgsDifcltStack = ImgsDifcltStack;
|
||||||
|
DifSamSlctdByPgm.LblsDifcltStack = LblsDifcltStack;
|
||||||
|
WnglyClasfdExclDiff.WrngTrtExclDiffclt = WrngTrtExclDiffclt;
|
||||||
|
WnglyClasfdExclDiff.WrngImExclDiffclt = WrngImExclDiffclt;
|
||||||
|
WnglyClasfdExclDiff.LblsWrng = LblsWrng;
|
||||||
|
save ([bkUpName 'DifSamSlctdByPgm'], 'DifSamSlctdByPgm');
|
||||||
|
save ([bkUpName 'WnglyClasfdExclDiff'], 'WnglyClasfdExclDiff');
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function [FeatSet, lstAccsd] = loadFeat(saveFeat, slideName, R, C, lstAccsd)
|
||||||
|
[~, totCnt] = size(saveFeat);
|
||||||
|
for i = lstAccsd+1:totCnt
|
||||||
|
if (strcmp(slideName, saveFeat(i).FeatName) && R == saveFeat(i).FeatR && C == saveFeat(i).FeatC)
|
||||||
|
FeatSet = saveFeat(i).FeatSet;
|
||||||
|
lstAccsd = i;
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function [TPstv, FNgtv, FPstv] = getCMat(ClsfdD, GnD, PtchSzM, imgUint8)
|
||||||
|
% [clearSetLTh, clearSetGTh, remSetGTh] = getBinaryImage(imUint8RGB);
|
||||||
|
% fnh = figure;
|
||||||
|
[SzM, SzN] = size(GnD);
|
||||||
|
HdeMask = false (SzM, SzN);
|
||||||
|
HdeMask(PtchSzM/2+1:SzM - PtchSzM/2, PtchSzM/2+1:SzN - PtchSzM/2) = true;
|
||||||
|
Trth = GnD & HdeMask; MClsfdD = ClsfdD & HdeMask;
|
||||||
|
%Check whether manual intervention is needed or not.
|
||||||
|
dilMsk = strel('disk', 17);
|
||||||
|
ManualTrth = imdilate(Trth, dilMsk);
|
||||||
|
NmManTr = bwconncomp(ManualTrth); NmManTrth = NmManTr.NumObjects;
|
||||||
|
ManualClfd = imdilate(MClsfdD, dilMsk);
|
||||||
|
NmManCd = bwconncomp(ManualClfd); NmManClfd = NmManCd.NumObjects;
|
||||||
|
|
||||||
|
|
||||||
|
TrthNumObj = round(sum(Trth(:))/81);
|
||||||
|
ClsfdNmObj = round(sum(MClsfdD(:))/81);
|
||||||
|
if ((NmManTrth ~= TrthNumObj) || (NmManClfd ~= ClsfdNmObj))
|
||||||
|
TPstv = input('TPSTV = ');
|
||||||
|
FNgtv = input('FNgtv = ');
|
||||||
|
FPstv = input('FPstv = ');
|
||||||
|
else
|
||||||
|
[~, Mskd] = maskAllSharingObjects(MClsfdD, Trth);
|
||||||
|
TPstv = round(sum(Mskd(:))/81); %81 pixel for one marking
|
||||||
|
FNgtv = TrthNumObj - TPstv;
|
||||||
|
FPstv = ClsfdNmObj - TPstv;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [susReg, bgndMsk] = getMyRegionalMinima(imgUint8)
|
||||||
|
MnSz = 900;
|
||||||
|
hsv = rgb2hsv(imgUint8);
|
||||||
|
vlue = hsv(:, :, 3);
|
||||||
|
stDsk = strel('disk', 11);
|
||||||
|
openimg = imopen(vlue, stDsk);
|
||||||
|
mask = imregionalmin(openimg);
|
||||||
|
%First Filtering Exclude all the Bgnd
|
||||||
|
bgndMsk = bwareaopen((vlue < graythresh(vlue)), MnSz);
|
||||||
|
susReg = bgndMsk & mask;
|
||||||
|
end
|
||||||
|
function cDstLoc = getDstLocnsFor(vidIndx)
|
||||||
|
BasePath = 'DstLocnsPgm\';
|
||||||
|
load ([BasePath 'DstLocByPGM']); cnt = 0;
|
||||||
|
vidIndxs = DstLocByPGM.vidIndx;
|
||||||
|
[~, numVidIndxs] = size(vidIndxs);
|
||||||
|
for i = 1:numVidIndxs
|
||||||
|
if (strcmp(vidIndx, vidIndxs(i).name))
|
||||||
|
cDstLoc = DstLocByPGM.DstLocByPgm(:, :, i);
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function DstLoc = getDustLocns()
|
||||||
|
close all;
|
||||||
|
BasePath = ['E:\Gopakumar\GopakumarIISTDrive\Dataset\' ...
|
||||||
|
'4th IIST Visit\Mal01\Images\GndTruth\Separate\EasySeg\'];
|
||||||
|
fnames = dir([BasePath '\ImgesMinAcrsStck\*B.jpg']);
|
||||||
|
|
||||||
|
numfids = length(fnames); M = 32; N = 32; R = 1; Rad = 0.75*M;
|
||||||
|
prevVidIndx = ''; DstCnt = 0;
|
||||||
|
for K = 388:numfids
|
||||||
|
K
|
||||||
|
AbsFNme = [BasePath 'ImgesMinAcrsStck\' fnames(K).name];
|
||||||
|
%Get details needed to acces the Ground Truth file
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
for i = 1:length(FileName); if (FileName(i) == '_'); vid = i-1; break; end; end;
|
||||||
|
for j = vid+2:length(FileName); if (FileName(j) == '_'); stck = j-1; break; end; end;
|
||||||
|
vidIndx = FileName(1:vid); stckIndx = FileName(vid+2:stck);
|
||||||
|
if (strcmp(prevVidIndx, vidIndx)); continue; end
|
||||||
|
prevVidIndx = vidIndx;
|
||||||
|
figure; imshow(imread(AbsFNme)); title(num2str(K));
|
||||||
|
ImgStack = getImageStackFromVideoIndx(vidIndx);
|
||||||
|
DstCnt = DstCnt+1;
|
||||||
|
DstLocByPgm = computeDustLocFrmStk(ImgStack);
|
||||||
|
save (['DstLocnsPgm\DstLocByPGM_' vidIndx], 'DstLocByPgm');
|
||||||
|
if (strcmp(vidIndx, 'I') || strcmp(vidIndx, 'J'))
|
||||||
|
stp =1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% getDstLocByMajority();
|
||||||
|
end
|
||||||
|
function DstLocByPGM = getDstLocByMajority()
|
||||||
|
BasePath = ''; %['E:\Gopakumar\GopakumarIISTDrive\Dataset\' ...
|
||||||
|
%'E:\Gopakumar\GopakumarIISTDrive\Dataset\4th IIST Visit\Mal01\Images\GndTruth\Separate\EasySeg\'];
|
||||||
|
fnames = dir([BasePath 'DstLocnsPgm\DstLocByPGM_*.mat']);
|
||||||
|
|
||||||
|
numfids = length(fnames); M = 32; N = 32; R = 1; Rad = 0.75*M;
|
||||||
|
VoteSecnd = uint8(zeros(480, 720));
|
||||||
|
VoteFirst = uint8(zeros(480, 720));
|
||||||
|
KTop = [25 27 29 31 33];
|
||||||
|
close all;
|
||||||
|
for K = 1:numfids
|
||||||
|
AbsFNme = [BasePath 'DstLocnsPgm\' fnames(K).name];
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
load (AbsFNme);
|
||||||
|
vidIndx = FileName(13:end);
|
||||||
|
[SzM, SzN] = size(DstLocByPgm);
|
||||||
|
if (K == 26 || K == 28 || K == 30 || K == 32 || K == 34)
|
||||||
|
% vidIndx
|
||||||
|
VoteSecnd(DstLocByPgm) = VoteSecnd(DstLocByPgm)+1;
|
||||||
|
% figure; imshow(VoteSecnd, []);
|
||||||
|
else
|
||||||
|
VoteFirst(DstLocByPgm) = VoteFirst(DstLocByPgm)+1;
|
||||||
|
% figure; imshow(VoteFirst, []);
|
||||||
|
end
|
||||||
|
display([num2str(K) ' ' vidIndx ' ' num2str(SzM) ' ' num2str(SzN)]);
|
||||||
|
end
|
||||||
|
DstLocByPgmFirst = VoteFirst > 15;
|
||||||
|
DstLocByPgmSecond = VoteSecnd > 3;
|
||||||
|
% DstLocByPgm = false(480, 720);
|
||||||
|
for K = 1:numfids
|
||||||
|
AbsFNme = [BasePath 'DstLocnsPgm\' fnames(K).name];
|
||||||
|
[~, FileName, ~] = fileparts(AbsFNme);
|
||||||
|
vidIndx = FileName(13:end);
|
||||||
|
DstLocByPGM.vidIndx(K).name = vidIndx;
|
||||||
|
if (K == 26 || K == 28 || K == 30 || K == 32 || K == 34)
|
||||||
|
vidIndx
|
||||||
|
DstLocByPGM.DstLocByPgm(:, :, K) = DstLocByPgmSecond;
|
||||||
|
else
|
||||||
|
DstLocByPGM.DstLocByPgm(:, :, K) = DstLocByPgmFirst;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
DstLocByPGM.meta = 'Genrtd By PGM testTrainedCNNNetOnSlide in MatCNetMalClass Fldr';
|
||||||
|
save('DstLocnsPgm\DstLocByPGM', 'DstLocByPGM');
|
||||||
|
end
|
||||||
|
function DstLocByPgm = computeDustLocFrmStk(ImgStackUint8)
|
||||||
|
close all; DstLocByPgm = 0;
|
||||||
|
[SzM, SzN, SzO, numCells] = size(ImgStackUint8);
|
||||||
|
numAssns = zeros(SzM, SzN);
|
||||||
|
Addns = zeros( SzM, SzN);
|
||||||
|
currImD = 0; Diffr = zeros( SzM, SzN);
|
||||||
|
objsIntst = false(SzM, SzN, numCells);
|
||||||
|
Vote = uint8(zeros(SzM, SzN));
|
||||||
|
close all;
|
||||||
|
for i = 1:numCells
|
||||||
|
imUint8 = ImgStackUint8(:, :, :, i);
|
||||||
|
[clearSetLTh, clearSetGTh, remSetGTh] = getBinaryImage(imUint8);
|
||||||
|
segImg = clearSetLTh | clearSetGTh | remSetGTh;
|
||||||
|
bgndImg = ~segImg;
|
||||||
|
% figure; imshow(bgndImg);
|
||||||
|
bgndErde = bwmorph(bgndImg, 'erode', 25);
|
||||||
|
G = imUint8(:, :, 2);
|
||||||
|
avgbgnd = mean(G(bgndErde));
|
||||||
|
objsCand = G < (avgbgnd - 0.05*avgbgnd);
|
||||||
|
%remove all bigger ones
|
||||||
|
intstd = objsCand & ~bwareaopen(objsCand, 200);
|
||||||
|
objsIntst(:, :, i) = intstd;
|
||||||
|
Vote(intstd) = Vote(intstd)+1;
|
||||||
|
% figure; imshow(imUint8); title(num2str(i));
|
||||||
|
% figure; imshow(intstd);
|
||||||
|
end
|
||||||
|
%Select those having 25% Support
|
||||||
|
mnSprt = 0.25; %support
|
||||||
|
DstLocByPgm = Vote > max(round(mnSprt*numCells), 4);
|
||||||
|
% figure; imshow(imUint8);
|
||||||
|
% figure; imshow(fnalDstLocs);
|
||||||
|
end
|
||||||
|
function [clearSetLTh, clearSetGTh, remSetGTh] = getBinaryImage(imUint8RGB)
|
||||||
|
imG = im2double(imUint8RGB(:, :, 2));
|
||||||
|
msk = fspecial('average', 15);
|
||||||
|
avG = imfilter(imG, msk);
|
||||||
|
fildLThImg = bwfill(bwareaopen(imG < (avG - 0.01), 200), 'holes');
|
||||||
|
fildGThImg = lOtThresh(imUint8RGB);
|
||||||
|
[clearSetLTh, ~] = getClearSet(fildLThImg);
|
||||||
|
remSetGTh = bwareaopen(bwmorph(~clearSetLTh & fildGThImg, 'open', 3), 200);
|
||||||
|
[clearSetGTh, remSetGTh] = getClearSet(remSetGTh);
|
||||||
|
end
|
||||||
|
|
||||||
|
function [clearSet, remSet] = getClearSet(bwImg)
|
||||||
|
remSet = bwImg; clearSet = false(size(remSet));
|
||||||
|
cmps = regionprops(bwImg, {'PixelIdxList', 'Solidity', 'ConvexImage', 'BoundingBox'});
|
||||||
|
[numObj, ~] = size(cmps);
|
||||||
|
lowThresh = 750; highThresh = 2000;
|
||||||
|
for i = 1:numObj
|
||||||
|
currObj = cmps(i).PixelIdxList;
|
||||||
|
objArea = length(currObj);
|
||||||
|
if (cmps(i).Solidity > 0.9 && objArea > lowThresh && objArea < highThresh)
|
||||||
|
clearSet(currObj) = true;
|
||||||
|
remSet(currObj) = false;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ThImg = lOtThresh(im)
|
||||||
|
div = 2;
|
||||||
|
[SzM, SzN, SzO] = size(im);
|
||||||
|
if (SzO > 3)
|
||||||
|
im = rgb2gray(im); %im(:, :, 2);
|
||||||
|
end
|
||||||
|
im = im2double(im);
|
||||||
|
rOfst = round(SzM/div); cOfst = round(SzN/div);
|
||||||
|
ThImg = false(SzM, SzN);
|
||||||
|
for i = 1:div
|
||||||
|
startR = (i-1)*rOfst+1;
|
||||||
|
if (i == div)
|
||||||
|
endR = SzM;
|
||||||
|
else
|
||||||
|
endR = i*rOfst;
|
||||||
|
end
|
||||||
|
for j = 1:div
|
||||||
|
startC = (j-1)*cOfst+1;
|
||||||
|
if (j == div)
|
||||||
|
endC = SzN;
|
||||||
|
else
|
||||||
|
endC = j*cOfst;
|
||||||
|
end
|
||||||
|
divImg = im(startR:endR, startC:endC);
|
||||||
|
ThImg(startR:endR, startC:endC) = divImg < (graythresh(divImg)+0.01);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ThImg = bwfill(bwareaopen(ThImg, 200), 'holes');
|
||||||
|
end
|
||||||
|
|
||||||
|
function [remMsk, Mskd] = maskAllSharingObjects(BaseImg, ShareObjs)
|
||||||
|
ToBMaskd = BaseImg & ShareObjs;
|
||||||
|
LblsFrmBase = bwlabel(BaseImg);
|
||||||
|
Mskd = false(size(BaseImg));
|
||||||
|
lbls2BMaskd = LblsFrmBase(ToBMaskd);
|
||||||
|
unqLbls = unique(lbls2BMaskd(:));
|
||||||
|
for lbl = 1:length(unqLbls)
|
||||||
|
Mskd(LblsFrmBase == (unqLbls(lbl))) = true;
|
||||||
|
end
|
||||||
|
remMsk = BaseImg & ~Mskd;
|
||||||
|
end
|
||||||
|
|
||||||
|
function ImgStack = getImageStackFromVideoIndx(vidIndx)
|
||||||
|
BasePath = ['E:\Gopakumar\GopakumarIISTDrive\Dataset\' ...
|
||||||
|
'4th IIST Visit\Mal01\Images\GndTruth\Separate\EasySeg\'];
|
||||||
|
fnames = dir([BasePath '\ImgesMinAcrsStck\' vidIndx '*B.jpg']);
|
||||||
|
|
||||||
|
numfids = length(fnames); M = 32; N = 32; R = 1; Rad = 0.75*M;
|
||||||
|
for K = 1:numfids
|
||||||
|
AbsFNme = [BasePath 'ImgesMinAcrsStck\' fnames(K).name];
|
||||||
|
im = imread(AbsFNme);
|
||||||
|
ImgStack(:, :, :, K) = im;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function [FnlFeatSet, CellId] = getMyFeatures(cellsImg, imUint8RGB, slideName)
|
||||||
|
%Lets do the processing on Green channel for the time being
|
||||||
|
avMsk = fspecial('average', 3);
|
||||||
|
FnlFeatSet = single(zeros(1, 14*3)); %3 Channels
|
||||||
|
for ch = 1:3
|
||||||
|
imGreen = imUint8RGB(:, :, ch);
|
||||||
|
imGreenDble = im2double(imGreen);
|
||||||
|
[grdMg, ~] = imgradient(imGreenDble);
|
||||||
|
meanLclMsk = imfilter(imGreenDble, avMsk);
|
||||||
|
varnLclMsk = imfilter(imGreenDble.^2, avMsk) - meanLclMsk.^2;
|
||||||
|
[SzM, SzN] = size(imGreen);
|
||||||
|
props = regionprops(cellsImg, {'PixelIdxList', 'Centroid'});
|
||||||
|
[numObjs, ~] = size(props);
|
||||||
|
myBgndImgI = uint8(200* ones(SzM, SzN));
|
||||||
|
FeatSet = single(zeros(numObjs, 14));
|
||||||
|
CellId = [];
|
||||||
|
for i = 1:numObjs
|
||||||
|
pxlIdxLst = props(i).PixelIdxList;
|
||||||
|
[SR, SC] = ind2sub(size(imGreen), pxlIdxLst);
|
||||||
|
tmpI = myBgndImgI;
|
||||||
|
tmpI(pxlIdxLst) = imGreen(pxlIdxLst);
|
||||||
|
%Get the patch
|
||||||
|
minSR = min(SR); maxSR = max(SR);
|
||||||
|
minSC = min(SC); maxSC = max(SC);
|
||||||
|
imgPatch = tmpI(minSR:maxSR, minSC:maxSC);
|
||||||
|
mskPatch = cellsImg(minSR:maxSR, minSC:maxSC);
|
||||||
|
FeatSet(i, 1:4) = getGLCMFeatPrPatch(imgPatch, mskPatch);
|
||||||
|
|
||||||
|
imGrnDblPchPxls = imGreenDble(pxlIdxLst);
|
||||||
|
meanGlblPxls = mean(imGrnDblPchPxls);
|
||||||
|
varGlblPxls = var(imGrnDblPchPxls);
|
||||||
|
minPxls = min(imGrnDblPchPxls);
|
||||||
|
maxPxls = max(imGrnDblPchPxls);
|
||||||
|
minGrdMag = min(grdMg(pxlIdxLst));
|
||||||
|
maxGrdMag = max(grdMg(pxlIdxLst));
|
||||||
|
minLclMean = min(meanLclMsk(pxlIdxLst));
|
||||||
|
maxLclMean = max(meanLclMsk(pxlIdxLst));
|
||||||
|
minLclVarn = min(varnLclMsk(pxlIdxLst));
|
||||||
|
maxLclVarn = max(varnLclMsk(pxlIdxLst));
|
||||||
|
FeatSet(i,5:14) = [meanGlblPxls varGlblPxls minPxls maxPxls ...
|
||||||
|
minGrdMag maxGrdMag minLclMean maxLclMean ...
|
||||||
|
minLclVarn maxLclVarn];
|
||||||
|
cellCentr = round(props(i).Centroid);
|
||||||
|
CellId(i).name = [slideName '_' num2str(cellCentr(2)) '_' num2str(cellCentr(1))];
|
||||||
|
end
|
||||||
|
FnlFeatSet(1, (ch-1)*14+1:ch*14) = FeatSet;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function GLCMFeat = getGLCMFeatPrPatch(imUint8Gray, Msk)
|
||||||
|
im = imUint8Gray;
|
||||||
|
%im has to be Single band [0 255]
|
||||||
|
[SzR, SzC, SzO] = size(im);
|
||||||
|
MskX = [Msk(:, 2:end) Msk(:, end)];
|
||||||
|
MskY = [Msk(2:end, :); Msk(end, :)];
|
||||||
|
MskD = Msk & MskX & MskY; %MskD = bwmorph(MskD, 'erode', 3);
|
||||||
|
%Compute the GLCM for each band for the reg and return the props.
|
||||||
|
Lvl = 32; LvlDiv = 256/Lvl;
|
||||||
|
regIntst = MskD;
|
||||||
|
GLCMMat = zeros(Lvl, Lvl);
|
||||||
|
GLCMFeat = zeros(SzO, 4);
|
||||||
|
for band = 1:SzO
|
||||||
|
imBand = double(im);
|
||||||
|
imgL = ceil((imBand+1)/LvlDiv);
|
||||||
|
imgL(~regIntst) = -1;
|
||||||
|
for i = 1:SzR
|
||||||
|
for j = 1:SzC-1
|
||||||
|
valLeft = imgL(i, j);
|
||||||
|
valRight = imgL(i, j+1);
|
||||||
|
if (valLeft ~= -1 && valRight ~= -1)
|
||||||
|
GLCMMat(valLeft, valRight) = GLCMMat(valLeft, valRight)+1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
GFeat = graycoprops(GLCMMat);
|
||||||
|
GLCMFeat(band, :) = [GFeat.Contrast GFeat.Correlation GFeat.Energy GFeat.Homogeneity];
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user