Обнаружение межчастичного контакта на микроскопических изображениях в Matlab - PullRequest
0 голосов
/ 03 мая 2019

У меня есть фото капель эмульсии.Я хочу обнаружить межкапельные контакты и для каждого из этих патчей построить график интенсивности.Emulsion В следующем коде я сначала вручную выбираю область интереса, по которой пытаюсь обнаружить один патч целиком.Обратите внимание, что для некоторых пятен интенсивность составляет димер примерно на половине линии контакта: я хочу измерить интенсивность двух плато.

clear all
close all
fname='MTE_20190417_slice7.tif' % mind to reove the '.png' in the name of the attached file
info=imfinfo(fname);
num_images=numel(info);
flagfig=1;
k=1;% for future purposes, on a whole stack
A=imread(fname, k);
B=255-A;
figure(flagfig);imshow(B)
hold on
%% define an ROI
cursors = round(ginput(2));
plot(cursors(:,1),[1,1].*cursors(1,2),'r--')
plot(cursors(:,1),[1,1].*cursors(2,2),'r--')
plot(cursors(1,1).*[1,1],cursors(:,2),'r--')
plot(cursors(2,1).*[1,1],cursors(:,2),'r--')
%% crop the ROI
x_ROI = cursors(:,1);
y_ROI = cursors(:,2);
ROI = imcrop(B,[min(x_ROI), min(y_ROI), abs(x_ROI(2)-x_ROI(1)), abs(y_ROI(2)-y_ROI(1))]);%  specifies the size and position of the crop rectangle as [xmin ymin width height]
if flagfig~=0
    figure(flagfig+1)
    imshow(ROI)
    hold on
end
%% find the median line of the patch
binaryImage=edge(ROI,'canny');
AA=bwmorph(binaryImage, 'thicken',1);
[H,T,R] = hough(AA);
if flagfig~=0
    figure(flagfig+2)
    imshow(H,[],'XData',T,'YData',R,...
        'InitialMagnification','fit');
    xlabel('\theta'), ylabel('\rho');
    axis on, axis normal, hold on;
end
P  = houghpeaks(H,5,'threshold',ceil(0.8*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
if flagfig~=0
    figure(flagfig+2)
    plot(x,y,'s','color','white');
end
lines = houghlines(AA,T,R,P,'FillGap',5,'MinLength',7);
if flagfig~=0
    figure(flagfig+3)
    imshow(binaryImage), hold on
    figure(flagfig+4)
    imshow(AA), hold on
end
xy=nan(2,2,length(lines));
len=nan(length(lines),1);
for k = 1:length(lines)
    xy(:,:,k) = [lines(k).point1; lines(k).point2];
    if flagfig~=0
        figure(flagfig+3)
        hold on
        plot(xy(:,1,k),xy(:,2,k),'LineWidth',2,'Color','green');
        % Plot beginnings and ends of lines
        plot(xy(1,1,k),xy(1,2,k),'x','LineWidth',2,'Color','yellow');
        plot(xy(2,1,k),xy(2,2,k),'x','LineWidth',2,'Color','red');
    end
    % Determine the endpoints of the longest line segment
    len(k) = norm(lines(k).point1 - lines(k).point2);
end
[xy_long, kmax]=max(len);% xy_long=len(kmax); % Longer length
xy_long2 =max(len(len<xy_long));% second longer length
kmax2=find(round(len*100)==round(xy_long2*100));%compute corresponding index
%
line1=xy(:,:,kmax);
line2=xy(:,:,kmax2);
linemed=(line1+line2)/2;
if flagfig~=0
    figure(flagfig+1)
    plot(linemed(:,1),linemed(:,2),'linewidth',2,'Color','m')
    figure(flagfig+3)
    plot(xy(:,1,kmax),xy(:,2,kmax),'LineWidth',2,'Color','r');
    plot(xy(:,1,kmax2),xy(:,2,kmax2),'LineWidth',2,'Color','r');
end
%% compute intensity profile along this line
intprofile=improfile(255-ROI,linemed(:,1),linemed(:,2),'bilinear');
if flagfig~=0
    figure(flagfig+5)
    plot(intprofile)
    hold on
end

Я пробовал несколько настроек для функции края, порогового значения houghpeakутолщение окантованного изображения, но кода все еще не совсем устойчиво: иногда, в зависимости от того, как я выбираю область интереса для основного изображения, пятно контакта не определяется полностью (поэтому профиль интенсивности не является полным).Кроме того, я до сих пор не знаю, как соответствовать трапециевидному профилю, который должен иметь профиль интенсивности (я полагаю), чтобы иметь оба значения интенсивности (высокое и низкое, когда оно существует).Спасибо за вашу помощь.

...