Рассчитать длину контакта между сегментами изображения в Matlab - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть изображения из четырех цветов.Каждый цвет представляет конкретную фазу материи.Я могу сегментировать изображение в зависимости от цвета и рассчитать периметр сегментированных изображений.Теперь мне нужно рассчитать длину контакта между разными фазами. Пример изображения показан здесь .Например, длина контакта между синей фазой и желтой фазой очень мала, в то время как синяя и серая фазы имеют значительный контакт.

% aa is the image  
oil = (aa(:,:,3)==255);
rock =(aa(:,:,2)==179);
gas =(aa(:,:,2)==255);
water =(aa(:,:,2)==0 && aa(:,:,3)==0);

O = bwboundaries(oil);
R = bwboundaries(rock);
G = bwboundaries(gas);
W = bwboundaries(water);

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вот окончательный код, который я в конце концов написал.Результаты выглядят правильно.

    % aa is the image  
oil = (aa(:,:,3)==255);
rock =(aa(:,:,2)==179);
gas =(aa(:,:,2)==255);
water =(aa(:,:,2)==0 && aa(:,:,3)==0);

phases(1,:,:)=RockBW;
phases(2,:,:)=WaterBW;
phases(3,:,:)=OilBW;
phases(4,:,:)=GasBW;

outMat = ContactMatrix(phases);

Функция ContactMatrix показана следующим образом:

function [ContactMat] = ContactMatrix(phases)
%CONTACTMATRIX measure the contact area between diferent phases

% The output is a 2D matrix which shows the lengths

%         Phase1, Phase2, Phase 3 
%phase1     L1      L2      L4
%Phase2     L2      L3      L5
%Phase3     L4      L5      L6

% L1 is zero
% L2 is the contact area of Phase1 and Phase2

nph = size(phases,1);

imSize = size(phases(1,:,:));
xmax =imSize(2);
ymax = imSize(3);
% Idealy we need a check for all sizes :) 
ContactMat = zeros(nph);

for i=1:1:nph
   counts = zeros(1,nph);
   dd2=bwmorph(squeeze(phases(i,:,:)),'dilate',1);
   B = bwboundaries(dd2);
   nB = size(B,1);
   coefs=1:1:nph;
   coefs(i)=[];
   for j=1:1:nB
        fd = B{j};
        % Ignore the points at boundary of image
        fd(fd(:,1)==1 | fd(:,1)==xmax | fd(:,2)==1 | fd(:,2)==ymax,:)=[];
        nL = size(fd,1);

        for k=1:1:nL(1)
            %bufCheck=false(nph-1,1);
               mat=fd(k,1) + (fd(k,2)-1)*xmax;
               bufCheck = phases(coefs,mat);
               counts(coefs)=counts(coefs)+bufCheck';
        end
   end 
   ContactMat(i,coefs)=counts(coefs);
end
ContactMat = 0.5*(ContactMat+ContactMat');
end
0 голосов
/ 14 декабря 2018

Метод грубой силы будет заключаться в том, чтобы выполнять итерацию по каждому пикселю в вашем изображении и на основе этого значения пикселя, а также значения пикселя справа от него, увеличивая переменную, представляющую счетчик длины контакта фазового перехода, если естьфазовый переход.Затем сделайте то же самое для значения ниже вашего пикселя.Делайте это для каждого пикселя в изображении, кроме краевых условий.

Более эффективным способом было бы создавать строки и столбцы за раз и увеличивать счетчики при этом.

Или вымог бы сделать несколько матриц вашего изображения, смещенных на один пиксель, и сделать сравнения, ища ваши фазовые переходы, которые заканчиваются результатами двоичной матрицы, и просто суммировать эти двоичные матрицы результата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...