Matlab 绘制大量不同颜色的正方形
我正在尝试加速我继承的一些代码,这些代码围绕图像上定义的坐标绘制方框。盒子的数量通常在1000-6000之间。目前,它在Matlab 绘制大量不同颜色的正方形,matlab,plot,matlab-figure,Matlab,Plot,Matlab Figure,我正在尝试加速我继承的一些代码,这些代码围绕图像上定义的坐标绘制方框。盒子的数量通常在1000-6000之间。目前,它在plot()函数周围使用for循环,传递5个坐标以绘制长方体 我正在尝试重新编写它,以便使用对plot()的单个调用,据我所知,这是一种更有效的渲染方法。我已经生成了一个x和y坐标数组,我可以将其传递到绘图,以及一个RGB三元组数组,用于定义每条线的颜色(每个框都有此颜色显示的状态)。我可以将它们与'defaultaxescolorder'属性一起使用,但我需要它来停止将每个正
plot()
函数周围使用for循环,传递5个坐标以绘制长方体
我正在尝试重新编写它,以便使用对plot()
的单个调用,据我所知,这是一种更有效的渲染方法。我已经生成了一个x和y坐标数组,我可以将其传递到绘图,以及一个RGB三元组数组,用于定义每条线的颜色(每个框都有此颜色显示的状态)。我可以将它们与'defaultaxescolorder'
属性一起使用,但我需要它来停止将每个正方形连接在一起
我已经研究了'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.objectInformation{loop, 1};
y_seed = MYDATA.objectInformation{loop, 2};
status = MYDATA.objectInformation{loop, 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.objectInformation{loop, 1};
y_seed = MYDATA.objectInformation{loop, 2};
status = MYDATA.objectInformation{loop, 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
我通过利用
plot()
函数为每个坐标获取二维数组的能力解决了这个问题。每一列都自动以不同的颜色绘制,所以我所要做的就是创建一个X坐标数组和一个Y坐标数组,其中每一行表示一个对象的坐标,每一行表示其状态。以下是文件的相关部分:
这是我的最终代码:
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.objectInformation{loop, 1};
y_seed = MYDATA.objectInformation{loop, 2};
status = MYDATA.objectInformation{loop, 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
虽然我知道它仍然会涉及多个调用,因此可能不会加快速度,但Matlab有一个对您可能有用的
rectangle
函数。我第一次尝试使用rectangle()
而不是plot()
,但它对速度的影响是不明显的。