绘制大量不同颜色的正方形

Posted

技术标签:

【中文标题】绘制大量不同颜色的正方形【英文标题】:Plotting large number of squares in different colours 【发布时间】:2015-11-30 16:37:09 【问题描述】:

我正在尝试加快我继承的一些代码的速度,这些代码在图像上的定义坐标周围绘制框。盒子的数量通常在 1000-6000 左右。目前它使用一个围绕plot() 函数的for 循环,传递5 个坐标来绘制框。

我正在尝试对其进行修改以使用对plot() 的一次调用,我知道这是一种更有效的渲染方式。我生成了一个可以传递给绘图的 x 和 y 坐标数组,以及一个 RGB 三元组数组来定义每条线的颜色(每个框都有这种颜色显示的状态)。我可以将这些与'defaultAxesColorOrder' 属性一起使用,但我需要它来停止将每个方格连接在一起。

我查看了'defaultAxesLineStyleOrder' 属性,但据我了解,它仅在一个完整的颜色循环后循环样式,在这种情况下不起作用。我真正需要的是一种方法,它可以为 5 个点画线,然后再为下一个点画线,然后重复。

我有什么方法可以做到这一点,并且不会降低渲染速度?

编辑:这是到目前为止的新代码:

编辑 2:我已经设法阻止它使用 NaN 值在正方形之间绘制线条来分隔每个正方形。我从有关优化线图的页面上的 Mathworks 文档中获得了该技术,但我现在找不到适合我生活的 URL。我已经更新了下面的代码。

numObjs = size(MYDATA.objectInformation, 1);
if isfield(MYDATA, 'objectInformation')
    if (numObjs > 0)

        padding = MYDATA.preferences.boxSize/2;

        % Array of coords. 6* the number of objects (takes 5 points to draw
        % a square + NaN gap hack)
        objCoords = zeros(6*numObjs, 2);
        objCoordsIndex = 1;

        % array of line colours for defaultAxesColorOrder
        objColours = zeros(6*numObjs, 3);

        % Add each object to array
        for loop = 1:numObjs

            x_seed = MYDATA.objectInformationloop, 1;
            y_seed = MYDATA.objectInformationloop, 2;
            status = MYDATA.objectInformationloop, 3;

            % set coords to draw bounding box
            objCoords(objCoordsIndex    , 1:2) = [(x_seed - padding), (y_seed - padding)];  % bottom left
            objCoords(objCoordsIndex + 1, 1:2) = [(x_seed - padding), (y_seed + padding)];  % top left
            objCoords(objCoordsIndex + 2, 1:2) = [(x_seed + padding), (y_seed + padding)];  % top right
            objCoords(objCoordsIndex + 3, 1:2) = [(x_seed + padding), (y_seed - padding)];  % bottom right
            objCoords(objCoordsIndex + 4, 1:2) = [(x_seed - padding), (y_seed - padding)];  % bottom left
            objCoords(objCoordsIndex + 5, 1:2) = [NaN, NaN];  % gap!

            % set colour depending on status
            % NOTE: doesn't use preferences due to effort of converting
            % short colour names with line style modifiers to RGB triplets
            if strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
                colour = [0 1 0];
            elseif strcmp(status, 'Not interesting')
                colour = [1 0 0];
            else    % If not processed/other status
                colour = [0 0 1];
            end

            for i = 1:5
                objColours(objCoordsIndex + i - 1, 1:3) = colour;
            end

            objCoordsIndex = objCoordsIndex + 5;

        end

        % Define line colours

        % Plot array
        plot(MYDATA.imagePanelHandles.mainAxes, objCoords(:, 1), objCoords(:, 2));
    end
end

如果有人想看,这是旧代码:

    if isfield(MYDATA, 'objectInformation')
    if (size(MYDATA.objectInformation, 1) >= 1)
        for loop = 1:size(MYDATA.objectInformation, 1)

            x_seed = MYDATA.objectInformationloop, 1;
            y_seed = MYDATA.objectInformationloop, 2;
            status = MYDATA.objectInformationloop, 3;

            %form MYDATA.preferences.boxSize/2 pixel wide box around seed
            padding = MYDATA.preferences.boxSize/2;

            x = [(x_seed - padding), (x_seed - padding), (x_seed + padding), (x_seed + padding), (x_seed - padding)];
            y = [(y_seed - padding), (y_seed + padding), (y_seed + padding), (y_seed - padding), (y_seed - padding)];

            if strcmp(status,'Not yet processed')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.notProcessedBoxColour)
            elseif strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.interestingObjectBoxColour)
            elseif strcmp(status, 'Not interesting')
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,MYDATA.preferences.notInterestingBoxColour)
            else % be cautious and catch anything that has fallen through
                plot(MYDATA.imagePanelHandles.mainAxes,x,y,'-r')
            end
        end
    end

【问题讨论】:

虽然我很欣赏它仍然会涉及多个调用,因此可能不会加快速度,但 Matlab 有一个 rectangle 函数可能对您有用。 我第一次尝试使用rectangle() 而不是plot(),但它对速度的影响并不明显。 【参考方案1】:

我利用plot() 函数为每个坐标获取二维数组的能力解决了这个问题。每一列都自动以不同的颜色绘制,所以我所要做的就是创建一个 X 数组和一个 Y 坐标数组,其中每一行代表一个对象的坐标,每一行代表它的状态。这是文档的相关部分:http://uk.mathworks.com/help/matlab/ref/plot.html#btzptin

这是我的最终代码:

numObjs = size(MYDATA.objectInformation, 1);
if isfield(MYDATA, 'objectInformation')
if (numObjs > 0)

    padding = MYDATA.preferences.boxSize/2;

    % Arrays of coords. 6* the number of objects (takes 5 points to draw
    % a square + NaN gap hack)
    objCoordsX = NaN(6*numObjs, 3);
    objCoordsY = NaN(6*numObjs, 3);
    objCoordsIndex = 1;

    % Add each object to array
    for loop = 1:numObjs

        x_seed = MYDATA.objectInformationloop, 1;
        y_seed = MYDATA.objectInformationloop, 2;
        status = MYDATA.objectInformationloop, 3;

        % set column to write to depending on status
        if strcmp(status, 'Interesting object') || strcmp(status, 'Interesting object - manually tagged')
            statusColumn = 1;
        elseif strcmp(status, 'Not interesting')
            statusColumn = 2;
        else    % If not processed/other status
            statusColumn = 3;
        end

        objCoordsX(objCoordsIndex    , statusColumn) = x_seed - padding;  % bottom left
        objCoordsX(objCoordsIndex + 1, statusColumn) = x_seed - padding;  % top left
        objCoordsX(objCoordsIndex + 2, statusColumn) = x_seed + padding;  % top right
        objCoordsX(objCoordsIndex + 3, statusColumn) = x_seed + padding;  % bottom right
        objCoordsX(objCoordsIndex + 4, statusColumn) = x_seed - padding;  % bottom left

        objCoordsY(objCoordsIndex    , statusColumn) = y_seed - padding;  % bottom left
        objCoordsY(objCoordsIndex + 1, statusColumn) = y_seed + padding;  % top left
        objCoordsY(objCoordsIndex + 2, statusColumn) = y_seed + padding;  % top right
        objCoordsY(objCoordsIndex + 3, statusColumn) = y_seed - padding;  % bottom right
        objCoordsY(objCoordsIndex + 4, statusColumn) = y_seed - padding;  % bottom left

        objCoordsIndex = objCoordsIndex + 6;    % 5 coords to draw box + NaN gap in line

    end

    % Plot coords
    plot(MYDATA.imagePanelHandles.mainAxes, objCoordsX, objCoordsY);
end

【讨论】:

以上是关于绘制大量不同颜色的正方形的主要内容,如果未能解决你的问题,请参考以下文章

在绘制颜色条时强制使用方形子图

如何用Python的turth绘制出一个边长为200,三边颜色为红色的等边三角形?

使用 OpenGL 的 C++ - 绘制正方形

桥接模式

openGL在不同显示模式下绘制圆形三角形和正方形

GLFW GLAD 未绘制纹理,黑色方块