<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/168878</link>
    <title>MATLAB Central Newsreader - vectorize drawing of bounding boxes</title>
    <description>Feed for thread: vectorize drawing of bounding boxes</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Wed, 07 May 2008 17:39:03 -0400</pubDate>
      <title>vectorize drawing of bounding boxes</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/168878#430865</link>
      <author>jay vaughan</author>
      <description>Hi,&lt;br&gt;
&lt;br&gt;
I am trying to optimize the speed of drawing a bunch of&lt;br&gt;
bounding boxes on identified objects. I know to try to avoid&lt;br&gt;
loops, but wasn't sure how to vectorize the code (below).&lt;br&gt;
Any ideas on vectorizing this process or speeding it up in&lt;br&gt;
general? Eventually it will be done many times per second,&lt;br&gt;
so I do need the speed.&lt;br&gt;
&lt;br&gt;
A simulation of this below where the first part generates&lt;br&gt;
the coordinates the objects, and the second part is a loop&lt;br&gt;
that creates the boxes.&lt;br&gt;
&lt;br&gt;
% FIRST PART, CREATE (RANDOM) BOX COORDINTES&lt;br&gt;
num_boxes= 1000;&lt;br&gt;
box_size= 13;&lt;br&gt;
frame_size = [512 512];&lt;br&gt;
&lt;br&gt;
rows = (frame_size(1)-1)*rand(num_boxes,1);&lt;br&gt;
cols = (frame_size(2)-1)*rand(num_boxes,1);&lt;br&gt;
box_coords = round([rows cols]);&lt;br&gt;
&lt;br&gt;
% SECOND PART, CREATE BOXES (IF NOT TOO CLOSE TO EDGE)&lt;br&gt;
M = zeros(frame_size);&lt;br&gt;
tic&lt;br&gt;
for k = 1:size(box_coords,1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dl = floor(box_size/2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dr = ceil(box_size/2);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;R1 = box_coords(k,1)-dl;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;R2 = box_coords(k,1)+dr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C1 = box_coords(k,2)-dl;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C2 = box_coords(k,2)+dl;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if R1&amp;gt;=1 &amp;&amp; C1&amp;gt;=1 &amp;&amp; R2&amp;lt;=frame_size(1) &amp;&amp; ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C2&amp;lt;=frame_size(2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M(R1:R2,C1) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M(R1:R2,C2) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M(R1,C1:C2) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M(R2,C1:C2) = 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
end&lt;br&gt;
toc&lt;br&gt;
% 0.043 seconds on my computer. I was hoping to get &amp;lt;0.01&lt;br&gt;
&lt;br&gt;
imagesc(M)&lt;br&gt;
colormap gray&lt;br&gt;
set(gcf,'position',[200 200 frame_size(2) frame_size(1)])&lt;br&gt;
set(gca,'position',[0 0 1 1]);</description>
    </item>
    <item>
      <pubDate>Wed, 07 May 2008 23:35:04 -0400</pubDate>
      <title>Re: vectorize drawing of bounding boxes</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/168878#430922</link>
      <author>Roger Stafford</author>
      <description>&quot;jay vaughan&quot; &amp;lt;jvaughan5.nospam@gmail.com&amp;gt; wrote in message &amp;lt;fvspfn&lt;br&gt;
$m20$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Hi,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am trying to optimize the speed of drawing a bunch of&lt;br&gt;
&amp;gt; bounding boxes on identified objects. I know to try to avoid&lt;br&gt;
&amp;gt; loops, but wasn't sure how to vectorize the code (below).&lt;br&gt;
&amp;gt; Any ideas on vectorizing this process or speeding it up in&lt;br&gt;
&amp;gt; general? Eventually it will be done many times per second,&lt;br&gt;
&amp;gt; so I do need the speed.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; A simulation of this below where the first part generates&lt;br&gt;
&amp;gt; the coordinates the objects, and the second part is a loop&lt;br&gt;
&amp;gt; that creates the boxes.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % FIRST PART, CREATE (RANDOM) BOX COORDINTES&lt;br&gt;
&amp;gt; num_boxes= 1000;&lt;br&gt;
&amp;gt; box_size= 13;&lt;br&gt;
&amp;gt; frame_size = [512 512];&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; rows = (frame_size(1)-1)*rand(num_boxes,1);&lt;br&gt;
&amp;gt; cols = (frame_size(2)-1)*rand(num_boxes,1);&lt;br&gt;
&amp;gt; box_coords = round([rows cols]);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; % SECOND PART, CREATE BOXES (IF NOT TOO CLOSE TO EDGE)&lt;br&gt;
&amp;gt; M = zeros(frame_size);&lt;br&gt;
&amp;gt; tic&lt;br&gt;
&amp;gt; for k = 1:size(box_coords,1)&lt;br&gt;
&amp;gt;     dl = floor(box_size/2);&lt;br&gt;
&amp;gt;     dr = ceil(box_size/2);&lt;br&gt;
&amp;gt;     R1 = box_coords(k,1)-dl;&lt;br&gt;
&amp;gt;     R2 = box_coords(k,1)+dr;&lt;br&gt;
&amp;gt;     C1 = box_coords(k,2)-dl;&lt;br&gt;
&amp;gt;     C2 = box_coords(k,2)+dl;&lt;br&gt;
&amp;gt;     if R1&amp;gt;=1 &amp;&amp; C1&amp;gt;=1 &amp;&amp; R2&amp;lt;=frame_size(1) &amp;&amp; ...&lt;br&gt;
&amp;gt;       C2&amp;lt;=frame_size(2)&lt;br&gt;
&amp;gt;         M(R1:R2,C1) = 1;&lt;br&gt;
&amp;gt;         M(R1:R2,C2) = 1;&lt;br&gt;
&amp;gt;         M(R1,C1:C2) = 1;&lt;br&gt;
&amp;gt;         M(R2,C1:C2) = 1;&lt;br&gt;
&amp;gt;     end&lt;br&gt;
&amp;gt; end&lt;br&gt;
&amp;gt; toc&lt;br&gt;
&amp;gt; % 0.043 seconds on my computer. I was hoping to get &amp;lt;0.01&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; imagesc(M)&lt;br&gt;
&amp;gt; colormap gray&lt;br&gt;
&amp;gt; set(gcf,'position',[200 200 frame_size(2) frame_size(1)])&lt;br&gt;
&amp;gt; set(gca,'position',[0 0 1 1]);&lt;br&gt;
---------&lt;br&gt;
&amp;nbsp;&amp;nbsp;A couple of thoughts come to mind.  First, it seems inefficient to not &lt;br&gt;
generate the &quot;box_coords&quot; in such a way that the corresponding &quot;boxes&quot; &lt;br&gt;
cannot extend past the bounds of the 'frame_size'.  That should be very easy &lt;br&gt;
to do by altering the way 'rows' and 'cols' are originally defined.  Then the 'if' &lt;br&gt;
part in your for-loop would be unnecessary.  The execution of this 'if' portion &lt;br&gt;
may represent a substantial part of your execution time.&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;The second is more difficult to describe and may not actually save you time.  &lt;br&gt;
Only experimenting would determine this.  You could define a box &quot;template&quot; &lt;br&gt;
centered at (0,0) just once and convert its 52 or so pairs of subscripts into &lt;br&gt;
single indices which apply to the frame_size.  The same could be done with &lt;br&gt;
the set of 1000 'box_coords' pairs.  Then you could call 'ndgrid' and add the &lt;br&gt;
outputs to obtain every possible sum of the 52 linear indices with those of &lt;br&gt;
the 1000 centers to get an array of 52000 indices.  These can then be used to &lt;br&gt;
set the corresponding points in M to 1's.  The following shows how this can &lt;br&gt;
be done.&lt;br&gt;
&lt;br&gt;
&amp;nbsp;[m,n] = size(frame_size);&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;% Create a box template centered at (0,0)&lt;br&gt;
&amp;nbsp;t = [(-dl:dr)-m*dl,(-dl:dr)+m*dr, ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-dl+m*(-dl+1:dr-1),dr+m*(-dl+1:dr-1)];&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;% Convert 'box_coords' to linear indices in 'frame_size'&lt;br&gt;
&amp;nbsp;b = box_coords(:,1)+m*(box_coords(:,2)-1);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;% Now get all 52000 possible combined sums&lt;br&gt;
&amp;nbsp;[T,B] = ndgrid(t,b);&lt;br&gt;
&amp;nbsp;p = T(:)+B(:); % p is 52000 by 1 in size&lt;br&gt;
&amp;nbsp;M = zeros(size(frame_size));&lt;br&gt;
&amp;nbsp;M(p) = 1; % Place 52000 1's in M&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;This of course depends on your having carried out the first suggestion so &lt;br&gt;
that no box extends beyond the boundaries of 'frame_size'.&lt;br&gt;
&lt;br&gt;
Roger Stafford</description>
    </item>
    <item>
      <pubDate>Thu, 08 May 2008 04:37:03 -0400</pubDate>
      <title>Re: vectorize drawing of bounding boxes</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/168878#430951</link>
      <author>jay vaughan</author>
      <description>&quot;Roger Stafford&quot; &amp;lt;ellieandrogerxyzzy@mindspring.com.invalid&amp;gt;&lt;br&gt;
wrote in message &amp;lt;fvteb8$q31$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;jay vaughan&quot; &amp;lt;jvaughan5.nospam@gmail.com&amp;gt; wrote in&lt;br&gt;
message &amp;lt;fvspfn&lt;br&gt;
&amp;gt; $m20$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; Hi,&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; I am trying to optimize the speed of drawing a bunch of&lt;br&gt;
&amp;gt; &amp;gt; bounding boxes on identified objects. I know to try to avoid&lt;br&gt;
&amp;gt; &amp;gt; loops, but wasn't sure how to vectorize the code (below).&lt;br&gt;
&amp;gt; &amp;gt; Any ideas on vectorizing this process or speeding it up in&lt;br&gt;
&amp;gt; &amp;gt; general? Eventually it will be done many times per second,&lt;br&gt;
&amp;gt; &amp;gt; so I do need the speed.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; A simulation of this below where the first part generates&lt;br&gt;
&amp;gt; &amp;gt; the coordinates the objects, and the second part is a loop&lt;br&gt;
&amp;gt; &amp;gt; that creates the boxes.&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; % FIRST PART, CREATE (RANDOM) BOX COORDINTES&lt;br&gt;
&amp;gt; &amp;gt; num_boxes= 1000;&lt;br&gt;
&amp;gt; &amp;gt; box_size= 13;&lt;br&gt;
&amp;gt; &amp;gt; frame_size = [512 512];&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; rows = (frame_size(1)-1)*rand(num_boxes,1);&lt;br&gt;
&amp;gt; &amp;gt; cols = (frame_size(2)-1)*rand(num_boxes,1);&lt;br&gt;
&amp;gt; &amp;gt; box_coords = round([rows cols]);&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; % SECOND PART, CREATE BOXES (IF NOT TOO CLOSE TO EDGE)&lt;br&gt;
&amp;gt; &amp;gt; M = zeros(frame_size);&lt;br&gt;
&amp;gt; &amp;gt; tic&lt;br&gt;
&amp;gt; &amp;gt; for k = 1:size(box_coords,1)&lt;br&gt;
&amp;gt; &amp;gt;     dl = floor(box_size/2);&lt;br&gt;
&amp;gt; &amp;gt;     dr = ceil(box_size/2);&lt;br&gt;
&amp;gt; &amp;gt;     R1 = box_coords(k,1)-dl;&lt;br&gt;
&amp;gt; &amp;gt;     R2 = box_coords(k,1)+dr;&lt;br&gt;
&amp;gt; &amp;gt;     C1 = box_coords(k,2)-dl;&lt;br&gt;
&amp;gt; &amp;gt;     C2 = box_coords(k,2)+dl;&lt;br&gt;
&amp;gt; &amp;gt;     if R1&amp;gt;=1 &amp;&amp; C1&amp;gt;=1 &amp;&amp; R2&amp;lt;=frame_size(1) &amp;&amp; ...&lt;br&gt;
&amp;gt; &amp;gt;       C2&amp;lt;=frame_size(2)&lt;br&gt;
&amp;gt; &amp;gt;         M(R1:R2,C1) = 1;&lt;br&gt;
&amp;gt; &amp;gt;         M(R1:R2,C2) = 1;&lt;br&gt;
&amp;gt; &amp;gt;         M(R1,C1:C2) = 1;&lt;br&gt;
&amp;gt; &amp;gt;         M(R2,C1:C2) = 1;&lt;br&gt;
&amp;gt; &amp;gt;     end&lt;br&gt;
&amp;gt; &amp;gt; end&lt;br&gt;
&amp;gt; &amp;gt; toc&lt;br&gt;
&amp;gt; &amp;gt; % 0.043 seconds on my computer. I was hoping to get &amp;lt;0.01&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; imagesc(M)&lt;br&gt;
&amp;gt; &amp;gt; colormap gray&lt;br&gt;
&amp;gt; &amp;gt; set(gcf,'position',[200 200 frame_size(2) frame_size(1)])&lt;br&gt;
&amp;gt; &amp;gt; set(gca,'position',[0 0 1 1]);&lt;br&gt;
&amp;gt; ---------&lt;br&gt;
&amp;gt;   A couple of thoughts come to mind.  First, it seems&lt;br&gt;
inefficient to not &lt;br&gt;
&amp;gt; generate the &quot;box_coords&quot; in such a way that the&lt;br&gt;
corresponding &quot;boxes&quot; &lt;br&gt;
&amp;gt; cannot extend past the bounds of the 'frame_size'.  That&lt;br&gt;
should be very easy &lt;br&gt;
&amp;gt; to do by altering the way 'rows' and 'cols' are originally&lt;br&gt;
defined.  Then the 'if' &lt;br&gt;
&amp;gt; part in your for-loop would be unnecessary.  The execution&lt;br&gt;
of this 'if' portion &lt;br&gt;
&amp;gt; may represent a substantial part of your execution time.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;   The second is more difficult to describe and may not&lt;br&gt;
actually save you time.  &lt;br&gt;
&amp;gt; Only experimenting would determine this.  You could define&lt;br&gt;
a box &quot;template&quot; &lt;br&gt;
&amp;gt; centered at (0,0) just once and convert its 52 or so pairs&lt;br&gt;
of subscripts into &lt;br&gt;
&amp;gt; single indices which apply to the frame_size.  The same&lt;br&gt;
could be done with &lt;br&gt;
&amp;gt; the set of 1000 'box_coords' pairs.  Then you could call&lt;br&gt;
'ndgrid' and add the &lt;br&gt;
&amp;gt; outputs to obtain every possible sum of the 52 linear&lt;br&gt;
indices with those of &lt;br&gt;
&amp;gt; the 1000 centers to get an array of 52000 indices.  These&lt;br&gt;
can then be used to &lt;br&gt;
&amp;gt; set the corresponding points in M to 1's.  The following&lt;br&gt;
shows how this can &lt;br&gt;
&amp;gt; be done.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;  [m,n] = size(frame_size);&lt;br&gt;
&amp;gt;  &lt;br&gt;
&amp;gt;  % Create a box template centered at (0,0)&lt;br&gt;
&amp;gt;  t = [(-dl:dr)-m*dl,(-dl:dr)+m*dr, ...&lt;br&gt;
&amp;gt;       -dl+m*(-dl+1:dr-1),dr+m*(-dl+1:dr-1)];&lt;br&gt;
&amp;gt;  &lt;br&gt;
&amp;gt;  % Convert 'box_coords' to linear indices in 'frame_size'&lt;br&gt;
&amp;gt;  b = box_coords(:,1)+m*(box_coords(:,2)-1);&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;  % Now get all 52000 possible combined sums&lt;br&gt;
&amp;gt;  [T,B] = ndgrid(t,b);&lt;br&gt;
&amp;gt;  p = T(:)+B(:); % p is 52000 by 1 in size&lt;br&gt;
&amp;gt;  M = zeros(size(frame_size));&lt;br&gt;
&amp;gt;  M(p) = 1; % Place 52000 1's in M&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;    This of course depends on your having carried out the&lt;br&gt;
first suggestion so &lt;br&gt;
&amp;gt; that no box extends beyond the boundaries of 'frame_size'.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Roger Stafford&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
Roger,&lt;br&gt;
&lt;br&gt;
that's a clever use of indexing...and I think it should&lt;br&gt;
work. I will test it out tomorrow. Thanks!&lt;br&gt;
&lt;br&gt;
J</description>
    </item>
  </channel>
</rss>

