Skip to main content

singe_npp/image/
filtering_median.rs

1use super::*;
2
3impl_filter_median!(
4    filter_median_u8_c1_buffer_size,
5    filter_median_u8_c1,
6    u8,
7    C1,
8    nppiFilterMedianGetBufferSize_8u_C1R_Ctx,
9    nppiFilterMedian_8u_C1R_Ctx
10);
11impl_filter_median!(
12    filter_median_u8_c3_buffer_size,
13    filter_median_u8_c3,
14    u8,
15    C3,
16    nppiFilterMedianGetBufferSize_8u_C3R_Ctx,
17    nppiFilterMedian_8u_C3R_Ctx
18);
19impl_filter_median!(
20    filter_median_u8_c4_buffer_size,
21    filter_median_u8_c4,
22    u8,
23    C4,
24    nppiFilterMedianGetBufferSize_8u_C4R_Ctx,
25    nppiFilterMedian_8u_C4R_Ctx
26);
27impl_filter_median!(
28    filter_median_u8_ac4_buffer_size,
29    filter_median_u8_ac4,
30    u8,
31    AC4,
32    nppiFilterMedianGetBufferSize_8u_AC4R_Ctx,
33    nppiFilterMedian_8u_AC4R_Ctx
34);
35impl_filter_median!(
36    filter_median_u16_c1_buffer_size,
37    filter_median_u16_c1,
38    u16,
39    C1,
40    nppiFilterMedianGetBufferSize_16u_C1R_Ctx,
41    nppiFilterMedian_16u_C1R_Ctx
42);
43impl_filter_median!(
44    filter_median_u16_c3_buffer_size,
45    filter_median_u16_c3,
46    u16,
47    C3,
48    nppiFilterMedianGetBufferSize_16u_C3R_Ctx,
49    nppiFilterMedian_16u_C3R_Ctx
50);
51impl_filter_median!(
52    filter_median_u16_c4_buffer_size,
53    filter_median_u16_c4,
54    u16,
55    C4,
56    nppiFilterMedianGetBufferSize_16u_C4R_Ctx,
57    nppiFilterMedian_16u_C4R_Ctx
58);
59impl_filter_median!(
60    filter_median_u16_ac4_buffer_size,
61    filter_median_u16_ac4,
62    u16,
63    AC4,
64    nppiFilterMedianGetBufferSize_16u_AC4R_Ctx,
65    nppiFilterMedian_16u_AC4R_Ctx
66);
67impl_filter_median!(
68    filter_median_i16_c1_buffer_size,
69    filter_median_i16_c1,
70    i16,
71    C1,
72    nppiFilterMedianGetBufferSize_16s_C1R_Ctx,
73    nppiFilterMedian_16s_C1R_Ctx
74);
75impl_filter_median!(
76    filter_median_i16_c3_buffer_size,
77    filter_median_i16_c3,
78    i16,
79    C3,
80    nppiFilterMedianGetBufferSize_16s_C3R_Ctx,
81    nppiFilterMedian_16s_C3R_Ctx
82);
83impl_filter_median!(
84    filter_median_i16_c4_buffer_size,
85    filter_median_i16_c4,
86    i16,
87    C4,
88    nppiFilterMedianGetBufferSize_16s_C4R_Ctx,
89    nppiFilterMedian_16s_C4R_Ctx
90);
91impl_filter_median!(
92    filter_median_i16_ac4_buffer_size,
93    filter_median_i16_ac4,
94    i16,
95    AC4,
96    nppiFilterMedianGetBufferSize_16s_AC4R_Ctx,
97    nppiFilterMedian_16s_AC4R_Ctx
98);
99impl_filter_median!(
100    filter_median_f32_c1_buffer_size,
101    filter_median_f32_c1,
102    f32,
103    C1,
104    nppiFilterMedianGetBufferSize_32f_C1R_Ctx,
105    nppiFilterMedian_32f_C1R_Ctx
106);
107impl_filter_median!(
108    filter_median_f32_c3_buffer_size,
109    filter_median_f32_c3,
110    f32,
111    C3,
112    nppiFilterMedianGetBufferSize_32f_C3R_Ctx,
113    nppiFilterMedian_32f_C3R_Ctx
114);
115impl_filter_median!(
116    filter_median_f32_c4_buffer_size,
117    filter_median_f32_c4,
118    f32,
119    C4,
120    nppiFilterMedianGetBufferSize_32f_C4R_Ctx,
121    nppiFilterMedian_32f_C4R_Ctx
122);
123impl_filter_median!(
124    filter_median_f32_ac4_buffer_size,
125    filter_median_f32_ac4,
126    f32,
127    AC4,
128    nppiFilterMedianGetBufferSize_32f_AC4R_Ctx,
129    nppiFilterMedian_32f_AC4R_Ctx
130);
131
132impl_filter_median_border!(
133    filter_median_border_u8_c1_buffer_size,
134    filter_median_border_u8_c1,
135    u8,
136    C1,
137    nppiFilterMedianBorderGetBufferSize_8u_C1R_Ctx,
138    nppiFilterMedianBorder_8u_C1R_Ctx
139);
140impl_filter_median_border!(
141    filter_median_border_u8_c3_buffer_size,
142    filter_median_border_u8_c3,
143    u8,
144    C3,
145    nppiFilterMedianBorderGetBufferSize_8u_C3R_Ctx,
146    nppiFilterMedianBorder_8u_C3R_Ctx
147);
148impl_filter_median_border!(
149    filter_median_border_u8_c4_buffer_size,
150    filter_median_border_u8_c4,
151    u8,
152    C4,
153    nppiFilterMedianBorderGetBufferSize_8u_C4R_Ctx,
154    nppiFilterMedianBorder_8u_C4R_Ctx
155);
156impl_filter_median_border!(
157    filter_median_border_u8_ac4_buffer_size,
158    filter_median_border_u8_ac4,
159    u8,
160    AC4,
161    nppiFilterMedianBorderGetBufferSize_8u_AC4R_Ctx,
162    nppiFilterMedianBorder_8u_AC4R_Ctx
163);
164impl_filter_median_border!(
165    filter_median_border_u16_c1_buffer_size,
166    filter_median_border_u16_c1,
167    u16,
168    C1,
169    nppiFilterMedianBorderGetBufferSize_16u_C1R_Ctx,
170    nppiFilterMedianBorder_16u_C1R_Ctx
171);
172impl_filter_median_border!(
173    filter_median_border_u16_c3_buffer_size,
174    filter_median_border_u16_c3,
175    u16,
176    C3,
177    nppiFilterMedianBorderGetBufferSize_16u_C3R_Ctx,
178    nppiFilterMedianBorder_16u_C3R_Ctx
179);
180impl_filter_median_border!(
181    filter_median_border_u16_c4_buffer_size,
182    filter_median_border_u16_c4,
183    u16,
184    C4,
185    nppiFilterMedianBorderGetBufferSize_16u_C4R_Ctx,
186    nppiFilterMedianBorder_16u_C4R_Ctx
187);
188impl_filter_median_border!(
189    filter_median_border_u16_ac4_buffer_size,
190    filter_median_border_u16_ac4,
191    u16,
192    AC4,
193    nppiFilterMedianBorderGetBufferSize_16u_AC4R_Ctx,
194    nppiFilterMedianBorder_16u_AC4R_Ctx
195);
196impl_filter_median_border!(
197    filter_median_border_i16_c1_buffer_size,
198    filter_median_border_i16_c1,
199    i16,
200    C1,
201    nppiFilterMedianBorderGetBufferSize_16s_C1R_Ctx,
202    nppiFilterMedianBorder_16s_C1R_Ctx
203);
204impl_filter_median_border!(
205    filter_median_border_i16_c3_buffer_size,
206    filter_median_border_i16_c3,
207    i16,
208    C3,
209    nppiFilterMedianBorderGetBufferSize_16s_C3R_Ctx,
210    nppiFilterMedianBorder_16s_C3R_Ctx
211);
212impl_filter_median_border!(
213    filter_median_border_i16_c4_buffer_size,
214    filter_median_border_i16_c4,
215    i16,
216    C4,
217    nppiFilterMedianBorderGetBufferSize_16s_C4R_Ctx,
218    nppiFilterMedianBorder_16s_C4R_Ctx
219);
220impl_filter_median_border!(
221    filter_median_border_i16_ac4_buffer_size,
222    filter_median_border_i16_ac4,
223    i16,
224    AC4,
225    nppiFilterMedianBorderGetBufferSize_16s_AC4R_Ctx,
226    nppiFilterMedianBorder_16s_AC4R_Ctx
227);
228impl_filter_median_border!(
229    filter_median_border_f32_c1_buffer_size,
230    filter_median_border_f32_c1,
231    f32,
232    C1,
233    nppiFilterMedianBorderGetBufferSize_32f_C1R_Ctx,
234    nppiFilterMedianBorder_32f_C1R_Ctx
235);
236impl_filter_median_border!(
237    filter_median_border_f32_c3_buffer_size,
238    filter_median_border_f32_c3,
239    f32,
240    C3,
241    nppiFilterMedianBorderGetBufferSize_32f_C3R_Ctx,
242    nppiFilterMedianBorder_32f_C3R_Ctx
243);
244impl_filter_median_border!(
245    filter_median_border_f32_c4_buffer_size,
246    filter_median_border_f32_c4,
247    f32,
248    C4,
249    nppiFilterMedianBorderGetBufferSize_32f_C4R_Ctx,
250    nppiFilterMedianBorder_32f_C4R_Ctx
251);
252impl_filter_median_border!(
253    filter_median_border_f32_ac4_buffer_size,
254    filter_median_border_f32_ac4,
255    f32,
256    AC4,
257    nppiFilterMedianBorderGetBufferSize_32f_AC4R_Ctx,
258    nppiFilterMedianBorder_32f_AC4R_Ctx
259);
260
261pub trait FilterMedian<L: ChannelLayout>: DataTypeLike {
262    fn filter_median_buffer_size(
263        stream_context: &StreamContext,
264        roi: Size,
265        mask_size: Size,
266    ) -> Result<usize>;
267
268    fn filter_median(
269        stream_context: &StreamContext,
270        source: &ImageView<'_, Self, L>,
271        destination: &mut ImageViewMut<'_, Self, L>,
272        mask_size: Size,
273        anchor: Point,
274    ) -> Result<()>;
275}
276
277macro_rules! impl_filter_median_dispatch {
278    ($pixel_ty:ty, $layout:ty, $buffer_size_name:ident, $name:ident) => {
279        impl FilterMedian<$layout> for $pixel_ty {
280            fn filter_median_buffer_size(
281                stream_context: &StreamContext,
282                roi: Size,
283                mask_size: Size,
284            ) -> Result<usize> {
285                $buffer_size_name(stream_context, roi, mask_size)
286            }
287
288            fn filter_median(
289                stream_context: &StreamContext,
290                source: &ImageView<'_, Self, $layout>,
291                destination: &mut ImageViewMut<'_, Self, $layout>,
292                mask_size: Size,
293                anchor: Point,
294            ) -> Result<()> {
295                $name(stream_context, source, destination, mask_size, anchor)
296            }
297        }
298    };
299}
300
301impl_filter_median_dispatch!(u8, C1, filter_median_u8_c1_buffer_size, filter_median_u8_c1);
302impl_filter_median_dispatch!(u8, C3, filter_median_u8_c3_buffer_size, filter_median_u8_c3);
303impl_filter_median_dispatch!(u8, C4, filter_median_u8_c4_buffer_size, filter_median_u8_c4);
304impl_filter_median_dispatch!(
305    u8,
306    AC4,
307    filter_median_u8_ac4_buffer_size,
308    filter_median_u8_ac4
309);
310impl_filter_median_dispatch!(
311    u16,
312    C1,
313    filter_median_u16_c1_buffer_size,
314    filter_median_u16_c1
315);
316impl_filter_median_dispatch!(
317    u16,
318    C3,
319    filter_median_u16_c3_buffer_size,
320    filter_median_u16_c3
321);
322impl_filter_median_dispatch!(
323    u16,
324    C4,
325    filter_median_u16_c4_buffer_size,
326    filter_median_u16_c4
327);
328impl_filter_median_dispatch!(
329    u16,
330    AC4,
331    filter_median_u16_ac4_buffer_size,
332    filter_median_u16_ac4
333);
334impl_filter_median_dispatch!(
335    i16,
336    C1,
337    filter_median_i16_c1_buffer_size,
338    filter_median_i16_c1
339);
340impl_filter_median_dispatch!(
341    i16,
342    C3,
343    filter_median_i16_c3_buffer_size,
344    filter_median_i16_c3
345);
346impl_filter_median_dispatch!(
347    i16,
348    C4,
349    filter_median_i16_c4_buffer_size,
350    filter_median_i16_c4
351);
352impl_filter_median_dispatch!(
353    i16,
354    AC4,
355    filter_median_i16_ac4_buffer_size,
356    filter_median_i16_ac4
357);
358impl_filter_median_dispatch!(
359    f32,
360    C1,
361    filter_median_f32_c1_buffer_size,
362    filter_median_f32_c1
363);
364impl_filter_median_dispatch!(
365    f32,
366    C3,
367    filter_median_f32_c3_buffer_size,
368    filter_median_f32_c3
369);
370impl_filter_median_dispatch!(
371    f32,
372    C4,
373    filter_median_f32_c4_buffer_size,
374    filter_median_f32_c4
375);
376impl_filter_median_dispatch!(
377    f32,
378    AC4,
379    filter_median_f32_ac4_buffer_size,
380    filter_median_f32_ac4
381);
382
383pub fn filter_median_buffer_size<T, L>(
384    stream_context: &StreamContext,
385    roi: Size,
386    mask_size: Size,
387) -> Result<usize>
388where
389    T: FilterMedian<L>,
390    L: ChannelLayout,
391{
392    T::filter_median_buffer_size(stream_context, roi, mask_size)
393}
394
395pub fn filter_median<T, L>(
396    stream_context: &StreamContext,
397    source: &ImageView<'_, T, L>,
398    destination: &mut ImageViewMut<'_, T, L>,
399    mask_size: Size,
400    anchor: Point,
401) -> Result<()>
402where
403    T: FilterMedian<L>,
404    L: ChannelLayout,
405{
406    T::filter_median(stream_context, source, destination, mask_size, anchor)
407}
408
409pub trait FilterMedianBorder<L: ChannelLayout>: DataTypeLike {
410    fn filter_median_border_buffer_size(
411        stream_context: &StreamContext,
412        roi: Size,
413        mask_size: Size,
414        border_type: BorderType,
415    ) -> Result<usize>;
416
417    fn filter_median_border(
418        stream_context: &StreamContext,
419        source: &ImageView<'_, Self, L>,
420        source_offset: Point,
421        destination: &mut ImageViewMut<'_, Self, L>,
422        mask_size: Size,
423        anchor: Point,
424        border_type: BorderType,
425    ) -> Result<()>;
426}
427
428macro_rules! impl_filter_median_border_dispatch {
429    ($pixel_ty:ty, $layout:ty, $buffer_size_name:ident, $name:ident) => {
430        impl FilterMedianBorder<$layout> for $pixel_ty {
431            fn filter_median_border_buffer_size(
432                stream_context: &StreamContext,
433                roi: Size,
434                mask_size: Size,
435                border_type: BorderType,
436            ) -> Result<usize> {
437                $buffer_size_name(stream_context, roi, mask_size, border_type)
438            }
439
440            fn filter_median_border(
441                stream_context: &StreamContext,
442                source: &ImageView<'_, Self, $layout>,
443                source_offset: Point,
444                destination: &mut ImageViewMut<'_, Self, $layout>,
445                mask_size: Size,
446                anchor: Point,
447                border_type: BorderType,
448            ) -> Result<()> {
449                $name(
450                    stream_context,
451                    source,
452                    source_offset,
453                    destination,
454                    mask_size,
455                    anchor,
456                    border_type,
457                )
458            }
459        }
460    };
461}
462
463impl_filter_median_border_dispatch!(
464    u8,
465    C1,
466    filter_median_border_u8_c1_buffer_size,
467    filter_median_border_u8_c1
468);
469impl_filter_median_border_dispatch!(
470    u8,
471    C3,
472    filter_median_border_u8_c3_buffer_size,
473    filter_median_border_u8_c3
474);
475impl_filter_median_border_dispatch!(
476    u8,
477    C4,
478    filter_median_border_u8_c4_buffer_size,
479    filter_median_border_u8_c4
480);
481impl_filter_median_border_dispatch!(
482    u8,
483    AC4,
484    filter_median_border_u8_ac4_buffer_size,
485    filter_median_border_u8_ac4
486);
487impl_filter_median_border_dispatch!(
488    u16,
489    C1,
490    filter_median_border_u16_c1_buffer_size,
491    filter_median_border_u16_c1
492);
493impl_filter_median_border_dispatch!(
494    u16,
495    C3,
496    filter_median_border_u16_c3_buffer_size,
497    filter_median_border_u16_c3
498);
499impl_filter_median_border_dispatch!(
500    u16,
501    C4,
502    filter_median_border_u16_c4_buffer_size,
503    filter_median_border_u16_c4
504);
505impl_filter_median_border_dispatch!(
506    u16,
507    AC4,
508    filter_median_border_u16_ac4_buffer_size,
509    filter_median_border_u16_ac4
510);
511impl_filter_median_border_dispatch!(
512    i16,
513    C1,
514    filter_median_border_i16_c1_buffer_size,
515    filter_median_border_i16_c1
516);
517impl_filter_median_border_dispatch!(
518    i16,
519    C3,
520    filter_median_border_i16_c3_buffer_size,
521    filter_median_border_i16_c3
522);
523impl_filter_median_border_dispatch!(
524    i16,
525    C4,
526    filter_median_border_i16_c4_buffer_size,
527    filter_median_border_i16_c4
528);
529impl_filter_median_border_dispatch!(
530    i16,
531    AC4,
532    filter_median_border_i16_ac4_buffer_size,
533    filter_median_border_i16_ac4
534);
535impl_filter_median_border_dispatch!(
536    f32,
537    C1,
538    filter_median_border_f32_c1_buffer_size,
539    filter_median_border_f32_c1
540);
541impl_filter_median_border_dispatch!(
542    f32,
543    C3,
544    filter_median_border_f32_c3_buffer_size,
545    filter_median_border_f32_c3
546);
547impl_filter_median_border_dispatch!(
548    f32,
549    C4,
550    filter_median_border_f32_c4_buffer_size,
551    filter_median_border_f32_c4
552);
553impl_filter_median_border_dispatch!(
554    f32,
555    AC4,
556    filter_median_border_f32_ac4_buffer_size,
557    filter_median_border_f32_ac4
558);
559
560pub fn filter_median_border_buffer_size<T, L>(
561    stream_context: &StreamContext,
562    roi: Size,
563    mask_size: Size,
564    border_type: BorderType,
565) -> Result<usize>
566where
567    T: FilterMedianBorder<L>,
568    L: ChannelLayout,
569{
570    T::filter_median_border_buffer_size(stream_context, roi, mask_size, border_type)
571}
572
573pub fn filter_median_border<T, L>(
574    stream_context: &StreamContext,
575    source: &ImageView<'_, T, L>,
576    source_offset: Point,
577    destination: &mut ImageViewMut<'_, T, L>,
578    mask_size: Size,
579    anchor: Point,
580    border_type: BorderType,
581) -> Result<()>
582where
583    T: FilterMedianBorder<L>,
584    L: ChannelLayout,
585{
586    T::filter_median_border(
587        stream_context,
588        source,
589        source_offset,
590        destination,
591        mask_size,
592        anchor,
593        border_type,
594    )
595}