1
1
use crate :: core:: { ColourModel , Image } ;
2
2
use ndarray:: { prelude:: * , s} ;
3
+ use num_traits:: identities:: Zero ;
3
4
use std:: marker:: PhantomData ;
4
5
5
6
/// Defines a method for padding the data of an image applied directly to the
@@ -24,9 +25,13 @@ pub struct ConstantPadding<T>(T)
24
25
where
25
26
T : Copy ;
26
27
28
+ /// Pad the image with zeros. Uses ConstantPadding internally
29
+ #[ derive( Clone , Eq , PartialEq , Hash , Debug ) ]
30
+ pub struct ZeroPadding ;
31
+
27
32
impl < T > PaddingStrategy < T > for NoPadding
28
33
where
29
- T : Copy + Sized ,
34
+ T : Copy ,
30
35
{
31
36
fn pad ( & self , image : ArrayView3 < T > , _padding : ( usize , usize ) ) -> Array3 < T > {
32
37
image. to_owned ( )
35
40
36
41
impl < T > PaddingStrategy < T > for ConstantPadding < T >
37
42
where
38
- T : Copy + Sized ,
43
+ T : Copy ,
39
44
{
40
45
fn pad ( & self , image : ArrayView3 < T > , padding : ( usize , usize ) ) -> Array3 < T > {
41
46
let shape = (
@@ -57,11 +62,19 @@ where
57
62
}
58
63
}
59
64
60
- /// Padding extension for images
61
- pub trait PaddingExt
65
+
66
+ impl < T > PaddingStrategy < T > for ZeroPadding
62
67
where
63
- Self : Sized ,
68
+ T : Copy + Zero ,
64
69
{
70
+ fn pad ( & self , image : ArrayView3 < T > , padding : ( usize , usize ) ) -> Array3 < T > {
71
+ let padder = ConstantPadding ( T :: zero ( ) ) ;
72
+ padder. pad ( image, padding)
73
+ }
74
+ }
75
+
76
+ /// Padding extension for images
77
+ pub trait PaddingExt {
65
78
/// Data type for container
66
79
type Data ;
67
80
/// Pad the object with the given padding and strategy
70
83
71
84
impl < T > PaddingExt for Array3 < T >
72
85
where
73
- T : Copy + Sized ,
86
+ T : Copy ,
74
87
{
75
88
type Data = T ;
76
89
81
94
82
95
impl < T , C > PaddingExt for Image < T , C >
83
96
where
84
- T : Copy + Sized ,
97
+ T : Copy ,
85
98
C : ColourModel ,
86
99
{
87
100
type Data = T ;
@@ -126,6 +139,8 @@ mod tests {
126
139
assert_eq ! ( p, exp) ;
127
140
128
141
let p = i. pad ( ( 2 , 0 ) , & ConstantPadding ( 0 ) ) ;
142
+ let z = i. pad ( ( 2 , 0 ) , & ZeroPadding { } ) ;
143
+ assert_eq ! ( p, z) ;
129
144
130
145
let exp = Image :: < u8 , Gray > :: from_shape_data (
131
146
7 ,
0 commit comments