1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| %%%%%%%%%%%%%%%%%%%%%%%%%%%
%Detcection d´une molecule%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [cell_area,recovered_cell,BWfinal] = test2 (file,filtre,coefsupr,coefdet,coefliss,x,y,w,h)
%---------------description des variables d´entrees--------------------
% file est le nom de l´image que l´on souhaite charger. ex: 'cell.bmp'
% filtre est la methode de detection de contour souhaitée. ('sobel','prewitt','canny','roberts','zerocross','log')
% coefdet est un coefficiant de d´etection ~.8
% coefsupr est un coefficiant de supression des bordures ~8
% coefliss est un coefficiant de lissage du contour ~2
% x est la coordonnee en x du haut gauche du cadre de detection
% y est la coordonnee en y du haut gauche du cadre de detection
% w est la largeur du cadre de detection
% h est la hauteur du cadre de selection
%-----------------------------------------------------------------------
% Ouvrire une image
Image = imread(file);
% figure, imshow(Image), title('image d´origine');
% RGB ---> N&B
Imagenb= .2989*Image(:,:,1)+.5870*Image(:,:,2)+.1140*Image(:,:,3);
% figure, imshow(Imagenb), title('image en noir et blanc');
% selection d´une partie de l´image avec un rectangle
rect_selection = [x y w h];
Imagenb2 = imcrop(Imagenb,rect_selection);
% figure, imshow(Imagenb2), title('zone de detection');
% Detection des contours (segmentation par changement de contrast)
[junk threshold] = edge(Imagenb2, filtre);
fudgeFactor = coefdet;
BWs = edge(Imagenb2,filtre, threshold * fudgeFactor);
%figure, imshow(BWs), title('segmentation par changement de contrast');
% Remplissage du vide entre les segments (afin d´avoir l´objet dans sa
% totalité)
se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWsdil = imdilate(BWs, [se90 se0]);
%figure, imshow(BWsdil), title('comblage du vide');
% Remplissage de l´interieur des l´objets détectés
BWdfill = imfill(BWsdil, 'holes');
%figure, imshow(BWdfill),title('remplissage');
% supression des objets situés au bord de l´image
BWnobord = imclearborder(BWdfill, coefsupr); % coef de supression
%figure, imshow(BWnobord), title('nettoyage des bords');
% Lissage des contours
seD = strel('diamond',coefliss); % coef de lissage
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
%figure, imshow(BWfinal), title('lissage des contours');
A = bwarea(BWfinal);% A = nombre de pixels a l´etat 1
cell_area = (A * (9.42*10^-6))/1.7345e+003; % cell_area en m2
% Dessin du contour
BWoutline = bwperim(BWfinal);
Segout = Image;
Segout(BWoutline) = 250;
%figure, imshow(Segout), title('image d´origine et contour ');
recovered_cell = uint8(zeros(size(Imagenb)));
recovered_cell(y:y+h,x:x+w,:) = BWoutline;
%figure, imshow(recovered_cell);
[m,n,p] = size(Imagenb);
mask = ones(m,n);
i = find(recovered_cell(:,:,1)==0);
mask(i) = .1; % on peut essayer avec d´autre coef de tansparence
% mais celui lá doit etre toujours ~ bon
% superposition des deux avec la transparence
figure, imshow(Image)
hold on
h = imshow(recovered_cell);
set(h,'AlphaData',mask) |