{"id":1370,"date":"2024-08-29T17:33:44","date_gmt":"2024-08-29T17:33:44","guid":{"rendered":"https:\/\/summergeometry.org\/sgi2024\/?p=1370"},"modified":"2024-11-13T15:03:16","modified_gmt":"2024-11-13T15:03:16","slug":"using-bicubic-curves-for-a-differentiable-representation-of-2d-curve-networks","status":"publish","type":"post","link":"https:\/\/summergeometry.org\/sgi2024\/using-bicubic-curves-for-a-differentiable-representation-of-2d-curve-networks\/","title":{"rendered":"Using Bicubic Curves for a Differentiable Representation of 2D Curve Networks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>SGI Fellows: <\/strong>Harini Rammohan, Ashlyn Lee, Diana Aldana Moreno, Ehsan Shams, Taylor Hospodarec <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Project Mentor:<\/strong> Mikhail Bessmeltsev<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SGI Volunteer:<\/strong> Daniel Perazzo<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Raster vs Vector Images<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Raster and vector graphics are two fundamental types of image representations used in digital design, each with distinct characteristics and applications. A raster image is a collection of colored pixels in a bitmap, making it well-suited for capturing detailed, complex images like photographs. However, raster graphics provide no additional information about the structure of the object they represent. This limitation can be problematic in scenarios where precision and scalability are essential. For example, representing an artist&#8217;s sketch as a raster image may result in jagged curves and the loss of fine details from the original sketch. In such cases, a vector graphics representation is preferred. Unlike raster images, vector graphics use mathematical equations to define shapes, lines, and curves, allowing unlimited scalability without losing quality. This makes vector graphics ideal for logos, illustrations, and other designs where clarity and precision are crucial, regardless of size.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"378\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/rastervsvec.png\" alt=\"\" class=\"wp-image-1371\" style=\"width:515px;height:auto\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/rastervsvec.png 598w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/rastervsvec-300x190.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><figcaption class=\"wp-element-caption\">Bitmap and vector images on magnifying <br>Image from <a href=\"https:\/\/en.wikipedia.org\/wiki\/Image_tracing\">https:\/\/en.wikipedia.org\/wiki\/Image_tracing<\/a>                                                 <\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Bicubic Curves for Vectorization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In this project, we aimed to obtain a vector graphics representation of a given sketch in raster form using bicubic curves. A bicubic curve is a polynomial of the form<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/wikimedia.org\/api\/rest_v1\/media\/math\/render\/svg\/c2c5d6b4135dbcd267ac33b49247b0a8fddbbe62\" alt=\"{\\displaystyle p(x,y)=\\sum \\limits _{i=0}^{3}\\sum _{j=0}^{3}a_{ij}x^{i}y^{j}.}\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The value a bicubic function takes on a given grid cell is assumed to be uniquely determined by the value the function and its derivatives take at the vertices of the cell. Using bicubic curves allows us to more easily handle self-intersections and closed curves. Additionally, we can create discontinuities at the edges of grid cells by adding some noise to the given bicubic function. This will enable us to vectorize not only smooth but also discontinuous sketches.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/bicubic.png\" alt=\"\" class=\"wp-image-1438\" style=\"width:462px;height:auto\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/bicubic.png 640w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/bicubic-300x225.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption class=\"wp-element-caption\">A bicubic curve with a self-intersection at (0, 0)<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"500\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-12-at-10.31.25-1.png\" alt=\"\" class=\"wp-image-1441\" style=\"width:407px;height:auto\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-12-at-10.31.25-1.png 508w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-12-at-10.31.25-1-300x295.png 300w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><figcaption class=\"wp-element-caption\">Adding discontinuities at the grid cell edges<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Preliminary Work<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">During the first week of the project, we implemented the following using Python:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>For any given grid cell, given its size and the function value p(v) as well as the derivatives p<sub>x<\/sub>(v), p<sub>y<\/sub>(v), and p<sub>xy<\/sub>(v) at each vertex v, we reconstructed and plotted the unique bicubic function satisfying these values. This reduces to solving a system of sixteen linear equations, following the steps mentioned in the &#8220;Bicubic Interpolation&#8221; Wikipedia page {4}. <\/li>\n\n\n\n<li>We added noise to the bicubic functions in each cell to create discontinuities. We also found the endpoints of curves in the grid due to the discontinuities formed above.<\/li>\n\n\n\n<li>At each point in the grid, we found the gradient of the bicubic functions using <em>fsolve <\/em>{5} and used them to plot the tangents at some points on the curves.<\/li>\n\n\n\n<li>We looked for self-intersections within a grid cell by finding saddle points of the bicubic function (such that the function value is 0 there). If the function is factorizable, it suffices to find the points of intersections between the 0-levels of two or more factors. Here too, we used <em>fsolve<\/em>.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"702\" height=\"700\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.15.56.png\" alt=\"\" class=\"wp-image-1496\" style=\"width:440px;height:auto\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.15.56.png 702w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.15.56-300x300.png 300w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.15.56-150x150.png 150w\" sizes=\"auto, (max-width: 702px) 100vw, 702px\" \/><figcaption class=\"wp-element-caption\">Bicubic curves with tangents produced by picking four random values between -1 and 1 at each vertex<\/figcaption><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"982\" height=\"726\" data-id=\"1497\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.33.01.png\" alt=\"\" class=\"wp-image-1497\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.33.01.png 982w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.33.01-300x222.png 300w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.33.01-768x568.png 768w\" sizes=\"auto, (max-width: 982px) 100vw, 982px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"982\" height=\"728\" data-id=\"1498\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.31.51.png\" alt=\"\" class=\"wp-image-1498\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.31.51.png 982w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.31.51-300x222.png 300w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-13-at-21.31.51-768x569.png 768w\" sizes=\"auto, (max-width: 982px) 100vw, 982px\" \/><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\">Bicubic curves with self-intersections marked<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Optimization and Rendering<\/h3>\n\n\n\n<h5 class=\"wp-block-heading\">Vectorization<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">During the second week of the project, I attempted to vectorize the bitmap image by minimizing a function known as the L2 loss. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The L2 loss between the predicted and target bitmap images is computed as the sum of the squared differences for each pixel. To account for this, I gave the bicubic curves some thickness by replacing the curve&nbsp;Z = 0 (here Z = p(x, y) is a bicubic function) in each grid cell with the image of the function e<sup>-Z\u00b2<\/sup>. This allowed me to determine the color at each point in the grid, defining the color of each pixel as the color at its center. Additionally, I calculated the gradient of the color at each point in a grid cell with respect to the coordinates of the corresponding bicubic curve. Using this approach, I defined the L2 loss function and its gradient as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Defining the loss function\ndef L2_loss(coeffs, d, width, height, x, y):\n    c = np.zeros((height, width))\n    for i in range(height):\n        for j in range(width):\n            c&#091;i, j] = np.exp(-bicubic_function(x&#091;j], y&#091;i], coeffs) ** 2)\n    return np.sum((c - d) ** 2)\n\n# Derivative of c(x, y) wrt to the coeff of the x ** m * y ** n term\ndef colour_gradient(x, y, coeffs, m, n):\n    return np.exp(-bicubic_function(x, y, coeffs) ** 2) * (-2 * bicubic_function(x, y, coeffs) * x ** m * y ** n)\n\n# Gradient of the loss function\ndef gradient(coeffs, d, width, height, x, y):\n    grad = np.zeros(16,)\n    c = np.zeros((height, width))\n    for i in range(height):\n        for j in range(width):\n            c&#091;i, j] = np.exp(-bicubic_function(x&#091;j], y&#091;i], coeffs) ** 2)\n            for n in range(4):\n                for m in range(4):\n                    k = m + 4 * n\n                    grad&#091;k] += 2 * (c&#091;i, j] - d&#091;i, j]) * colour_gradient(x&#091;j], y&#091;i], coeffs, m, n)\n    return grad<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In this code, d is the normalized numpy array of the target image and&nbsp;x and y&nbsp;are the lists of the x- and y-coordinates of the corresponding pixel centers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Minimizing this L2 loss in each grid cell gives the vectorization that best approximates the target raster image.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Results<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Below are some test bitmap images and their vectorized outputs.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"708\" data-id=\"1787\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image-33.png\" alt=\"\" class=\"wp-image-1787\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image-33.png 722w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image-33-300x294.png 300w\" sizes=\"auto, (max-width: 722px) 100vw, 722px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"584\" height=\"442\" data-id=\"1790\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.33.51.png\" alt=\"\" class=\"wp-image-1790\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.33.51.png 584w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.33.51-300x227.png 300w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"646\" data-id=\"1792\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image2.png\" alt=\"\" class=\"wp-image-1792\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image2.png 676w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/image2-300x287.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"484\" height=\"353\" data-id=\"1793\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/lines.png\" alt=\"\" class=\"wp-image-1793\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/lines.png 484w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/lines-300x219.png 300w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"404\" height=\"330\" data-id=\"1794\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.12.png\" alt=\"\" class=\"wp-image-1794\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.12.png 404w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.12-300x245.png 300w\" sizes=\"auto, (max-width: 404px) 100vw, 404px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"357\" data-id=\"1796\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/shell.png\" alt=\"\" class=\"wp-image-1796\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/shell.png 483w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/shell-300x222.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"978\" height=\"728\" data-id=\"1797\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.25.png\" alt=\"\" class=\"wp-image-1797\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.25.png 978w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.25-300x223.png 300w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.15.25-768x572.png 768w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"359\" data-id=\"1798\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/hand.png\" alt=\"\" class=\"wp-image-1798\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/hand.png 487w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/hand-300x221.png 300w\" sizes=\"auto, (max-width: 487px) 100vw, 487px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"630\" data-id=\"1799\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.29.45.png\" alt=\"\" class=\"wp-image-1799\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.29.45.png 508w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Screenshot-2024-08-18-at-21.29.45-242x300.png 242w\" sizes=\"auto, (max-width: 508px) 100vw, 508px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"476\" height=\"353\" data-id=\"1800\" src=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Figure_1-2.png\" alt=\"\" class=\"wp-image-1800\" srcset=\"https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Figure_1-2.png 476w, https:\/\/summergeometry.org\/sgi2024\/wp-content\/uploads\/2024\/08\/Figure_1-2-300x222.png 300w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Though the curves mimic the structure of the original sketch, they are not always in the same direction as in the actual sketch. It seems like the curves assume this orientation to depict the thickness of the sketch lines.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Our initial plan was to utilize the code developed in the first week to create a differentiable vectorization. This approach would involve differentiating the functions we wrote to find the endpoints and intersections with respect to the coefficients of the bicubic curve. We would also use the tangents we calculated to determine the curve that best fits the original sketch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Throughout the project, we worked with bicubic curves to ensure intersections and continuity of isolines between adjacent grid cells. However, we suspect that biquadratic curves might be sufficient for our needs and could significantly improve the implementation&#8217;s effectiveness. We are yet to confirm this and also explore whether an even lower degree might be feasible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This project has opened up exciting avenues for future work and the potential to refine our methods further promises valuable contributions to the field. I am deeply grateful to Mikhail and Daniel for their guidance and support throughout this project. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">References:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">{1} Guillard, Benoit, et al. &#8220;MeshUDF: Fast and Differentiable Meshing of Unsigned Distance Field Networks&#8221;, ECCV 2022, <a href=\"https:\/\/doi.org\/10.48550\/arXiv.2111.14549\">https:\/\/doi.org\/10.48550\/arXiv.2111.14549<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{2} Yan, Chuan, et al.&nbsp;&#8220;Deep Sketch Vectorization via Implicit Surface Extraction&#8221; <em>SIGGRAPH 202<\/em>4, <a href=\"https:\/\/doi.org\/10.1145\/3658197\">https:\/\/doi.org\/10.1145\/3658197<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{3} Liu, Shichen, et al. &#8220;Soft Rasterizer: A Differentiable Renderer for Image-based 3D Reasoning&#8221; <em>ICCV <\/em>2019, <a href=\"https:\/\/doi.org\/10.48550\/arXiv.1904.01786\">https:\/\/doi.org\/10.48550\/arXiv.1904.01786<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{4} &#8220;Bicubic Interpolation&#8221;. <em>Wikipedia<\/em>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bicubic_interpolation\">https:\/\/en.wikipedia.org\/wiki\/Bicubic_interpolation<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">{5} SciPy &#8211; fsolve (scipy.optimize.fsolve), <a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.optimize.fsolve.html\">https:\/\/docs.scipy.org\/doc\/scipy\/reference\/generated\/scipy.optimize.fsolve.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>SGI Fellows: Harini Rammohan, Ashlyn Lee, Diana Aldana Moreno, Ehsan Shams, Taylor Hospodarec Project Mentor: Mikhail Bessmeltsev SGI Volunteer: Daniel Perazzo Raster vs Vector Images Raster and vector graphics are two fundamental types of image representations used in digital design, each with distinct characteristics and applications. A raster image is a collection of colored pixels [&hellip;]<\/p>\n","protected":false},"author":73,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37],"tags":[],"ppma_author":[17],"class_list":["post-1370","post","type-post","status-publish","format-standard","hentry","category-research"],"authors":[{"term_id":17,"user_id":0,"is_guest":1,"slug":"cap-harini","display_name":"harini","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","author_category":"","first_name":"","last_name":"","user_url":"","job_title":"","description":""}],"_links":{"self":[{"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/posts\/1370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/users\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/comments?post=1370"}],"version-history":[{"count":9,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/posts\/1370\/revisions"}],"predecessor-version":[{"id":3618,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/posts\/1370\/revisions\/3618"}],"wp:attachment":[{"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/media?parent=1370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/categories?post=1370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/tags?post=1370"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/summergeometry.org\/sgi2024\/wp-json\/wp\/v2\/ppma_author?post=1370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}