Обработка трехмерного массива
Модератор: Admin
Обработка трехмерного массива
Форумчане!
У меня есть массив матриц aver3c(k,l,i) некоторым образом обработанной последовательности видеокадров. k – номер строки в кадре из общего количества 125, l – номер столбца в кадре из общего количества 125, I – номер кадра из общего количества 750.
Мне нужно осуществить свертку каждого кадра с оператором Лапласа.
Так вот, если я беру некий конкретный кадр, например, с номером 700:
for k=2:124
for l=2:124
aver3c(k,l,700)=-aver3c(k-1,l-1, 700)-aver3c(k,l-1, 700)-aver3c(k+1,l-1, 700)-aver3c(k-1,l, 700)+8*aver3c(k,l, 700)-aver3c(k+1,l,700)-aver3c(k-1,l+1, 700)-aver3c(k,l+1,700)-aver3c(k+1,l+1, 700);
end
end
то все получается хорошо. А если я пытаюсь сделать это в цикле по номерам кадров, то получается какой-то бред.
% Свертка с оператором Лапласа 3х3
for i=1:750
for k=2:124
for l=2:124
aver3c(k,l,i)=-aver3c(k-1,l-1,i)-aver3c(k,l-1,i)-aver3c(k+1,l-1,i)-aver3c(k-1,l,i)+8*aver3c(k,l,i)-aver3c(k+1,l,i)-aver3c(k-1,l+1,i)-aver3c(k,l+1,i)-aver3c(k+1,l+1,i);
end
end
end
Говорят, что в Matlab есть ограничения на работу с многомерными матрицами. Я ничего такого не нашел. В чем проблема?
У меня есть массив матриц aver3c(k,l,i) некоторым образом обработанной последовательности видеокадров. k – номер строки в кадре из общего количества 125, l – номер столбца в кадре из общего количества 125, I – номер кадра из общего количества 750.
Мне нужно осуществить свертку каждого кадра с оператором Лапласа.
Так вот, если я беру некий конкретный кадр, например, с номером 700:
for k=2:124
for l=2:124
aver3c(k,l,700)=-aver3c(k-1,l-1, 700)-aver3c(k,l-1, 700)-aver3c(k+1,l-1, 700)-aver3c(k-1,l, 700)+8*aver3c(k,l, 700)-aver3c(k+1,l,700)-aver3c(k-1,l+1, 700)-aver3c(k,l+1,700)-aver3c(k+1,l+1, 700);
end
end
то все получается хорошо. А если я пытаюсь сделать это в цикле по номерам кадров, то получается какой-то бред.
% Свертка с оператором Лапласа 3х3
for i=1:750
for k=2:124
for l=2:124
aver3c(k,l,i)=-aver3c(k-1,l-1,i)-aver3c(k,l-1,i)-aver3c(k+1,l-1,i)-aver3c(k-1,l,i)+8*aver3c(k,l,i)-aver3c(k+1,l,i)-aver3c(k-1,l+1,i)-aver3c(k,l+1,i)-aver3c(k+1,l+1,i);
end
end
end
Говорят, что в Matlab есть ограничения на работу с многомерными матрицами. Я ничего такого не нашел. В чем проблема?
Re: Обработка трехмерного массива
то все получается хорошо
Вот это странно. На беглый взгляд оба варианта кода должны работать одинаково неправильно.
Попробуйте записывать результат в ДРУГОЙ массив, а не в исходный.
P.S. А почему вы готовые средства не хотите использовать и пишете фильтрацию вручную?
С уважением
Александр Сергиенко
Александр Сергиенко
Re: Обработка трехмерного массива
Сергей!
Пробовал записывать в другой массив aver4c - результат тот же самый.
А что касается готовых средств, так я начинающий пользователь Matlab и еще мало что знаю.
С уважением, Борис.
Пробовал записывать в другой массив aver4c - результат тот же самый.
А что касается готовых средств, так я начинающий пользователь Matlab и еще мало что знаю.
С уважением, Борис.
Re: Обработка трехмерного массива
Александр!
По Вашему совету я заменил вручную написанный цикл свертки с оператором Лапласа родной функцией Matlab –
w=[-1 -1 -1;-1 8 -1;-1 -1 -1];
% Свертка с оператором Лапласа 3х3
for i=1:750
aver3c(:,:,i)=imfilter( aver3c(:,:,i),w,'conv','replicate','same');
end
И все заработало.
Хотя странно. Получается, что в Matlab есть ограничения на количество вложенных циклов, но я нигде ничего на эту тему не видел.
Большое спасибо, Борис.
По Вашему совету я заменил вручную написанный цикл свертки с оператором Лапласа родной функцией Matlab –
w=[-1 -1 -1;-1 8 -1;-1 -1 -1];
% Свертка с оператором Лапласа 3х3
for i=1:750
aver3c(:,:,i)=imfilter( aver3c(:,:,i),w,'conv','replicate','same');
end
И все заработало.
Хотя странно. Получается, что в Matlab есть ограничения на количество вложенных циклов, но я нигде ничего на эту тему не видел.
Большое спасибо, Борис.
Re: Обработка трехмерного массива
Получается, что в Matlab есть ограничения на количество вложенных циклов
Нету.
С уважением
Александр Сергиенко
Александр Сергиенко
Re: Обработка трехмерного массива
Ну, тогда не знаю...
Re: Обработка трехмерного массива
Ваш исходный код был правильным, если результат записывать в массив с другим именем, то результат его работы идентичен тому, что дает imfilter (кроме краевых эффектов, естественно).
С уважением
Александр Сергиенко
Александр Сергиенко
Re: Обработка трехмерного массива
Мне как-то больше нечего добавить. Я пытался записать в другой файл...
В любом случае - огромное спасибо. Мне нужно, чтобы работало, а уж почему... Это второй вопрос, хотя и интересный и поучительный.
С уважением, Борис.
В любом случае - огромное спасибо. Мне нужно, чтобы работало, а уж почему... Это второй вопрос, хотя и интересный и поучительный.
С уважением, Борис.
Re: Обработка трехмерного массива
Вообще, если мы с Вами хотим доискаться истины, то, если Вы пришлете мне Ваш e-mail, то я могу прислать исходное короткое видео, не менее короткий код, и результаты. Мой адрес bsa48@mail.ru
Вопрос не праздный, так как один очень уважаемый мною специалист говорил, что в Matlab есть некие проблемы с обработкой многомерных массивов. Хотелось бы понять, так ли это.
Вопрос не праздный, так как один очень уважаемый мною специалист говорил, что в Matlab есть некие проблемы с обработкой многомерных массивов. Хотелось бы понять, так ли это.
Re: Обработка трехмерного массива
Зачем смотреть видео, когда достаточно взглянуть на числа?
И вот ожидаемый результат - совпадает все, кроме краев:
Код: Выделить всё
rng(2018); % инициализация генератора случайных чисел
aver3c = rand([125 125 750]); % массив случайных чисел
% ваш первый вариант
for i=1:750
for k=2:124
for l=2:124
X1(k,l,i)=-aver3c(k-1,l-1,i)-aver3c(k,l-1,i)-aver3c(k+1,l-1,i)-aver3c(k-1,l,i)+8*aver3c(k,l,i)-aver3c(k+1,l,i)-aver3c(k-1,l+1,i)-aver3c(k,l+1,i)-aver3c(k+1,l+1,i);
end
end
end
% ваш второй вариант
w=[-1 -1 -1;-1 8 -1;-1 -1 -1];
for i=1:750
X2(:,:,i)=imfilter( aver3c(:,:,i),w,'conv','replicate','same');
end
% выводим на экран кусочки двух выходных массивов
X1(1:5,1:5,123)
X2(1:5,1:5,123)
И вот ожидаемый результат - совпадает все, кроме краев:
Код: Выделить всё
ans =
0 0 0 0 0
0 -4.2918 0.3655 1.9081 0.1702
0 -4.6944 2.9140 2.2658 -1.6528
0 -0.3520 2.2095 -4.2552 1.6478
0 1.4772 1.7040 2.7610 -4.8883
ans =
-0.9094 3.3295 -0.0169 -4.0727 2.2330
1.6556 -4.2918 0.3655 1.9081 0.1702
-0.3342 -4.6944 2.9140 2.2658 -1.6528
1.6777 -0.3520 2.2095 -4.2552 1.6478
1.0932 1.4772 1.7040 2.7610 -4.8883
С уважением
Александр Сергиенко
Александр Сергиенко
Re: Обработка трехмерного массива
Вы оказались правы. Нужно поменять имя файла, в который записывается свертка. Зачем это нужно я до конца не понимаю, а почему это не помогло раньше не понимаю совсем.
В любом случае, большое спасибо.
В любом случае, большое спасибо.
Re: Обработка трехмерного массива
Зачем это нужно я до конца не понимаю
Возьмите клочок бумаги и аккуратно распишите, какие действия будет выполнять ваш код на примере маленького массива - не 125*125, а, скажем, 5*5 или даже 4*4. ОБратите внимание на состояние массива после каждого прохода внутреннего цикла.
С уважением
Александр Сергиенко
Александр Сергиенко