градиент объема в 3 измерениях с использованием производной Гаусса в Matlab

Я хочу вычислить градиент объема в MATLAB, используя производную Гаусса. но я не мог. Кто-нибудь может мне помочь? Я делаю это в 2D-изображении, используя этот код:

k = gaussiankernel(sigma1,1); % first order derivative of a gaussian with std 
sigma1

gx = imfilter(I,k','replicate','conv');
gy = imfilter(I,k,'replicate','conv');

пожалуйста, помогите мне. Как я могу вычислить gz с помощью ядра k? или Как я могу расширить этот код на 3D? Заранее спасибо.

Это код для создания адаптивного эллипсоида с использованием structuretensor3d:

function SE = AESE3(I,M,l1,l2,l3,phi3,theta3)
%I = input('Enter the input 3d volume: ');
%M = input('Enter the maximum allowed semi-major axes length: ');


% determining ellipsoid parameteres from eigen value decomposition of 3d
% structure tensor

row = size(I,1);
col = size(I,2);
hei = size(I,3);
SE = cell(row,col,hei);
padI = padarray(I,[M M M],'replicate','both');
padrow = size(padI,1);
padcol = size(padI,2);
padhei = size(padI,3);

[se_x,se_y,se_z] = meshgrid(-M:M,-M:M,-M:M);

for m = M+1:padrow-M
    for n = M+1:padcol-M
        for p = M+1:padhei-M
i = m-M;
j = n-M;
k = p-M;

a = (l1(i,j,k)+eps)/(l1(i,j,k)+l2(i,j,k)+l3(i,j,k)+3*eps)*M;
b = (l2(i,j,k)+eps)/(l1(i,j,k)+l2(i,j,k)+l3(i,j,k)+3*eps)*M;
c = (l3(i,j,k)+eps)/(l1(i,j,k)+l2(i,j,k)+l3(i,j,k)+3*eps)*M;

cos(phi3(i,j,k)) = cos_phi3;
sin(phi3(i,j,k)) = sin_phi3;
cos(theta3(i,j,k)) = cos_theta3;
sin(theta3(i,j,k)) = sin_theta3;

% defining structuring element for each pixel of image

se = ((se_x.*cos_theta3 - se_y.*sin_theta3.*cos_phi3 + 
se_z.*sin_theta3.*sin_phi3).^2)./a.^2+((se_x.*sin_theta3 + 
se_y.*cos_theta3.*cos_phi3 - se_z.*cos_theta3.*sin_phi3).^2)./b.^2+ 
((se_y.*sin_phi3 + se_z.*cos_phi3).^2)./c.^2 <= 1;

SE{i,j,k} = se;
        end
    end
end
end

Can I do this without zero padding?

person bahar    schedule 15.10.2018    source источник
comment
Что такое функция gaussiankernel? Его нет ни в одном из официальных наборов инструментов MATLAB. Пожалуйста, включите код здесь. Ты его откуда-то скачал? Если да, то укажите ссылку.   -  person Cris Luengo    schedule 16.10.2018
comment
Вы также можете загрузить набор инструментов DIPimage, производные от которого: dx(I,sigma1), dy(I,sigma1) и dz(I,sigma1). Или просто gradientvector(I,sigma1).   -  person Cris Luengo    schedule 16.10.2018
comment
Большое спасибо. К сожалению, у меня нет ссылки. У меня просто мат файл. Я использовал imgradientxyz для производных. Это правильно? На самом деле я хочу расширить функцию LST_eig до 3D для вычисления собственных значений и собственных векторов тензора структуры. Я добавил код к вопросу, но не знаю, почему я получаю эту ошибку: Index exceeds matrix dimensions.   -  person bahar    schedule 16.10.2018
comment
Да, с imgradientxyz все в порядке. Я погуглил LST_eig и нашел ваш старый вопрос. Ошибки выхода за пределы индекса можно обнаружить с помощью отладчика MATLAB. Введите dbstop if error, затем запустите свой код и проверьте переменные в строке, которая вызывает ошибку, чтобы понять, что ваш код пытается сделать и почему он неправильный. Если вы заинтересованы в реализации этого самостоятельно, это нормально, но вы также можете использовать функцию structuretensor3d в DIPimage.   -  person Cris Luengo    schedule 16.10.2018
comment
Большое спасибо. На самом деле, я скачал DIPimage, но, к сожалению, не смог создать файл startup.m в каталоге MATLAB по умолчанию для автоматического запуска 'dipstart.m'.   -  person bahar    schedule 16.10.2018
comment
о, я нашел, что не так. Я должен использовать D(1,1) и D(2,2) и D(3,3) вместо D(1,1,1) и...   -  person bahar    schedule 16.10.2018
comment
Действительно, D — это матрица 3x3. Файл startup.m должен находиться в папке Documents\MATLAB или в какой-то другой, в зависимости от того, в каком месте запускается MATLAB. Просто введите edit startup.m при запуске MATLAB.   -  person Cris Luengo    schedule 16.10.2018
comment
извините, я набираю edit startup.m, но получаю эту ошибку: Error creating file start up .m in this current folder: Access is denied   -  person bahar    schedule 17.10.2018
comment
Странно, что возвращает pwd? Это должен быть каталог в вашем пользовательском каталоге. Если нет, вы можете настроить свой каталог запуска на панели настроек MATLAB.   -  person Cris Luengo    schedule 17.10.2018
comment
С опозданием и большое спасибо за совет. У меня два вопроса: 1- Я использовал функцию structuretensor3d в DIPimage, но все выходные данные в формате dip_image, а не double, и у меня возникают трудности с их выводом и использованием. Как я могу преобразовать их в двойные? 2. Как я могу определить адаптивный эллиптический элемент структурирования, используя выходные данные функции structuretensor3d для любой точки объема? Подобно тому, что мы определили для 2D-изображения ранее.   -  person bahar    schedule 20.10.2018
comment
1- Если img является объектом dip_image, то double(img) является двойным массивом. 2- Например, [l1,phi1,theta1]=structuretensor3d(img,1,3,{'l1','phi1','theta1'}) возвращает в l1 наибольшее собственное значение для каждого пикселя, а в phi1,theta1 - углы соответствующего собственного вектора. Эта функция автоматически выполняет собственное разложение.   -  person Cris Luengo    schedule 21.10.2018
comment
Если вы хотите вычислить сам тензор структуры, вы можете сделать (при условии, что img является объектом dip_image): g=gradient(img); S=g*g.'; S=gaussf(S,3); [V,D]=eig(S). Здесь S — структурный тензор, V — матрица с собственными векторами, а D — диагональная матрица с собственными значениями. S(50,30,6) - это матрица в данном пикселе (с использованием индексации (x, y, z), а не (строка, столбец, плоскость)). S{1,1} соответствует вашему gx2_sm.   -  person Cris Luengo    schedule 21.10.2018
comment
Большое спасибо. Пользуясь вашими советами, работаю над кодом и спрошу, если будут вопросы. В очередной раз благодарим за помощь.   -  person bahar    schedule 21.10.2018
comment
Очень поздно: код, который я добавил к вопросу, верен (в частности, уравнение эллипсоида) для создания адаптивного эллипсоидального структурирующего элемента для каждой точки объема? Я сгенерировал l1, l2, l3, phi3 и theta3, используя функцию structuretensor3d.   -  person bahar    schedule 29.10.2018
comment
По-моему, нормально, но читать тяжело, может я что-то пропустил. Разве это не дает нужного результата? Вы можете улучшить читаемость, заменив m-M новой переменной (или просто зациклив m=1:row) и сделав индексацию один раз, записав лямды и углы во временные переменные и используя их в расчетах. Все, что вы можете придумать, чтобы сделать эти выражения короче, поможет удобочитаемости... Для эффективности переместите вызов meshgrid за пределы цикла, так как он всегда один и тот же.   -  person Cris Luengo    schedule 29.10.2018
comment
О, phi3 и theta3 — это углы третьего (наименьшего) собственного вектора. Вам также понадобятся углы для первого или второго собственного вектора (третий набор углов можно вычислить из двух других).   -  person Cris Luengo    schedule 29.10.2018
comment
Большое спасибо. На самом деле я запускаю код, но не вижу трехмерных результатов, т.е. эллипсоида, сгенерированного по пикселям. Благодаря вашим советам я сделал некоторые выражения короче. Я могу заменить цикл на m = 1:row, но как насчет краевых пикселей? Я использовал phi3 и theta3, потому что думал, что наименьший собственный вектор параллелен ребру. Верно ли уравнение эллипсоида?   -  person bahar    schedule 30.10.2018
comment
Я нашел уравнение вращающегося эллипсоида и изменил его в коде. но я не знаю, почему для всех точек данных se является нулевым кубом без 1. не могли бы вы мне помочь?   -  person bahar    schedule 01.11.2018