[Insight-users] Polygon rasterizer (aka scanline conversion)

Frank Miller frankmiller at jhu.edu
Mon Feb 6 12:04:34 EST 2006


Zachary,

I might have a solution for you.

I was working on a similar problem a while ago.  I was just learning ITK 
and was not aware of the PolyLineMask2DImageFilter but in my search for 
such a filter, I came across this solution.

http://public.kitware.com/pipermail/insight-users/2005-June/013614.html

I am not sure that this iterator attains the sub-pixel precision you are 
looking for but I suspect that it does or could be made to do so.

I had some trouble with this code at first but I made a few changes and 
it seems to work fine now. I have attached a path file that can be used 
on the code in the above link. You should know, however, that I have not 
taken the time to understand the changes that I made. I just hacked on 
it until it worked. Depending on you application, you might want to be 
more scrupulous.

Note: When you download the code from the link, change the extension to 
.tar.gz

If speed is not an issue, you might try what Jim suggested in this post.

http://public.kitware.com/pipermail/insight-users/2005-October/015297.html

"A brute force way to do what you want is to construct a 
PolygonSpatialObject and use a SpatialObjectToImageFilter to generate 
the initial implicit function."

I have not tried this.

Good luck,

Frank

Zachary Pincus wrote:
> Hello folks,
> 
> Having just finished writing a filter to turn images into closed  
> parametric paths, I decided to turn my attention to the opposite  
> problem: rasterizing (or "scanline converting") a polygon represented  
> as a PolyLineParametricPath.
> 
> ITK does contain such an algorithm: PolyLineMask2DImageFilter.  However, 
> this  method only operates at pixel precision . This means  that it 
> cannot guarantee that if a pixel center is inside the  geometric 
> polygon, that pixel will be "on" in the rasterized polygon  and ditto 
> for the outside/off case. Large contours will be distorted  at the 
> edges, and small contours can be completely changed or not  even drawn.
> 
> The PolyLineMask2DImageFilter is good at what it does: quickly  
> rasterizing an approximation of a large polygon. However, I'm  
> interested in getting a filter working which will provide precise  
> scanline conversion. Looking over the commonly-used algorithm to do  
> this, I realize that implementing it from scratch will be completely  
> unpleasant -- too many edge cases. So I hope to find a good polygon  
> rasterizer to port to ITK. Does anyone know of a simple reference  
> implementation? (No antialiasing necessary.) Perhaps somewhere in VTK  
> is a polygon rasterizer that could be ported to ITK with little effort?
> 
> Any suggestions would be helpful.
> 
> Zach
> 
> PS. Here's an overview of the "standard" scanline conversion  algorithm. 
> There are just too many corner cases (ha! literally!) for  this to sound 
> like fun to implement from scratch.
> http://www.dgp.toronto.edu/~ah/csc418/fall_2001/notes/scanconv.html
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
-------------- next part --------------
diff -Naur PolygonScanConversion/itkPolygonScanConversionConstIterator.txx NewPolygonScanConversion/itkPolygonScanConversionConstIterator.txx
--- PolygonScanConversion/itkPolygonScanConversionConstIterator.txx	2005-06-15 07:40:50.000000000 -0400
+++ NewPolygonScanConversion/itkPolygonScanConversionConstIterator.txx	2006-02-06 10:44:25.000000000 -0500
@@ -21,7 +21,7 @@
     IndexType firstIndex = *(vertices.begin());
     for (typename IndexListType::const_iterator it = vertices.begin(); it != vertices.end(); ++it)
     {
-      for (int i=0; i < ImageIteratorDimension; ++i)
+      for ( unsigned int i=0; i < ImageIteratorDimension; ++i)
       {
         if ((*it)[i] != firstIndex[i])
         {
@@ -314,16 +314,16 @@
   // Update the active edges and move them to a temporary storage to keep
   // them sorted after the update.
   EdgeListType temporaryActiveEdgeList;
-  EdgeListType::const_iterator it = m_activeEdgeList.begin();
+  EdgeListType::iterator it = m_activeEdgeList.begin();
   while (it != m_activeEdgeList.end())
   {
     Linear2DIndexInterpolator *line = *it;
 
     // Remove the line from the list of active edges. If it is still active
     // after it has been updated, it will be inserted again.
-    EdgeListType::const_iterator deleteIt = it;
+    EdgeListType::iterator deleteIt = it;
     ++it;
-    m_activeEdgeList.erase(deleteIt);
+    m_activeEdgeList.erase( deleteIt );
 
     if (line->IsAtLast())
     {


More information about the Insight-users mailing list