*Memos:
- My post explains InterpolationMode about image tensor.
- My post explains InterpolationMode about image.
PyTorch's NEAREST
matches the OpenCV's INTER_NEAREST which is buggy as shown below. *It's about NEAREST
and NEAREST_EXACT
:
from torchvision.datasets import OxfordIIITPet
from torchvision.transforms.v2 import PILToTensor, Resize
import numpy as np
import cv2
ptt = PILToTensor()
pytorchimagetensor = ptt(origin_data[0][0])
r = Resize(size=[50, 50], interpolation=InterpolationMode.NEAREST)
pytorch_resize = r(pytorchimagetensor).permute(dims=[1, 2, 0])
pytorch_resize
# tensor([[[37, 20, 12],
# [36, 17, 10],
# ...,
# [252, 250, 253]],
# [[36, 15, 14],
# [24, 8, 9],
# ...,
# [255, 255, 255]],
# [[255, 255, 196],
# [253, 255, 206],
# ...,
# [255, 255, 255]],
# ...,
# [[14, 16, 54],
# [12, 14, 52],
# ...,
# [254, 254, 254]],
# [[8, 11, 44],
# [11, 16, 46],
# ...,
# [255, 254, 255]],
# [[4, 9, 31],
# [0, 2, 0],
# ...,
# [57, 109, 231]]], dtype=torch.uint8)
numpyimagearray = np.array(object=origin_data[0][0])
opencv_resize = cv2.resize(src=numpyimagearray, dsize=[50, 50],
interpolation=cv2.INTER_NEAREST)
opencv_resize
# array([[[37, 20, 12],
# [36, 17, 10],
# ...,
# [252, 250, 253]],
# [[36, 15, 14],
# [24, 8, 9],
# ...,
# [255, 255, 255]],
# [[255, 255, 196],
# [253, 255, 206],
# ...,
# [255, 255, 255]],
# ...,
# [[14, 16, 54],
# [12, 14, 52],
# ...,
# [254, 254, 254]],
# [[8, 11, 44],
# [11, 16, 46],
# ...,
# [255, 254, 255]],
# [[4, 9, 31],
# [0, 2, 0],
# ...,
# [57, 109, 231]]], dtype=uint8)
PyTorch's NEAREST_EXACT
matches the Scikit-image's Nearest-neighbor and PIL's(Pillow's) NEAREST which aren't buggy:
from torchvision.datasets import OxfordIIITPet
from torchvision.transforms.v2 import PILToTensor, Resize
import numpy as np
from skimage.transform import resize
ptt = PILToTensor()
pytorchimagetensor = ptt(origin_data[0][0])
r = Resize(size=[50, 50], interpolation=InterpolationMode.NEAREST_EXACT)
pytorch_resize = r(pytorchimagetensor).permute(dims=[1, 2, 0])
pytorch_resize
# tensor([[[36, 19, 11],
# [31, 20, 14],
# ...,
# [254, 254, 254]]
# [[241, 230, 114],
# [252, 251, 98],
# ...,
# [255, 255, 255]],
# [[73, 158, 195],
# [255, 253, 192],
# ...,
# [255, 255, 255]]
# ...,
# [[13, 13, 49],
# [12, 12, 50],
# ...,
# [253, 253, 253]],
# [[10, 14, 43],
# [177, 176, 172],
# ...,
# [61, 90, 216]],
# [[6, 8, 21],
# [14, 16, 41],
# ...,
# [60, 103, 231]]], dtype=torch.uint8)
numpyimagearray = np.array(object=origin_data[0][0])
scikitimage_resize = resize(image=numpyimagearray, # `0` is Nearest-neighbor.
output_shape=[50, 50], order=0)
scikitimage_resize
# array([[[36, 19, 11],
# [31, 20, 14],
# ...,
# [254, 254, 254]],
# [[241, 230, 114],
# [252, 251, 98],
# ...,
# [255, 255, 255]],
# [[73, 158, 195],
# [255, 253, 192],
# ...,
# [255, 255, 255]],
# ...,
# [[13, 13, 49],
# [12, 12, 50],
# ...,
# [253, 253, 253]],
# [[10, 14, 43],
# [177, 176, 172],
# ...,
# [61, 90, 216]],
# [[6, 8, 21],
# [14, 16, 41],
# ...,
# [60, 103, 231]]], dtype=uint8)
PILimagearray = np.array(origin_data[0][0].resize(size=[50, 50],
resample=0)) # `0` is Nearest.
PILimagearray
# array([[[36, 19, 11],
# [31, 20, 14],
# ...,
# [254, 254, 254]],
# [[241, 230, 114],
# [252, 251, 98],
# ...,
# [255, 255, 255]],
# [[73, 158, 195],
# [255, 253, 192],
# ...,
# [255, 255, 255]],
# ...,
# [[13, 13, 49],
# [12, 12, 50],
# ...,
# [253, 253, 253]],
# [[10, 14, 43],
# [177, 176, 172],
# ...,
# [61, 90, 216]],
# [[6, 8, 21],
# [14, 16, 41],
# ...,
# [60, 103, 231]]], dtype=uint8)
ptt = PILToTensor()
PILimagetensor = ptt(origin_data[0][0].resize(size=[50, 50],
resample=0)).permute(dims=[1, 2, 0])
PILimagetensor # `0` is Nearest.
# tensor([[[36, 19, 11],
# [31, 20, 14],
# ...,
# [254, 254, 254]],
# [[241, 230, 114],
# [252, 251, 98],
# ...,
# [255, 255, 255]],
# [[73, 158, 195],
# [255, 253, 192],
# ...,
# [255, 255, 255]],
# ...,
# [[13, 13, 49],
# [12, 12, 50],
# ...,
# [253, 253, 253]],
# [[10, 14, 43],
# [177, 176, 172],
# ...,
# [61, 90, 216]],
# [[6, 8, 21],
# [14, 16, 41],
# ...,
# [60, 103, 231]]], dtype=torch.uint8)
Top comments (0)