【问题标题】:Can i improve the efficiency of this Matlab function?我可以提高这个 Matlab 函数的效率吗?
【发布时间】:2012-03-04 15:41:12
【问题描述】:

我编写了一个 matlab 函数,它对图像执行一些 cpu 密集型操作。我想提高这个功能的速度,但想不出优化它的方法。有谁知道如何进一步优化下面的功能?

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);

任何建议将不胜感激!

【问题讨论】:

    标签: matlab optimization


    【解决方案1】:

    我建议您使用 MATLAB 的内置分析器,以便更好地了解最耗时的操作,然后尝试在那里进行优化。

    Tools -> Open Profiler -> imageMedoid(...)
    

    【讨论】:

    • 没错。问一长串命令能否提高效率,是浪费时间。让配置文件工具为您完成这项工作,找到您应该努力的点。
    • @woodchips 和 zenpoy:好的,所以我使用了 Open Profiler,而 imreadsquareform 占用了很多时间。但是,我不知道如何进一步优化它们。是否可以用更高效的命令来代替它们?
    【解决方案2】:

    你在打电话

    imread([resizeFolder fname])
    

    在你的第一个 for 循环中两次。调用一次为

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

    这应该会带来一些改进。

    【讨论】:

    • +1 作为答案,我没有将其设置为我的问题的答案,因为我认为总的来说人们会从 zenpony 的答案中受益更多,但你的答案对我个人更有用,所以谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多