Могу ли я повысить эффективность этой функции Matlab? - PullRequest
2 голосов
/ 04 марта 2012

Я написал функцию Matlab, которая выполняет некоторые интенсивные операции с процессорами над изображениями.Я хотел бы улучшить скорость этой функции, но не могу больше думать о способах ее оптимизации.Кто-нибудь знает, как дополнительно оптимизировать функцию ниже?

function imageMedoid(imageList, resizeFolder, outputFolder, x, y)

    % local variables
    medoidImage = zeros([1, y*x, 3]);
    alphaImage = zeros([y x]);
    medoidContainer = zeros([y*x, length(imageList), 3]);

    % loop through all images in the resizeFolder
    for i=1:length(imageList)

        % get filename and load image
        fname = imageList(i).name;
        container = im2double(imread([resizeFolder fname]));

        % load alpha channel, convert to zeros and ones, add to alphaImage
        [~,~,alpha] = imread([resizeFolder fname]);
        alpha = double(alpha) / 255;
        alphaImage = alphaImage + alpha;

        % add (r,g,b) values to medoidContainer and reshape to single line
        medoidContainer(:, i, :) = reshape(container, [y*x 3]);

    end

    % loop through every pixel in medoidContainer
    for i=1:length(medoidContainer)

        % calculate distances between all values for current pixel
        distances = pdist(squeeze(medoidContainer(i,:,1:3)));

        % convert found distances to matrix of distances
        distanceMatrix = squareform(distances);

        % find index of image with the medoid value
        [~, j] = min(mean(distanceMatrix,2));

        % write found medoid value to medoidImage
        medoidImage(1, i, 1:3) = medoidContainer(i, j, 1:3);

    end

    % replace values larger than one in alpha channel
    alphaImage(alphaImage > 1) = 1;

    % reshape image to original proportions
    medoidImage = reshape(medoidImage, y, x, 3);

    % save medoid image
    imwrite(medoidImage, [outputFolder 'medoid.png'], 'Alpha', alphaImage);

Любые предложения будут с благодарностью!

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

Я бы посоветовал вам использовать встроенный профилировщик MATLAB, чтобы иметь лучшее представление о том, какие операции занимают больше всего времени, а затем попытаться оптимизировать его.

Tools -> Open Profiler -> imageMedoid(...)
0 голосов
/ 04 марта 2012

Вы звоните

imread([resizeFolder fname])

дважды в первом цикле for.Назовите его один раз как

[A,~,alpha] = imread([resizeFolder fname]);

Это должно привести к некоторому улучшению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...