2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Matlab. Разбить изображение на квадратики 100х100
Сообщение14.03.2016, 09:17 


04/05/13
125
Мне нужно составить матрицу, строки которой кодируют квадратик 100х100. Я считываю изображение размера 1200х1920.
Вот скрипт:
Код:
I = rgb2gray(imread('1.jpg'));
n = size(I, 1);
m = size(I, 2);
N = uint8(n / 100);
M = uint8(m / 100);
A = zeros(N*M, 10000);
num = 0;
for i = 1:N
    starti = (i - 1) * 100 + 1;
    for j = 1:M
        startj = (j - 1) * 100 + 1;
        num = num + 1;
        Block = I(starti:i*100, startj:j*100);
        for k = 1:100
            startk = (k - 1) * 100 + 1;
            A(num, startk:k*100) = Block(k, 1:100);
        end
    end
end

При $j = 3$ у матрицы Block размерность 100х55 (должна быть 100х100) и при попытке считать Block(k, k*100) скрипт падает с ошибкой "Index exceeds matrix dimensions". Никак не могу понять почему в Block считывается матрица не той размерности.

-- 14.03.2016, 12:14 --

Проблема решена. После замены
Код:
N = uint8(n / 100);
M = uint8(m / 100);

на
Код:
N = fix(n / 100);
M = fix(m / 100);

все заработало.
Можно закрывать тему.

 Профиль  
                  
 
 Re: Matlab. Разбить изображение на квадратики 100х100
Сообщение18.03.2016, 12:48 
Экс-модератор
Аватара пользователя


23/12/05
12063
Внутренний цикл лишний - в матлабе следует стараться избегать циклов, когда можно работать с матричными операциями.
Если я нигде не накосячил, то вот так:
Код:
I = rgb2gray(imread('1.jpg'));

[n,m] = size(I);
N = fix(n/100);
M = fix(m/100);
A = zeros(M*N,10000);
for ii = 1:N
    for jj = 1:M
        A(N*(ii-1)+jj,:) = reshape( I((ii-1)*100+1:ii*100, (jj-1)*100+1:jj*100)',[1 10000]);
    end
end

наверняка можно сделать и без этих циклов, но это надо думать, как сделать красиво и не запутаться с индексами.

И нежелательно использовать $i , j$ в качестве переменных цикла - они в Матлабе уже зарезервированы под мнимую единицу.

 Профиль  
                  
 
 Re: Matlab. Разбить изображение на квадратики 100х100
Сообщение09.04.2016, 23:15 


10/03/16
4444
Aeroport
photon, простите что встреваю, мне кажется что мнимая единица у них
Код:
1i
что позволяет использовать i и j в качестве индексов. У меня все время i и j это строка и столбец матрицы :-)

 Профиль  
                  
 
 Re: Matlab. Разбить изображение на квадратики 100х100
Сообщение09.04.2016, 23:26 
Экс-модератор
Аватара пользователя


23/12/05
12063
советы, значащиеся в матлабовском хелпе:

Цитата:
For speed and improved robustness in complex arithmetic, use 1i and 1j instead of i and j.

Since i is a function, it can be overridden and used as a variable. However, it is best to avoid using i and j for variable names if you intend to use them in complex arithmetic.


То есть да, первичные обозначения мнимой единицы 1i и 1j, но при этом i и j так же вызовут мнимые единицы. Как по мне, необоснованно перегружать или переопределять какие бы то ни было функции - дурной тон и повод для ошибок, которые потом трудно отловить.

 Профиль  
                  
 
 Re: Matlab. Разбить изображение на квадратики 100х100
Сообщение10.04.2016, 02:16 


10/03/16
4444
Aeroport
Спасибо за цитату. Интересно, будет ли оттормаживать программу использование i и j как индексов (за счет перегрузки)?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: DariaRychenkova


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group