Skip to content

Commit cbb7bbf

Browse files
authored
Merge pull request #78 from awxkee/f16
Adding anisotropic edge modes
2 parents 421b5b1 + 71ffe23 commit cbb7bbf

File tree

75 files changed

+701
-531
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+701
-531
lines changed

app/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ edition = "2021"
66
[dependencies]
77
half = "2.4.1"
88
image = "0.25.5"
9-
libblur = { path = "../", features = ["nightly_f16", "sse", "avx"], default-features = false }
9+
libblur = { path = "../", features = ["nightly_f16", "sse", "avx", "fft", "neon", "rdm", "nightly_avx512"], default-features = false }
1010
accelerate = { path = "accelerate" }
1111
rayon = "1.10.0"
1212
fast_transpose = "0.2.5"

app/benches/complex/main.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use criterion::{criterion_group, criterion_main, Criterion};
22
use image::ImageReader;
33
use libblur::{
44
filter_1d_complex, filter_1d_complex_fixed_point, BlurImage, BlurImageMut, EdgeMode,
5-
FastBlurChannels, Scalar, ThreadingPolicy,
5+
EdgeMode2D, FastBlurChannels, Scalar, ThreadingPolicy,
66
};
77
use num_complex::Complex;
88

@@ -66,7 +66,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
6666
&mut dst_bytes,
6767
&gaussian_kernel,
6868
&gaussian_kernel,
69-
EdgeMode::Clamp,
69+
EdgeMode2D::new(EdgeMode::Clamp),
7070
Scalar::default(),
7171
ThreadingPolicy::Single,
7272
)
@@ -84,7 +84,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
8484
&mut dst_bytes,
8585
&gaussian_kernel,
8686
&gaussian_kernel,
87-
EdgeMode::Clamp,
87+
EdgeMode2D::new(EdgeMode::Clamp),
8888
Scalar::default(),
8989
ThreadingPolicy::Single,
9090
)
@@ -114,7 +114,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
114114
&mut dst_bytes,
115115
&gaussian_kernel,
116116
&gaussian_kernel,
117-
EdgeMode::Clamp,
117+
EdgeMode2D::new(EdgeMode::Clamp),
118118
Scalar::default(),
119119
ThreadingPolicy::Single,
120120
)
@@ -132,7 +132,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
132132
&mut dst_bytes,
133133
&gaussian_kernel,
134134
&gaussian_kernel,
135-
EdgeMode::Clamp,
135+
EdgeMode2D::new(EdgeMode::Clamp),
136136
Scalar::default(),
137137
ThreadingPolicy::Single,
138138
)

app/benches/fast_gaussian/main.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use criterion::{criterion_group, criterion_main, Criterion};
22
use image::{EncodableLayout, GenericImageView, ImageReader};
33

4-
use libblur::{AnisotropicRadius, BlurImageMut, EdgeMode, FastBlurChannels, ThreadingPolicy};
4+
use libblur::{
5+
AnisotropicRadius, BlurImageMut, EdgeMode, EdgeMode2D, FastBlurChannels, ThreadingPolicy,
6+
};
57

68
pub fn criterion_benchmark(c: &mut Criterion) {
79
let img = ImageReader::open("../assets/test_image_4.png")
@@ -24,7 +26,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
2426
&mut dst_image,
2527
AnisotropicRadius::new(77),
2628
ThreadingPolicy::Adaptive,
27-
EdgeMode::Clamp,
29+
EdgeMode2D::new(EdgeMode::Clamp),
2830
)
2931
.unwrap();
3032
})
@@ -43,7 +45,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
4345
&mut dst_image,
4446
AnisotropicRadius::new(77),
4547
ThreadingPolicy::Single,
46-
EdgeMode::Clamp,
48+
EdgeMode2D::new(EdgeMode::Clamp),
4749
)
4850
.unwrap();
4951
})
@@ -64,7 +66,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
6466
&mut dst_image,
6567
AnisotropicRadius::new(77),
6668
ThreadingPolicy::Single,
67-
EdgeMode::Clamp,
69+
EdgeMode2D::new(EdgeMode::Clamp),
6870
)
6971
.unwrap();
7072
})
@@ -85,7 +87,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
8587
&mut dst_image,
8688
AnisotropicRadius::new(77),
8789
ThreadingPolicy::Single,
88-
EdgeMode::Clamp,
90+
EdgeMode2D::new(EdgeMode::Clamp),
8991
)
9092
.unwrap();
9193
})
@@ -112,7 +114,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
112114
&mut dst_image,
113115
AnisotropicRadius::new(77),
114116
ThreadingPolicy::Adaptive,
115-
EdgeMode::Clamp,
117+
EdgeMode2D::new(EdgeMode::Clamp),
116118
)
117119
.unwrap();
118120
})
@@ -131,7 +133,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
131133
&mut dst_image,
132134
AnisotropicRadius::new(77),
133135
ThreadingPolicy::Single,
134-
EdgeMode::Clamp,
136+
EdgeMode2D::new(EdgeMode::Clamp),
135137
)
136138
.unwrap();
137139
})

app/benches/fast_gaussian_next/main.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use criterion::{criterion_group, criterion_main, Criterion};
22
use image::{EncodableLayout, GenericImageView, ImageReader};
33

4-
use libblur::{AnisotropicRadius, BlurImageMut, EdgeMode, FastBlurChannels, ThreadingPolicy};
4+
use libblur::{
5+
AnisotropicRadius, BlurImageMut, EdgeMode, EdgeMode2D, FastBlurChannels, ThreadingPolicy,
6+
};
57

68
pub fn criterion_benchmark(c: &mut Criterion) {
79
let img = ImageReader::open("../assets/test_image_4.png")
@@ -23,7 +25,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
2325
&mut dst_image,
2426
AnisotropicRadius::new(77),
2527
ThreadingPolicy::Adaptive,
26-
EdgeMode::Clamp,
28+
EdgeMode2D::new(EdgeMode::Clamp),
2729
)
2830
.unwrap();
2931
})
@@ -42,7 +44,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
4244
&mut dst_image,
4345
AnisotropicRadius::new(77),
4446
ThreadingPolicy::Single,
45-
EdgeMode::Clamp,
47+
EdgeMode2D::new(EdgeMode::Clamp),
4648
)
4749
.unwrap();
4850
})
@@ -63,7 +65,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
6365
&mut dst_image,
6466
AnisotropicRadius::new(77),
6567
ThreadingPolicy::Single,
66-
EdgeMode::Clamp,
68+
EdgeMode2D::new(EdgeMode::Clamp),
6769
)
6870
.unwrap();
6971
})
@@ -84,7 +86,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
8486
&mut dst_image,
8587
AnisotropicRadius::new(77),
8688
ThreadingPolicy::Single,
87-
EdgeMode::Clamp,
89+
EdgeMode2D::new(EdgeMode::Clamp),
8890
)
8991
.unwrap();
9092
})
@@ -111,7 +113,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
111113
&mut dst_image,
112114
AnisotropicRadius::new(77),
113115
ThreadingPolicy::Adaptive,
114-
EdgeMode::Clamp,
116+
EdgeMode2D::new(EdgeMode::Clamp),
115117
)
116118
.unwrap();
117119
})
@@ -130,7 +132,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
130132
&mut dst_image,
131133
AnisotropicRadius::new(77),
132134
ThreadingPolicy::Single,
133-
EdgeMode::Clamp,
135+
EdgeMode2D::new(EdgeMode::Clamp),
134136
)
135137
.unwrap();
136138
})

app/benches/gauss/main.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use criterion::{criterion_group, criterion_main, Criterion};
22
use image::{GenericImageView, ImageReader};
33
use libblur::{
44
filter_1d_exact, gaussian_kernel_1d, sigma_size, BlurImage, BlurImageMut, ConvolutionMode,
5-
EdgeMode, FastBlurChannels, GaussianBlurParams, IeeeBinaryConvolutionMode, Scalar,
5+
EdgeMode, EdgeMode2D, FastBlurChannels, GaussianBlurParams, IeeeBinaryConvolutionMode, Scalar,
66
ThreadingPolicy,
77
};
88
use opencv::core::{
@@ -60,7 +60,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
6060
&src_image,
6161
&mut dst_bytes,
6262
GaussianBlurParams::new_from_kernel(3.),
63-
EdgeMode::Clamp,
63+
EdgeMode2D::new(EdgeMode::Clamp.as_2d()),
6464
ThreadingPolicy::Adaptive,
6565
ConvolutionMode::FixedPoint,
6666
)
@@ -107,7 +107,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
107107
&src_image,
108108
&mut dst_bytes,
109109
GaussianBlurParams::new_from_kernel(13.),
110-
EdgeMode::Clamp,
110+
EdgeMode2D::new(EdgeMode::Clamp.as_2d()),
111111
ThreadingPolicy::Adaptive,
112112
ConvolutionMode::Exact,
113113
)
@@ -123,7 +123,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
123123
&src_image,
124124
&mut dst_bytes,
125125
GaussianBlurParams::new_from_kernel(13.),
126-
EdgeMode::Clamp,
126+
EdgeMode2D::new(EdgeMode::Clamp.as_2d()),
127127
ThreadingPolicy::Adaptive,
128128
ConvolutionMode::FixedPoint,
129129
)
@@ -166,7 +166,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
166166
&src_image,
167167
&mut dst_bytes,
168168
GaussianBlurParams::new_from_kernel((25 * 2 + 1) as f64),
169-
EdgeMode::Clamp,
169+
EdgeMode::Clamp.as_2d(),
170170
ThreadingPolicy::Adaptive,
171171
IeeeBinaryConvolutionMode::Normal,
172172
)
@@ -208,7 +208,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
208208
&src_image,
209209
&mut dst_bytes,
210210
GaussianBlurParams::new_from_kernel((51 * 2 + 1) as f64),
211-
EdgeMode::Clamp,
211+
EdgeMode::Clamp.as_2d(),
212212
ThreadingPolicy::Adaptive,
213213
ConvolutionMode::Exact,
214214
)
@@ -235,7 +235,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
235235
&src_image,
236236
&mut dst_bytes,
237237
GaussianBlurParams::new_from_kernel((51 * 2 + 1) as f64),
238-
EdgeMode::Clamp,
238+
EdgeMode::Clamp.as_2d(),
239239
ThreadingPolicy::Adaptive,
240240
ConvolutionMode::FixedPoint,
241241
)
@@ -301,7 +301,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
301301
&src_image,
302302
&mut dst_bytes,
303303
GaussianBlurParams::new((77 * 2 + 1) as u32, (77. * 2. + 1.) / 6.),
304-
EdgeMode::Clamp,
304+
EdgeMode::Clamp.as_2d(),
305305
ThreadingPolicy::Adaptive,
306306
ConvolutionMode::Exact,
307307
)
@@ -317,7 +317,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
317317
&src_image,
318318
&mut dst_bytes,
319319
GaussianBlurParams::new((77 * 2 + 1) as u32, (77. * 2. + 1.) / 6.),
320-
EdgeMode::Clamp,
320+
EdgeMode::Clamp.as_2d(),
321321
ThreadingPolicy::Adaptive,
322322
ConvolutionMode::FixedPoint,
323323
)
@@ -360,7 +360,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
360360
&src_image,
361361
&mut dst_bytes,
362362
GaussianBlurParams::new((77 * 2 + 1) as u32, (77. * 2. + 1.) / 6.),
363-
EdgeMode::Clamp,
363+
EdgeMode::Clamp.as_2d(),
364364
ThreadingPolicy::Adaptive,
365365
ConvolutionMode::Exact,
366366
)
@@ -376,7 +376,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
376376
&src_image,
377377
&mut dst_bytes,
378378
GaussianBlurParams::new_from_kernel(21.),
379-
EdgeMode::Clamp,
379+
EdgeMode::Clamp.as_2d(),
380380
ThreadingPolicy::Adaptive,
381381
ConvolutionMode::Exact,
382382
)
@@ -394,7 +394,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
394394
&mut dst_bytes,
395395
&kernel,
396396
&kernel,
397-
EdgeMode::Clamp,
397+
EdgeMode::Clamp.as_2d(),
398398
Scalar::default(),
399399
ThreadingPolicy::Adaptive,
400400
)
@@ -412,7 +412,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
412412
&mut dst_bytes,
413413
&kernel,
414414
&kernel,
415-
EdgeMode::Clamp,
415+
EdgeMode::Clamp.as_2d(),
416416
Scalar::default(),
417417
ThreadingPolicy::Adaptive,
418418
)
@@ -428,7 +428,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
428428
&src_image,
429429
&mut dst_bytes,
430430
GaussianBlurParams::new((77 * 2 + 1) as u32, (77. * 2. + 1.) / 6.),
431-
EdgeMode::Clamp,
431+
EdgeMode::Clamp.as_2d(),
432432
ThreadingPolicy::Adaptive,
433433
ConvolutionMode::FixedPoint,
434434
)
@@ -491,7 +491,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
491491
&src_image,
492492
&mut dst_bytes,
493493
GaussianBlurParams::new_from_kernel(151.),
494-
EdgeMode::Clamp,
494+
EdgeMode::Clamp.as_2d(),
495495
ThreadingPolicy::Adaptive,
496496
ConvolutionMode::Exact,
497497
)
@@ -507,7 +507,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
507507
&src_image,
508508
&mut dst_bytes,
509509
GaussianBlurParams::new((77 * 2 + 1) as u32, (77. * 2. + 1.) / 6.),
510-
EdgeMode::Clamp,
510+
EdgeMode::Clamp.as_2d(),
511511
ThreadingPolicy::Adaptive,
512512
ConvolutionMode::FixedPoint,
513513
)

app/benches/non_sep_2d/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn criterion_benchmark(c: &mut Criterion) {
3535
&mut dst_image,
3636
&motion,
3737
KernelShape::new(35, 35),
38-
EdgeMode::Clamp,
38+
EdgeMode::Clamp.as_2d(),
3939
Scalar::default(),
4040
ThreadingPolicy::Adaptive,
4141
)

fuzz/bilateral/bilateral.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
use arbitrary::Arbitrary;
3333
use libblur::{
34-
BilateralBlurParams, BlurImage, BlurImageMut, EdgeMode, FastBlurChannels, Scalar,
34+
BilateralBlurParams, BlurImage, BlurImageMut, EdgeMode, EdgeMode2D, FastBlurChannels, Scalar,
3535
ThreadingPolicy,
3636
};
3737
use libfuzzer_sys::fuzz_target;
@@ -40,7 +40,8 @@ use libfuzzer_sys::fuzz_target;
4040
pub struct SrcImage {
4141
pub src_width: u16,
4242
pub src_height: u16,
43-
pub edge_mode: u8,
43+
pub edge_mode_horizontal: u8,
44+
pub edge_mode_vertical: u8,
4445
pub channels: u8,
4546
pub kernel_size: u8,
4647
pub angle: f32,
@@ -54,7 +55,13 @@ fuzz_target!(|data: SrcImage| {
5455
if data.kernel_size % 2 == 0 || data.kernel_size > 17 || data.kernel_size == 0 {
5556
return;
5657
}
57-
let edge_mode = match data.edge_mode % 4 {
58+
let edge_mode_horizontal = match data.edge_mode_horizontal % 4 {
59+
0 => EdgeMode::Clamp,
60+
1 => EdgeMode::Wrap,
61+
2 => EdgeMode::Reflect,
62+
_ => EdgeMode::Reflect101,
63+
};
64+
let edge_mode_vertical = match data.edge_mode_vertical % 4 {
5865
0 => EdgeMode::Clamp,
5966
1 => EdgeMode::Wrap,
6067
2 => EdgeMode::Reflect,
@@ -71,7 +78,7 @@ fuzz_target!(|data: SrcImage| {
7178
data.kernel_size as usize,
7279
data.angle,
7380
channels,
74-
edge_mode,
81+
EdgeMode2D::anisotropy(edge_mode_horizontal, edge_mode_vertical),
7582
data.multi_threading,
7683
);
7784
});
@@ -82,7 +89,7 @@ fn fuzz_8bit(
8289
radius: usize,
8390
sigma: f32,
8491
channels: FastBlurChannels,
85-
edge_mode: EdgeMode,
92+
edge_modes: EdgeMode2D,
8693
multi_threading: bool,
8794
) {
8895
if width == 0 || height == 0 || radius == 0 {
@@ -102,7 +109,7 @@ fn fuzz_8bit(
102109
spatial_sigma: sigma,
103110
range_sigma: sigma,
104111
},
105-
edge_mode,
112+
edge_modes,
106113
Scalar::new(0.0, 0.0, 0.0, 0.0),
107114
if multi_threading {
108115
ThreadingPolicy::Adaptive

0 commit comments

Comments
 (0)