55from .helper import assert_image_equal , hopper
66
77
8- def test_sanity ():
9- def apply_filter (filter_to_apply ):
10- for mode in ["L" , "RGB" , "CMYK" ]:
11- im = hopper (mode )
12- out = im .filter (filter_to_apply )
13- assert out .mode == im .mode
14- assert out .size == im .size
15-
16- apply_filter (ImageFilter .BLUR )
17- apply_filter (ImageFilter .CONTOUR )
18- apply_filter (ImageFilter .DETAIL )
19- apply_filter (ImageFilter .EDGE_ENHANCE )
20- apply_filter (ImageFilter .EDGE_ENHANCE_MORE )
21- apply_filter (ImageFilter .EMBOSS )
22- apply_filter (ImageFilter .FIND_EDGES )
23- apply_filter (ImageFilter .SMOOTH )
24- apply_filter (ImageFilter .SMOOTH_MORE )
25- apply_filter (ImageFilter .SHARPEN )
26- apply_filter (ImageFilter .MaxFilter )
27- apply_filter (ImageFilter .MedianFilter )
28- apply_filter (ImageFilter .MinFilter )
29- apply_filter (ImageFilter .ModeFilter )
30- apply_filter (ImageFilter .GaussianBlur )
31- apply_filter (ImageFilter .GaussianBlur (5 ))
32- apply_filter (ImageFilter .BoxBlur (5 ))
33- apply_filter (ImageFilter .UnsharpMask )
34- apply_filter (ImageFilter .UnsharpMask (10 ))
35-
8+ @pytest .mark .parametrize (
9+ "filter_to_apply" ,
10+ (
11+ ImageFilter .BLUR ,
12+ ImageFilter .CONTOUR ,
13+ ImageFilter .DETAIL ,
14+ ImageFilter .EDGE_ENHANCE ,
15+ ImageFilter .EDGE_ENHANCE_MORE ,
16+ ImageFilter .EMBOSS ,
17+ ImageFilter .FIND_EDGES ,
18+ ImageFilter .SMOOTH ,
19+ ImageFilter .SMOOTH_MORE ,
20+ ImageFilter .SHARPEN ,
21+ ImageFilter .MaxFilter ,
22+ ImageFilter .MedianFilter ,
23+ ImageFilter .MinFilter ,
24+ ImageFilter .ModeFilter ,
25+ ImageFilter .GaussianBlur ,
26+ ImageFilter .GaussianBlur (5 ),
27+ ImageFilter .BoxBlur (5 ),
28+ ImageFilter .UnsharpMask ,
29+ ImageFilter .UnsharpMask (10 ),
30+ ),
31+ )
32+ @pytest .mark .parametrize ("mode" , ("L" , "RGB" , "CMYK" ))
33+ def test_sanity (filter_to_apply , mode ):
34+ im = hopper (mode )
35+ out = im .filter (filter_to_apply )
36+ assert out .mode == im .mode
37+ assert out .size == im .size
38+
39+
40+ @pytest .mark .parametrize ("mode" , ("L" , "RGB" , "CMYK" ))
41+ def test_sanity_error (mode ):
3642 with pytest .raises (TypeError ):
37- apply_filter ("hello" )
38-
39-
40- def test_crash ():
41-
42- # crashes on small images
43- im = Image .new ("RGB" , (1 , 1 ))
44- im .filter (ImageFilter .SMOOTH )
43+ im = hopper (mode )
44+ im .filter ("hello" )
4545
46- im = Image .new ("RGB" , (2 , 2 ))
47- im .filter (ImageFilter .SMOOTH )
4846
49- im = Image .new ("RGB" , (3 , 3 ))
47+ # crashes on small images
48+ @pytest .mark .parametrize ("size" , ((1 , 1 ), (2 , 2 ), (3 , 3 )))
49+ def test_crash (size ):
50+ im = Image .new ("RGB" , size )
5051 im .filter (ImageFilter .SMOOTH )
5152
5253
53- def test_modefilter ():
54- def modefilter (mode ):
55- im = Image .new (mode , (3 , 3 ), None )
56- im .putdata (list (range (9 )))
57- # image is:
58- # 0 1 2
59- # 3 4 5
60- # 6 7 8
61- mod = im .filter (ImageFilter .ModeFilter ).getpixel ((1 , 1 ))
62- im .putdata ([0 , 0 , 1 , 2 , 5 , 1 , 5 , 2 , 0 ]) # mode=0
63- mod2 = im .filter (ImageFilter .ModeFilter ).getpixel ((1 , 1 ))
64- return mod , mod2
65-
66- assert modefilter ("1" ) == (4 , 0 )
67- assert modefilter ("L" ) == (4 , 0 )
68- assert modefilter ("P" ) == (4 , 0 )
69- assert modefilter ("RGB" ) == ((4 , 0 , 0 ), (0 , 0 , 0 ))
70-
71-
72- def test_rankfilter ():
73- def rankfilter (mode ):
74- im = Image .new (mode , (3 , 3 ), None )
54+ @pytest .mark .parametrize (
55+ "mode, expected" ,
56+ (
57+ ("1" , (4 , 0 )),
58+ ("L" , (4 , 0 )),
59+ ("P" , (4 , 0 )),
60+ ("RGB" , ((4 , 0 , 0 ), (0 , 0 , 0 ))),
61+ ),
62+ )
63+ def test_modefilter (mode , expected ):
64+ im = Image .new (mode , (3 , 3 ), None )
65+ im .putdata (list (range (9 )))
66+ # image is:
67+ # 0 1 2
68+ # 3 4 5
69+ # 6 7 8
70+ mod = im .filter (ImageFilter .ModeFilter ).getpixel ((1 , 1 ))
71+ im .putdata ([0 , 0 , 1 , 2 , 5 , 1 , 5 , 2 , 0 ]) # mode=0
72+ mod2 = im .filter (ImageFilter .ModeFilter ).getpixel ((1 , 1 ))
73+ assert (mod , mod2 ) == expected
74+
75+
76+ @pytest .mark .parametrize (
77+ "mode, expected" ,
78+ (
79+ ("1" , (0 , 4 , 8 )),
80+ ("L" , (0 , 4 , 8 )),
81+ ("RGB" , ((0 , 0 , 0 ), (4 , 0 , 0 ), (8 , 0 , 0 ))),
82+ ("I" , (0 , 4 , 8 )),
83+ ("F" , (0.0 , 4.0 , 8.0 )),
84+ ),
85+ )
86+ def test_rankfilter (mode , expected ):
87+ im = Image .new (mode , (3 , 3 ), None )
88+ im .putdata (list (range (9 )))
89+ # image is:
90+ # 0 1 2
91+ # 3 4 5
92+ # 6 7 8
93+ minimum = im .filter (ImageFilter .MinFilter ).getpixel ((1 , 1 ))
94+ med = im .filter (ImageFilter .MedianFilter ).getpixel ((1 , 1 ))
95+ maximum = im .filter (ImageFilter .MaxFilter ).getpixel ((1 , 1 ))
96+ assert (minimum , med , maximum ) == expected
97+
98+
99+ @pytest .mark .parametrize (
100+ "filter" , (ImageFilter .MinFilter , ImageFilter .MedianFilter , ImageFilter .MaxFilter )
101+ )
102+ def test_rankfilter_error (filter ):
103+ with pytest .raises (ValueError ):
104+ im = Image .new ("P" , (3 , 3 ), None )
75105 im .putdata (list (range (9 )))
76106 # image is:
77107 # 0 1 2
78108 # 3 4 5
79109 # 6 7 8
80- minimum = im .filter (ImageFilter .MinFilter ).getpixel ((1 , 1 ))
81- med = im .filter (ImageFilter .MedianFilter ).getpixel ((1 , 1 ))
82- maximum = im .filter (ImageFilter .MaxFilter ).getpixel ((1 , 1 ))
83- return minimum , med , maximum
84-
85- assert rankfilter ("1" ) == (0 , 4 , 8 )
86- assert rankfilter ("L" ) == (0 , 4 , 8 )
87- with pytest .raises (ValueError ):
88- rankfilter ("P" )
89- assert rankfilter ("RGB" ) == ((0 , 0 , 0 ), (4 , 0 , 0 ), (8 , 0 , 0 ))
90- assert rankfilter ("I" ) == (0 , 4 , 8 )
91- assert rankfilter ("F" ) == (0.0 , 4.0 , 8.0 )
110+ im .filter (filter ).getpixel ((1 , 1 ))
92111
93112
94113def test_rankfilter_properties ():
@@ -110,7 +129,8 @@ def test_kernel_not_enough_coefficients():
110129 ImageFilter .Kernel ((3 , 3 ), (0 , 0 ))
111130
112131
113- def test_consistency_3x3 ():
132+ @pytest .mark .parametrize ("mode" , ("L" , "LA" , "RGB" , "CMYK" ))
133+ def test_consistency_3x3 (mode ):
114134 with Image .open ("Tests/images/hopper.bmp" ) as source :
115135 with Image .open ("Tests/images/hopper_emboss.bmp" ) as reference :
116136 kernel = ImageFilter .Kernel (
@@ -125,14 +145,14 @@ def test_consistency_3x3():
125145 source = source .split () * 2
126146 reference = reference .split () * 2
127147
128- for mode in ["L" , "LA" , "RGB" , "CMYK" ]:
129- assert_image_equal (
130- Image .merge (mode , source [: len (mode )]).filter (kernel ),
131- Image .merge (mode , reference [: len (mode )]),
132- )
148+ assert_image_equal (
149+ Image .merge (mode , source [: len (mode )]).filter (kernel ),
150+ Image .merge (mode , reference [: len (mode )]),
151+ )
133152
134153
135- def test_consistency_5x5 ():
154+ @pytest .mark .parametrize ("mode" , ("L" , "LA" , "RGB" , "CMYK" ))
155+ def test_consistency_5x5 (mode ):
136156 with Image .open ("Tests/images/hopper.bmp" ) as source :
137157 with Image .open ("Tests/images/hopper_emboss_more.bmp" ) as reference :
138158 kernel = ImageFilter .Kernel (
@@ -149,8 +169,7 @@ def test_consistency_5x5():
149169 source = source .split () * 2
150170 reference = reference .split () * 2
151171
152- for mode in ["L" , "LA" , "RGB" , "CMYK" ]:
153- assert_image_equal (
154- Image .merge (mode , source [: len (mode )]).filter (kernel ),
155- Image .merge (mode , reference [: len (mode )]),
156- )
172+ assert_image_equal (
173+ Image .merge (mode , source [: len (mode )]).filter (kernel ),
174+ Image .merge (mode , reference [: len (mode )]),
175+ )
0 commit comments