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
12046
Внутренний цикл лишний - в матлабе следует стараться избегать циклов, когда можно работать с матричными операциями.
Если я нигде не накосячил, то вот так:
Код:
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
3866
Aeroport
photon, простите что встреваю, мне кажется что мнимая единица у них
Код:
1i
что позволяет использовать i и j в качестве индексов. У меня все время i и j это строка и столбец матрицы :-)

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


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

Цитата:
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
3866
Aeroport
Спасибо за цитату. Интересно, будет ли оттормаживать программу использование i и j как индексов (за счет перегрузки)?

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

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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