Я хочу вычислить градиент объема в 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?
gaussiankernel
? Его нет ни в одном из официальных наборов инструментов MATLAB. Пожалуйста, включите код здесь. Ты его откуда-то скачал? Если да, то укажите ссылку. - person Cris Luengo   schedule 16.10.2018dx(I,sigma1)
,dy(I,sigma1)
иdz(I,sigma1)
. Или простоgradientvector(I,sigma1)
. - person Cris Luengo   schedule 16.10.2018imgradientxyz
для производных. Это правильно? На самом деле я хочу расширить функциюLST_eig
до 3D для вычисления собственных значений и собственных векторов тензора структуры. Я добавил код к вопросу, но не знаю, почему я получаю эту ошибку:Index exceeds matrix dimensions.
- person bahar   schedule 16.10.2018imgradientxyz
все в порядке. Я погуглил LST_eig и нашел ваш старый вопрос. Ошибки выхода за пределы индекса можно обнаружить с помощью отладчика MATLAB. Введитеdbstop if error
, затем запустите свой код и проверьте переменные в строке, которая вызывает ошибку, чтобы понять, что ваш код пытается сделать и почему он неправильный. Если вы заинтересованы в реализации этого самостоятельно, это нормально, но вы также можете использовать функциюstructuretensor3d
в DIPimage. - person Cris Luengo   schedule 16.10.2018D(1,1)
иD(2,2)
иD(3,3)
вместоD(1,1,1)
и... - person bahar   schedule 16.10.2018D
— это матрица 3x3. Файлstartup.m
должен находиться в папкеDocuments\MATLAB
или в какой-то другой, в зависимости от того, в каком месте запускается MATLAB. Просто введитеedit startup.m
при запуске MATLAB. - person Cris Luengo   schedule 16.10.2018edit startup.m
, но получаю эту ошибку:Error creating file start up .m in this current folder: Access is denied
- person bahar   schedule 17.10.2018pwd
? Это должен быть каталог в вашем пользовательском каталоге. Если нет, вы можете настроить свой каталог запуска на панели настроек MATLAB. - person Cris Luengo   schedule 17.10.2018structuretensor3d
в DIPimage, но все выходные данные в формате dip_image, а не double, и у меня возникают трудности с их выводом и использованием. Как я могу преобразовать их в двойные? 2. Как я могу определить адаптивный эллиптический элемент структурирования, используя выходные данные функцииstructuretensor3d
для любой точки объема? Подобно тому, что мы определили для 2D-изображения ранее. - person bahar   schedule 20.10.2018img
является объектомdip_image
, тоdouble(img)
является двойным массивом. 2- Например,[l1,phi1,theta1]=structuretensor3d(img,1,3,{'l1','phi1','theta1'})
возвращает вl1
наибольшее собственное значение для каждого пикселя, а вphi1,theta1
- углы соответствующего собственного вектора. Эта функция автоматически выполняет собственное разложение. - person Cris Luengo   schedule 21.10.2018img
является объектом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.2018l1
,l2
,l3
,phi3
иtheta3
, используя функциюstructuretensor3d
. - person bahar   schedule 29.10.2018m-M
новой переменной (или просто зацикливm=1:row
) и сделав индексацию один раз, записав лямды и углы во временные переменные и используя их в расчетах. Все, что вы можете придумать, чтобы сделать эти выражения короче, поможет удобочитаемости... Для эффективности переместите вызовmeshgrid
за пределы цикла, так как он всегда один и тот же. - person Cris Luengo   schedule 29.10.2018phi3
иtheta3
— это углы третьего (наименьшего) собственного вектора. Вам также понадобятся углы для первого или второго собственного вектора (третий набор углов можно вычислить из двух других). - person Cris Luengo   schedule 29.10.2018m = 1:row
, но как насчет краевых пикселей? Я использовалphi3
иtheta3
, потому что думал, что наименьший собственный вектор параллелен ребру. Верно ли уравнение эллипсоида? - person bahar   schedule 30.10.2018se
является нулевым кубом без 1. не могли бы вы мне помочь? - person bahar   schedule 01.11.2018