Обработка трехмерного массива

ЦОС, обработка видео и изображений в MATLAB\Simulink

Модератор: Admin

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Обработка трехмерного массива

Сообщение BorisAz » Вт янв 23, 2018 10:10 am

Форумчане!
У меня есть массив матриц 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 есть ограничения на работу с многомерными матрицами. Я ничего такого не нашел. В чем проблема?

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Обработка трехмерного массива

Сообщение sandy » Ср янв 24, 2018 12:23 am

то все получается хорошо

Вот это странно. На беглый взгляд оба варианта кода должны работать одинаково неправильно.

Попробуйте записывать результат в ДРУГОЙ массив, а не в исходный.

P.S. А почему вы готовые средства не хотите использовать и пишете фильтрацию вручную?
С уважением

Александр Сергиенко

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Ср янв 24, 2018 6:59 am

Сергей!
Пробовал записывать в другой массив aver4c - результат тот же самый.
А что касается готовых средств, так я начинающий пользователь Matlab и еще мало что знаю.
С уважением, Борис.

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Ср янв 24, 2018 9:42 am

Александр!
По Вашему совету я заменил вручную написанный цикл свертки с оператором Лапласа родной функцией 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 есть ограничения на количество вложенных циклов, но я нигде ничего на эту тему не видел.
Большое спасибо, Борис.

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Обработка трехмерного массива

Сообщение sandy » Ср янв 24, 2018 12:30 pm

Получается, что в Matlab есть ограничения на количество вложенных циклов

Нету.
С уважением



Александр Сергиенко

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Ср янв 24, 2018 12:45 pm

Ну, тогда не знаю...

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Обработка трехмерного массива

Сообщение sandy » Ср янв 24, 2018 7:17 pm

Ваш исходный код был правильным, если результат записывать в массив с другим именем, то результат его работы идентичен тому, что дает imfilter (кроме краевых эффектов, естественно).
С уважением



Александр Сергиенко

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Ср янв 24, 2018 7:38 pm

Мне как-то больше нечего добавить. Я пытался записать в другой файл...
В любом случае - огромное спасибо. Мне нужно, чтобы работало, а уж почему... Это второй вопрос, хотя и интересный и поучительный.
С уважением, Борис.

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Ср янв 24, 2018 7:46 pm

Вообще, если мы с Вами хотим доискаться истины, то, если Вы пришлете мне Ваш e-mail, то я могу прислать исходное короткое видео, не менее короткий код, и результаты. Мой адрес bsa48@mail.ru
Вопрос не праздный, так как один очень уважаемый мною специалист говорил, что в Matlab есть некие проблемы с обработкой многомерных массивов. Хотелось бы понять, так ли это.

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Обработка трехмерного массива

Сообщение sandy » Ср янв 24, 2018 10:51 pm

Зачем смотреть видео, когда достаточно взглянуть на числа?

Код: Выделить всё

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

С уважением



Александр Сергиенко

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Чт янв 25, 2018 10:54 am

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

sandy
Эксперт
Сообщения: 5601
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Обработка трехмерного массива

Сообщение sandy » Чт янв 25, 2018 11:21 pm

Зачем это нужно я до конца не понимаю

Возьмите клочок бумаги и аккуратно распишите, какие действия будет выполнять ваш код на примере маленького массива - не 125*125, а, скажем, 5*5 или даже 4*4. ОБратите внимание на состояние массива после каждого прохода внутреннего цикла.
С уважением



Александр Сергиенко

BorisAz
Пользователь
Сообщения: 10
Зарегистрирован: Вт янв 23, 2018 9:59 am

Re: Обработка трехмерного массива

Сообщение BorisAz » Пт янв 26, 2018 6:53 am

Ок