Img2Num C
API Documentation
Loading...
Searching...
No Matches
cimg2num.cpp
Go to the documentation of this file.
1#include "cimg2num.h"
2
3#include "img2num.h"
4#include "img2num/Error.h"
5
6#include <cstring>
7
8extern "C" {
9
10static img2num::ImageToSvgConfig to_cpp(const img2num_ImageToSvgConfig& c) {
11 img2num::ImageToSvgConfig cfg {};
12
13 cfg.bilateral_filter.sigma_spatial = c.bilateral_filter.sigma_spatial;
14 cfg.bilateral_filter.sigma_range = c.bilateral_filter.sigma_range;
15
16 cfg.kmeans.k = c.kmeans.k;
17 cfg.kmeans.max_iter = c.kmeans.max_iter;
18
19 cfg.min_cluster_area = c.min_cluster_area;
20 cfg.min_thickness = c.min_thickness;
21 cfg.color_space = c.color_space;
22
23 return cfg;
24}
25
26static img2num_ImageToSvgConfig to_c(const img2num::ImageToSvgConfig& cpp) {
28
29 cfg.bilateral_filter.sigma_spatial = cpp.bilateral_filter.sigma_spatial;
30 cfg.bilateral_filter.sigma_range = cpp.bilateral_filter.sigma_range;
31
32 cfg.kmeans.k = cpp.kmeans.k;
33 cfg.kmeans.max_iter = cpp.kmeans.max_iter;
34
35 cfg.min_cluster_area = cpp.min_cluster_area;
36 cfg.min_thickness = cpp.min_thickness;
37 cfg.color_space = cpp.color_space;
38
39 return cfg;
40}
41
43 // Use the defaults from the C++ struct
44 return to_c(img2num::ImageToSvgConfig {});
45}
46
47void img2num_gaussian_blur_fft(uint8_t* image, size_t width, size_t height, double sigma) {
48 img2num::clear_last_error_and_catch(img2num::gaussian_blur_fft, image, width, height, sigma);
49}
50
51void img2num_invert_image(uint8_t* image, int width, int height) {
52 img2num::clear_last_error_and_catch(img2num::invert_image, image, width, height);
53}
54
56 uint8_t* ptr, const int width, const int height, const int num_thresholds
57) {
58 img2num::clear_last_error_and_catch(
59 img2num::threshold_image, ptr, width, height, num_thresholds
60 );
61}
62
64 uint8_t* ptr, const int width, const int height, const int num_thresholds
65) {
66 img2num::clear_last_error_and_catch(
67 img2num::black_threshold_image, ptr, width, height, num_thresholds
68 );
69}
70
72 const uint8_t* data, uint8_t* out_data, int32_t* out_labels, const int32_t width,
73 const int32_t height, const int32_t k, const int32_t max_iter, const uint8_t color_space
74) {
75 img2num::clear_last_error_and_catch(
76 img2num::kmeans, data, out_data, out_labels, width, height, k, max_iter, color_space
77 );
78}
79
81 uint8_t* image, size_t width, size_t height, double sigma_spatial, double sigma_range,
82 uint8_t color_space
83) {
84 img2num::clear_last_error_and_catch(
85 img2num::bilateral_filter, image, width, height, sigma_spatial, sigma_range, color_space
86 );
87}
88
90 const uint8_t* data, const int32_t* labels, const int width, const int height,
91 const int min_area, const int min_thickness
92) {
93 char* result {nullptr};
94 img2num::clear_last_error_and_catch(
95 [&](const uint8_t* d, const int32_t* l, const int w, const int h, const int min_a,
96 const int min_t) {
97 std::string svg {img2num::labels_to_svg(d, l, w, h, min_a, min_t)};
98 result = static_cast<char*>(std::malloc(svg.size() + 1));
99 if (!result) {
100 return; // Allocation failed
101 }
102 std::memcpy(result, svg.c_str(), svg.size() + 1);
103 },
104 data, labels, width, height, min_area, min_thickness
105 );
106 return result;
107}
108
110 const uint8_t* data, const int width, const int height, const img2num_ImageToSvgConfig* config
111) {
113
114 const img2num_ImageToSvgConfig& cfg {config ? *config : default_cfg};
115
116 char* result {nullptr};
117
118 img2num::clear_last_error_and_catch(
119 [&](const uint8_t* d, const int w, const int h) {
120 std::string svg {img2num::image_to_svg(d, w, h, to_cpp(cfg))};
121
122 result = static_cast<char*>(std::malloc(svg.size() + 1));
123 if (!result) {
124 return; // Allocation failed
125 }
126 std::memcpy(result, svg.c_str(), svg.size() + 1);
127 },
128 data, width, height
129 );
130
131 return result;
132}
133}
char * img2num_image_to_svg(const uint8_t *data, const int width, const int height, const img2num_ImageToSvgConfig *config)
Convert labeled regions of an image into an SVG string.
Definition cimg2num.cpp:109
char * img2num_labels_to_svg(const uint8_t *data, const int32_t *labels, const int width, const int height, const int min_area, const int min_thickness)
Convert labeled regions of an image into an SVG string.
Definition cimg2num.cpp:89
void img2num_threshold_image(uint8_t *ptr, const int width, const int height, const int num_thresholds)
Apply a thresholding operation to an image.
Definition cimg2num.cpp:55
img2num_ImageToSvgConfig img2num_ImageToSvgConfig_default(void)
Definition cimg2num.cpp:42
void img2num_invert_image(uint8_t *image, int width, int height)
Invert the pixel values of an image.
Definition cimg2num.cpp:51
void img2num_gaussian_blur_fft(uint8_t *image, size_t width, size_t height, double sigma)
Apply a Gaussian blur to an image using FFT.
Definition cimg2num.cpp:47
void img2num_black_threshold_image(uint8_t *ptr, const int width, const int height, const int num_thresholds)
Apply black-thresholding to an image.
Definition cimg2num.cpp:63
void img2num_kmeans(const uint8_t *data, uint8_t *out_data, int32_t *out_labels, const int32_t width, const int32_t height, const int32_t k, const int32_t max_iter, const uint8_t color_space)
Perform k-means clustering on image data.
Definition cimg2num.cpp:71
void img2num_bilateral_filter(uint8_t *image, size_t width, size_t height, double sigma_spatial, double sigma_range, uint8_t color_space)
Apply bilateral filtering to an image.
Definition cimg2num.cpp:80
Core image processing functions for img2num project.
Configuration options for image_to_svg.
Definition cimg2num.h:21
int min_thickness
Minimum thickness (in pixels) for a region to be included in the SVG.
Definition cimg2num.h:45
int min_cluster_area
Minimum area (in pixels) for a region to be included in the SVG.
Definition cimg2num.h:43
struct img2num_ImageToSvgConfig::KMeansConfig kmeans
struct img2num_ImageToSvgConfig::BilateralFilterConfig bilateral_filter