3
3
import io
4
4
import warnings
5
5
from pathlib import Path
6
- from typing import Any
6
+ from typing import Any , TYPE_CHECKING
7
7
8
8
import torch
9
- import torch .nn .functional as F
9
+ import torch .nn .functional as func
10
10
from PIL .Image import open as pil_image_open
11
11
from torch import Tensor
12
- from torch .types import Device
12
+
13
+ if TYPE_CHECKING :
14
+ from torch .types import Device
13
15
import torchvision
14
16
15
- # Disable torchvision V2 beta warnings
16
- torchvision .disable_beta_transforms_warning ()
17
- from torchvision .transforms .v2 import PILToTensor , functional as F2
17
+ # Disables torchvision V2 beta warnings
18
+ # Disabled because of RUFF Linter E402 (Module level import not at top of file)
19
+ # torchvision.disable_beta_transforms_warning()
20
+ from torchvision .transforms .v2 import PILToTensor , functional as func2
18
21
from torchvision .utils import save_image
19
22
20
23
from safeds .exceptions import OutOfBoundsError , ClosedBound , IllegalFormatError
@@ -34,7 +37,7 @@ class Image:
34
37
_default_device = torch .device ("cuda" ) if torch .cuda .is_available () else torch .device ("cpu" )
35
38
36
39
@staticmethod
37
- def from_file (path : str | Path , device : Device = _default_device ):
40
+ def from_file (path : str | Path , device : Device = _default_device ) -> Image :
38
41
"""
39
42
Create an image from a file.
40
43
@@ -53,7 +56,7 @@ def from_file(path: str | Path, device: Device = _default_device):
53
56
return Image (image_tensor = Image ._pil_to_tensor (pil_image_open (path )), device = device )
54
57
55
58
@staticmethod
56
- def from_bytes (data : bytes , device : Device = _default_device ):
59
+ def from_bytes (data : bytes , device : Device = _default_device ) -> Image :
57
60
"""
58
61
Create an image from bytes.
59
62
@@ -227,7 +230,7 @@ def resize(self, new_width: int, new_height: int) -> Image:
227
230
result : Image
228
231
The image with the given width and height.
229
232
"""
230
- return Image (F .interpolate (self ._image_tensor .unsqueeze (dim = 1 ), size = (new_height , new_width )).squeeze (dim = 1 ),
233
+ return Image (func .interpolate (self ._image_tensor .unsqueeze (dim = 1 ), size = (new_height , new_width )).squeeze (dim = 1 ),
231
234
device = self ._image_tensor .device )
232
235
233
236
def convert_to_grayscale (self ) -> Image :
@@ -243,11 +246,11 @@ def convert_to_grayscale(self) -> Image:
243
246
"""
244
247
if self .channel == 4 :
245
248
return Image (torch .cat (
246
- [F2 .rgb_to_grayscale (self ._image_tensor [0 :3 ], num_output_channels = 3 ),
249
+ [func2 .rgb_to_grayscale (self ._image_tensor [0 :3 ], num_output_channels = 3 ),
247
250
self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
248
251
device = self .device )
249
252
else :
250
- return Image (F2 .rgb_to_grayscale (self ._image_tensor [0 :3 ], num_output_channels = 3 ), device = self .device )
253
+ return Image (func2 .rgb_to_grayscale (self ._image_tensor [0 :3 ], num_output_channels = 3 ), device = self .device )
251
254
252
255
def crop (self , x : int , y : int , width : int , height : int ) -> Image :
253
256
"""
@@ -267,7 +270,7 @@ def crop(self, x: int, y: int, width: int, height: int) -> Image:
267
270
result : Image
268
271
The cropped image.
269
272
"""
270
- return Image (F2 .crop (self ._image_tensor , x , y , height , width ), device = self .device )
273
+ return Image (func2 .crop (self ._image_tensor , x , y , height , width ), device = self .device )
271
274
272
275
def flip_vertically (self ) -> Image :
273
276
"""
@@ -280,7 +283,7 @@ def flip_vertically(self) -> Image:
280
283
result : Image
281
284
The flipped image.
282
285
"""
283
- return Image (F2 .vertical_flip (self ._image_tensor ), device = self .device )
286
+ return Image (func2 .vertical_flip (self ._image_tensor ), device = self .device )
284
287
285
288
def flip_horizontally (self ) -> Image :
286
289
"""
@@ -293,7 +296,7 @@ def flip_horizontally(self) -> Image:
293
296
result : Image
294
297
The flipped image.
295
298
"""
296
- return Image (F2 .horizontal_flip (self ._image_tensor ), device = self .device )
299
+ return Image (func2 .horizontal_flip (self ._image_tensor ), device = self .device )
297
300
298
301
def adjust_brightness (self , factor : float ) -> Image :
299
302
"""
@@ -330,10 +333,11 @@ def adjust_brightness(self, factor: float) -> Image:
330
333
)
331
334
if self .channel == 4 :
332
335
return Image (torch .cat (
333
- [F2 .adjust_brightness (self ._image_tensor [0 :3 ], factor * 1.0 ), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
336
+ [func2 .adjust_brightness (self ._image_tensor [0 :3 ], factor * 1.0 ),
337
+ self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
334
338
device = self .device )
335
339
else :
336
- return Image (F2 .adjust_brightness (self ._image_tensor , factor * 1.0 ), device = self .device )
340
+ return Image (func2 .adjust_brightness (self ._image_tensor , factor * 1.0 ), device = self .device )
337
341
338
342
def add_noise (self , standard_deviation : float ) -> Image :
339
343
"""
@@ -396,13 +400,13 @@ def adjust_contrast(self, factor: float) -> Image:
396
400
)
397
401
if self .channel == 4 :
398
402
return Image (torch .cat (
399
- [F2 .adjust_contrast (self ._image_tensor [0 :3 ], factor * 1.0 ), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
403
+ [func2 .adjust_contrast (self ._image_tensor [0 :3 ], factor * 1.0 ), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
400
404
device = self .device )
401
405
else :
402
- return Image (F2 .adjust_contrast (self ._image_tensor , factor * 1.0 ), device = self .device )
406
+ return Image (func2 .adjust_contrast (self ._image_tensor , factor * 1.0 ), device = self .device )
403
407
404
- def adjust_color_balance (self , factor : float ) -> Image :
405
- pass
408
+ # def adjust_color_balance(self, factor: float) -> Image:
409
+ # pass
406
410
407
411
def blur (self , radius : int ) -> Image :
408
412
"""
@@ -421,7 +425,7 @@ def blur(self, radius: int) -> Image:
421
425
result : Image
422
426
The blurred image.
423
427
"""
424
- return Image (F2 .gaussian_blur (self ._image_tensor , [radius * 2 + 1 , radius * 2 + 1 ]), device = self .device )
428
+ return Image (func2 .gaussian_blur (self ._image_tensor , [radius * 2 + 1 , radius * 2 + 1 ]), device = self .device )
425
429
426
430
def sharpen (self , factor : float ) -> Image :
427
431
"""
@@ -457,10 +461,11 @@ def sharpen(self, factor: float) -> Image:
457
461
)
458
462
if self .channel == 4 :
459
463
return Image (torch .cat (
460
- [F2 .adjust_sharpness (self ._image_tensor [0 :3 ], factor * 1.0 ), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
464
+ [func2 .adjust_sharpness (self ._image_tensor [0 :3 ], factor * 1.0 ),
465
+ self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
461
466
device = self .device )
462
467
else :
463
- return Image (F2 .adjust_sharpness (self ._image_tensor , factor * 1.0 ), device = self .device )
468
+ return Image (func2 .adjust_sharpness (self ._image_tensor , factor * 1.0 ), device = self .device )
464
469
465
470
def invert_colors (self ) -> Image :
466
471
"""
@@ -475,10 +480,10 @@ def invert_colors(self) -> Image:
475
480
"""
476
481
if self .channel == 4 :
477
482
return Image (torch .cat (
478
- [F2 .invert (self ._image_tensor [0 :3 ]), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
483
+ [func2 .invert (self ._image_tensor [0 :3 ]), self ._image_tensor [3 ].unsqueeze (dim = 0 )]),
479
484
device = self .device )
480
485
else :
481
- return Image (F2 .invert (self ._image_tensor ), device = self .device )
486
+ return Image (func2 .invert (self ._image_tensor ), device = self .device )
482
487
483
488
def rotate_right (self ) -> Image :
484
489
"""
@@ -491,7 +496,7 @@ def rotate_right(self) -> Image:
491
496
result : Image
492
497
The image rotated 90 degrees clockwise.
493
498
"""
494
- return Image (F2 .rotate (self ._image_tensor , - 90 , expand = True ), device = self .device )
499
+ return Image (func2 .rotate (self ._image_tensor , - 90 , expand = True ), device = self .device )
495
500
496
501
def rotate_left (self ) -> Image :
497
502
"""
@@ -504,7 +509,7 @@ def rotate_left(self) -> Image:
504
509
result : Image
505
510
The image rotated 90 degrees counter-clockwise.
506
511
"""
507
- return Image (F2 .rotate (self ._image_tensor , 90 , expand = True ), device = self .device )
512
+ return Image (func2 .rotate (self ._image_tensor , 90 , expand = True ), device = self .device )
508
513
509
- def find_edges (self ) -> Image :
510
- pass
514
+ # def find_edges(self) -> Image:
515
+ # pass
0 commit comments