Эффективное сегментирование изображения в сетку в Matlab

В настоящее время я использую приведенный ниже код для сегментирования изображения в сетку пикселей cellSizeX на количество пикселей cellSizeY:

    grid = zeros(cellSizeX, cellSizeY, ColorCount, cellTotalX, cellTotalY);
    for i = 1:cellSizeX:(HorRowCount)        
        for j = 1:cellSizeY:(VertColumnCount)
                try
                    grid(:,:,:,icount, jcount) = img(i:i+cellSizeX-1, j:j+cellSizeY-1, :);
                catch

                end

            jcount = jcount + 1;

        end
        icount = icount + 1;
        jcount = 1;
    end

Хотя этот код работает нормально и удовлетворительно, есть вещи, которые меня раздражают:

  1. Посредством некоторого тестирования с tic и toc, сравнивая позиции переключающего индекса, такие как grid(:,:,:,icount,jcount) и grid(icount,jcount,:,:,:), я вижу эту сетку (:,:,:, icount, jcount) является самым быстрым. Но можно ли что-то улучшить здесь?

  2. Код будет работать, только если запрошенные cellSizeX и cellSizeY пропорциональны изображению img. Поэтому запрос cellSizeX и cellSizeY 9 x 9 для изображения размером 40 x 40 приведет к тому, что matlab пожалуется на превышение размера матрицы. Любое предложение по этому поводу? Я не хочу просто заполнять пустую область для этих ячеек. Эти клетки будут использоваться в дальнейшем в VIFEAT SIFT.

1 ответ

Решение
  1. Как насчет преобразования изображения в ячейку с каждой ячейкой размером CellSizeX x CellSizeY x ColorCount, а затем укладки всех этих ячеек в сетку из одного массива?

    ca = mat2cell( img, cellSizeY * ones(1, cellTotalY), ...
    cellSizeX * ones(1, cellTotalX), ...
    ColorCount );
    grid = reshape( cat( 4, ca{:} ),...
    cellSizeX, cellSizeY, ColorCount, cellTotalX, cellTotalY);

  2. В сообществе обработки изображений принято дополнять изображение ненулевыми значениями в зависимости от значений изображения на границе. Посмотрите на функцию padarray для дополнительной информации. Вы можете дополнить входное изображение таким образом, чтобы его размер был пропорционален CellSizeX и CellSizeY (заполнение не обязательно должно быть одинаковым для обеих осей).

Другие вопросы по тегам