|
13 | 13 | import numpy as np |
14 | 14 | import PIL.Image as PImage |
15 | 15 |
|
16 | | -import scipy.misc as sm |
17 | 16 | import scipy.signal as ssg |
18 | 17 | import scipy.ndimage.filters as sf |
19 | 18 | import scipy.ndimage.interpolation as sni |
|
26 | 25 | import scipy.ndimage.filters as sf |
27 | 26 | import scipy.spatial.distance as ssd |
28 | 27 | import skimage.morphology as morph |
| 28 | +import skimage.transform as skt |
29 | 29 | import scipy.ndimage.morphology as snm |
30 | 30 |
|
31 | 31 | from autolab_core import PointCloud, NormalCloud, PointNormalCloud, Box, Contour |
|
35 | 35 | BINARY_IM_DEFAULT_THRESH = BINARY_IM_MAX_VAL / 2 |
36 | 36 |
|
37 | 37 |
|
| 38 | +def imresize(image, size, interp="nearest"): |
| 39 | + """Wrapper over `skimage.transform.resize` to mimic `scipy.misc.imresize`. |
| 40 | +
|
| 41 | + Since `scipy.misc.imresize` has been removed in version 1.3.*, instead use |
| 42 | + `skimage.transform.resize`. The "lanczos" and "cubic" interpolation methods |
| 43 | + are not supported by `skimage.transform.resize`, however there is now |
| 44 | + "biquadratic", "biquartic", and "biquintic". |
| 45 | +
|
| 46 | + Parameters |
| 47 | + ---------- |
| 48 | + image : :obj:`numpy.ndarray` |
| 49 | + The image to resize. |
| 50 | +
|
| 51 | + size : int, float, or tuple |
| 52 | + * int - Percentage of current size. |
| 53 | + * float - Fraction of current size. |
| 54 | + * tuple - Size of the output image. |
| 55 | +
|
| 56 | + interp : :obj:`str`, optional |
| 57 | + Interpolation to use for re-sizing ("neartest", "bilinear", |
| 58 | + "biquadratic", "bicubic", "biquartic", "biquintic"). Default is |
| 59 | + "nearest". |
| 60 | +
|
| 61 | + Returns |
| 62 | + ------- |
| 63 | + :obj:`np.ndarray` |
| 64 | + The resized image. |
| 65 | + """ |
| 66 | + skt_interp_map = {"nearest": 0, "bilinear": 1, "biquadratic": 2, |
| 67 | + "bicubic": 3, "biquartic": 4, "biquintic": 5} |
| 68 | + if interp in ("lanczos", "cubic"): |
| 69 | + raise ValueError("\"lanczos\" and \"cubic\"" |
| 70 | + " interpolation are no longer supported.") |
| 71 | + assert interp in skt_interp_map, ("Interpolation \"{}\" not" |
| 72 | + " supported.".format(interp)) |
| 73 | + |
| 74 | + if isinstance(size, (tuple, list)): |
| 75 | + output_shape = size |
| 76 | + elif isinstance(size, (float)): |
| 77 | + np_shape = np.asarray(image.shape).astype(np.float32) |
| 78 | + np_shape[0:2] *= size |
| 79 | + output_shape = tuple(np_shape.astype(int)) |
| 80 | + elif isinstance(size, (int)): |
| 81 | + np_shape = np.asarray(image.shape).astype(np.float32) |
| 82 | + np_shape[0:2] *= size / 100.0 |
| 83 | + output_shape = tuple(np_shape.astype(int)) |
| 84 | + else: |
| 85 | + raise ValueError("Invalid type for size \"{}\".".format(type(size))) |
| 86 | + |
| 87 | + return skt.resize(image, |
| 88 | + output_shape, |
| 89 | + order=skt_interp_map[interp], |
| 90 | + anti_aliasing=False, |
| 91 | + mode="constant") |
| 92 | + |
38 | 93 | class Image(object): |
39 | 94 | """Abstract wrapper class for images. |
40 | 95 | """ |
@@ -1074,7 +1129,7 @@ def resize(self, size, interp='bilinear'): |
1074 | 1129 | :obj:`ColorImage` |
1075 | 1130 | The resized image. |
1076 | 1131 | """ |
1077 | | - resized_data = sm.imresize(self.data, size, interp=interp) |
| 1132 | + resized_data = imresize(self.data, size, interp=interp).astype(np.uint8) |
1078 | 1133 | return ColorImage(resized_data, self._frame) |
1079 | 1134 |
|
1080 | 1135 | def find_chessboard(self, sx=6, sy=9): |
@@ -1572,7 +1627,7 @@ def resize(self, size, interp='bilinear'): |
1572 | 1627 | :obj:`DepthImage` |
1573 | 1628 | The resized image. |
1574 | 1629 | """ |
1575 | | - resized_data = sm.imresize(self.data, size, interp=interp, mode='F') |
| 1630 | + resized_data = imresize(self.data, size, interp=interp).astype(np.float32) |
1576 | 1631 | return DepthImage(resized_data, self._frame) |
1577 | 1632 |
|
1578 | 1633 | def threshold(self, front_thresh=0.0, rear_thresh=100.0): |
@@ -1954,7 +2009,7 @@ def resize(self, size, interp='bilinear'): |
1954 | 2009 | :obj:`IrImage` |
1955 | 2010 | The resized image. |
1956 | 2011 | """ |
1957 | | - resized_data = sm.imresize(self._data, size, interp=interp) |
| 2012 | + resized_data = imresize(self._data, size, interp=interp).astype(np.uint16) |
1958 | 2013 | return IrImage(resized_data, self._frame) |
1959 | 2014 |
|
1960 | 2015 | @staticmethod |
@@ -2060,7 +2115,7 @@ def resize(self, size, interp='bilinear'): |
2060 | 2115 | :obj:`GrayscaleImage` |
2061 | 2116 | The resized image. |
2062 | 2117 | """ |
2063 | | - resized_data = sm.imresize(self.data, size, interp=interp) |
| 2118 | + resized_data = imresize(self.data, size, interp=interp).astype(np.uint8) |
2064 | 2119 | return GrayscaleImage(resized_data, self._frame) |
2065 | 2120 |
|
2066 | 2121 | def to_color(self): |
@@ -2185,7 +2240,7 @@ def resize(self, size, interp='bilinear'): |
2185 | 2240 | :obj:`BinaryImage` |
2186 | 2241 | The resized image. |
2187 | 2242 | """ |
2188 | | - resized_data = sm.imresize(self.data, size, interp=interp) |
| 2243 | + resized_data = imresize(self.data, size, interp=interp).astype(np.uint8) |
2189 | 2244 | return BinaryImage(resized_data, self._frame) |
2190 | 2245 |
|
2191 | 2246 | def mask_binary(self, binary_im): |
@@ -3311,7 +3366,7 @@ def resize(self, size, interp='nearest'): |
3311 | 3366 | Interpolation to use for re-sizing ('nearest', 'lanczos', 'bilinear', |
3312 | 3367 | 'bicubic', or 'cubic') |
3313 | 3368 | """ |
3314 | | - resized_data = sm.imresize(self.data, size, interp=interp, mode='L') |
| 3369 | + resized_data = imresize(self.data, size, interp=interp).astype(np.uint8) |
3315 | 3370 | return SegmentationImage(resized_data, self._frame) |
3316 | 3371 |
|
3317 | 3372 | @staticmethod |
@@ -3397,9 +3452,9 @@ def resize(self, size, interp='nearest'): |
3397 | 3452 | :obj:`PointCloudImage` |
3398 | 3453 | The resized image. |
3399 | 3454 | """ |
3400 | | - resized_data_0 = sm.imresize(self._data[:,:,0], size, interp=interp, mode='F') |
3401 | | - resized_data_1 = sm.imresize(self._data[:,:,1], size, interp=interp, mode='F') |
3402 | | - resized_data_2 = sm.imresize(self._data[:,:,2], size, interp=interp, mode='F') |
| 3455 | + resized_data_0 = imresize(self._data[:,:,0], size, interp=interp).astype(np.float32) |
| 3456 | + resized_data_1 = imresize(self._data[:,:,1], size, interp=interp).astype(np.float32) |
| 3457 | + resized_data_2 = imresize(self._data[:,:,2], size, interp=interp).astype(np.float32) |
3403 | 3458 | resized_data = np.zeros([resized_data_0.shape[0], |
3404 | 3459 | resized_data_0.shape[1], |
3405 | 3460 | self.channels]) |
|
0 commit comments