<< Chapter < Page | Chapter >> Page > |
% This function subtract a predeterminded background image from the input image
% and returns just the plain fish.function [justfish] = subback(file);fish1 = double(imread(file));
back1 = double(imread('bkunderwater1.jpg','jpg'));justfish = fish1 - back1;
% This is the same as the fishcounter file, but it works for a non-ideal
% situation, where the backgroup behind the fish must be subtracted off.function [fishtype] = fishcounterback(file)% Subtract the background from the picture.
fishimage1 = subback(file);% Add noise to the picture
noise = randn(size(fishimage1));
noiselevel = 100;fishimagenoise = fishimage1 + noiselevel.*noise;
fishimagenoisevals = and(fishimagenoise<256, fishimagenoise>0);
fishimage = fishimagenoise.*fishimagenoisevals;fishmod = 0;
if sum(sum(rgb2gray(fishimage)))>100% If the length to width ratio is less than 2.85 and greater than 2,% its a salmon, and if its greater than 3.5, the fish is a trout.
[length,width,lwratio]= fishedge(fishimage);
if and(lwratio<= 2.85, lwratio>2)
fishmod = fishmod + 1;elseif lwratio >=3.5
fishmod = fishmod - 1;end% Check to see how much intensity there is in each of the color spectrums
for i = 1:3fishnorm(:,:,i) = fishimage(:,:,i)./norm((fishimage(:,:,i)));intensitymatrix(:,:,i) = reshape(fishimage(:,:,i), 1, prod(size(fishimage(:,:,1))));
intensity(:,:,i) = mean(intensitymatrix(:,:,i));endrgintens = intensity(:,:,1)-intensity(:,:,2);
rbintens = intensity(:,:,1)-intensity(:,:,3);% If the red is greater than one ofthe other spectrums by at least .4, then% it is a trout, if they are within .1 of each other, it is a trout. Otherwise
% it is an unknown item.if rgintens >.04
fishmod = fishmod + .5;elseif rgintens<.01
fishmod = fishmod - .5;endif rbintens >.04
fishmod = fishmod + .5;elseif rbintens<.01
fishmod = fishmod - .5;end
% Check the features of the fish.[body,head,tail] = featureanalyzer(fishimage);% If the body is red and the head is green, blue, or both, then its a trout.% If the body is all three colors and either the head or the tail or both
% are the same color and included in the body, then it is a trout.if and(body == 'r ', or(head == 'g ', or(head == 'gb ', head == 'b ')))
fishmod = fishmod + 1.5;end
if and(body == 'rgb', and(head == 'cbd', tail == 'cbd'))fishmod = fishmod - 1.5;
elseif and(body == 'rgb', or(head == 'cbd', tail == 'cbd'))fishmod = fishmod - 1;
end%Count the fins on the fish. If it is zero, then its probably trash,% otherwise, keep the modifier in its present state.
numfins = findet(fishimage);if and(numfins == 0, abs(fishmod)<=2)
fishmod = 0;endelse
fishmod = 0;end
% If most of the tests think the fish is a salmon, call it a salmon% If most of the tests think the fish is a trout, call it a trout
% If the tests all don't know, or if they disagree, call it unknownif fishmod >0
fishtype = 'salmon ';elseif fishmod<0
fishtype = 'trout ';else
fishtype = 'unknown';end
% This is the top file for the whole system when the background must be subtracte from
% the image before it is analyzed. It takes in a matrix of filenames and% a matrix of what type of fish each of the files is. It then runs the classification
% program on one fish at a time and then computes the accuracy of the outputs.function [fishmatrix,statsmat,correct,wrong] = massfishcounterback(filematrix,typematrix);for fishnum = 1:size(filematrix,1)fishnum
% Classify the current fishfishmatrix(fishnum,:) = fishcounterback(filematrix(fishnum,:));
endsalmoncount = 0;
troutcount = 0;undetermined = 0;
correct = 0;wrong = 0;
salcor = 0;troutcor = 0;
undetcor = 0;salwrong = 0
troutwrong = 0;undetwrong = 0;
salmonpercent = 0;troutpercent = 0;
undetpercent = 0;% Check all of the output types to the input matrix of which type each
% fish should be and see how accurate the results were.for z = 1:size(fishmatrix,1)
switch fishmatrix(z,:)case 'salmon '
salmoncount = salmoncount + 1;if fishmatrix(z,:)==typematrix(z,:);
salcor = salcor + 1;else
salwrong = salwrong + 1;end
case 'trout 'troutcount = troutcount + 1;
if fishmatrix(z,:)==typematrix(z,:);troutcor = troutcor + 1;
elsetroutwrong = troutwrong + 1;
endcase 'unknown'
undetermined = undetermined + 1;if fishmatrix(z,:)==typematrix(z,:);
undetcor = undetcor + 1;else
undetwrong = undetwrong + 1;end
endend
salmonpercent = salcor./(salcor+salwrong);troutpercent = troutcor./(troutcor+troutwrong);
undetpercent = undetcor./(undetcor+undetwrong);correct = salcor + troutcor + undetcor;wrong = salwrong + troutwrong + undetwrong;statsmat = [salcor salwrong salmonpercent; troutcor troutwrong troutpercent; undetcor undetwrong undetpercent];
Notification Switch
Would you like to follow the 'Ece 301 projects fall 2003' conversation and receive update notifications?