绘制大量不同颜色的正方形
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
【讨论】:
以上是关于绘制大量不同颜色的正方形的主要内容,如果未能解决你的问题,请参考以下文章