# Vectorization, or boundary tracing in julia

**URL:** <https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638>\
**Category:** Signal and Image Processing\
**Created:** [April 19, 2023, 3:21am UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638 "2023-04-19T03:21:08Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![alex-s-gardner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alex-s-gardner/32/30210_2.png) [@alex-s-gardner](https://discourse.julialang.org/u/alex-s-gardner)\
**Post date:** [April 19, 2023, 3:21am UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/1 "2023-04-19T03:21:08Z")

</div>

Does anyone know of a julia package that can generate vectors/polygons (i,j) for the boundaries of areas found within a BitMatrix.

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [April 19, 2023, 3:27am UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/2 "2023-04-19T03:27:23Z")

</div>

your question doesn’t quite make sense, can you give people an example input output?

---

<div class="post-metadata">

**Author:** ![alex-s-gardner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alex-s-gardner/32/30210_2.png) [@alex-s-gardner](https://discourse.julialang.org/u/alex-s-gardner)\
**Post date:** [April 19, 2023, 4:13am UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/3 "2023-04-19T04:13:48Z")

</div>

Given a BitArray M:

```julia
M = falses(5,5)
M[2, 2:3] .= true

julia> M
5×5 BitMatrix:
 0 0 0 0 0
 0 1 1 0 0
 0 0 0 0 0
 0 0 0 0 0
 0 0 0 0 0

```

I want the polygon(s) enclosing the true values in M

```julia
j = [1.5, 2.5, 3.5, 3.5. 2.5, 1.5, 1.5] 
i = [1.5, 1.5, 1.5, 2.5. 2.5, 2.5, 1.5] 

```

My guess is that something like this would be used frequently in image segmentation

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [April 19, 2023, 3:34pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/4 "2023-04-19T15:34:33Z")

</div>

We have vectorization (or polygon tracing) in the GeoStats.jl stack, take a look at the Potrace transform:

```julia
using GeoStats

help?> Potrace
search: Potrace ExponentialVariogram

  Potrace(col; [ϵ])

  Trace polygons on 2D image data with Selinger's Potrace algorithm.

  The categories stored in column col are converted into binary masks, which are
  then traced into multi-polygons. When provided, the option ϵ is forwarded to the
  [Selinger[@ref] simplification algorithm.

  References
  ============

    • Selinger, P. 2003. Potrace: A polygon-based tracing algorithm
       (https://potrace.sourceforge.net/potrace.pdf)

```

It will return a Meshes.jl geometry with all the related functionality.

MWE:

```julia
using GeoStats

gdata = georef((mask=mask,))

gdata |> Potrace(:mask)

```

---

<div class="post-metadata">

**Author:** ![alex-s-gardner](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alex-s-gardner/32/30210_2.png) [@alex-s-gardner](https://discourse.julialang.org/u/alex-s-gardner)\
**Post date:** [April 19, 2023, 4:27pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/5 "2023-04-19T16:27:15Z")

</div>

Fantastic, exactly what I was looking for. Thanks!

---

<div class="post-metadata">

**Author:** ![Ashwani\_Rathee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ashwani_rathee/32/49551_2.png) [@Ashwani\_Rathee](https://discourse.julialang.org/u/Ashwani_Rathee)\
**Post date:** [April 30, 2023, 3:15pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/6 "2023-04-30T15:15:20Z")

</div>

@juliohm can we please have this algorithm in ImageBinarization.jl too? Potrace is very useful raster-to-vector converter 🙂

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [April 30, 2023, 3:29pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/7 "2023-04-30T15:29:12Z")

</div>

@Ashwani_Rathee ImageBinarization.jl has a different goal. Potrace returns Meshes.jl geometries, not images of 0s and 1s.

---

<div class="post-metadata">

**Author:** ![Ashwani\_Rathee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ashwani_rathee/32/49551_2.png) [@Ashwani\_Rathee](https://discourse.julialang.org/u/Ashwani_Rathee)\
**Post date:** [April 30, 2023, 3:37pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/8 "2023-04-30T15:37:40Z")

</div>

I know ImageBinarization.jl has a different goal but it could be a good utility function for use in future. I remember utilizing potrace-js for converting raster image to its vector state. I utilized this to convert a brain tumor mask to its path as shown here: [MHacks 21: Brain Tumor Segmentation Annotation tool - YouTube](https://youtu.be/NqmgTwvg_Dw?t=151). So I think it could be a good addition to the set of algorithms we provide. Ofcourse we might need to adapt it to suit ImageBinarization.jl better.

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [April 30, 2023, 4:03pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/9 "2023-04-30T16:03:18Z")

</div>

It is a matter of scope and software design. A package for binarization should not contain a function for vectorization and vice-versa. Also, our implementation is tightly integrated with the Meshes.jl/GeoStats.jl stack, it relies on types that other stacks don’t have.

---

<div class="post-metadata">

**Author:** ![joa-quim](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/joa-quim/32/227_2.png) [@joa-quim](https://discourse.julialang.org/u/joa-quim)\
**Post date:** [April 30, 2023, 4:08pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/10 "2023-04-30T16:08:31Z")

</div>

`potrace` has been in my TODO list for a long time to try to reproduce the service provided by [https://vectormagic.com/](https://vectormagic.com/)

---

<div class="post-metadata">

**Author:** ![Ashwani\_Rathee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ashwani_rathee/32/49551_2.png) [@Ashwani\_Rathee](https://discourse.julialang.org/u/Ashwani_Rathee)\
**Post date:** [April 30, 2023, 4:14pm UTC](https://discourse.julialang.org/t/vectorization-or-boundary-tracing-in-julia/97638/11 "2023-04-30T16:14:38Z")

</div>

We can kind of say then that it’s a useful tool to have?
