-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Converting this 16-bit grayscale image to 'L' mode destroys it #3011
Comments
There's a longstanding behavioral issue with Pillow where conversions don't intelligently use the range of the target mode. So, in this case, you're taking an image with values from 0-65k and converting it to 0-255, with clipping. Most of the values are > 255, so they're all white. When you start with an 8 bit image, you convert 0-255 to 0-65k, but since there's no promotion, it's still just a 0-255 image. Converting back is then not a problem. |
Avoid needless downsampling of 16 bits gray image to 8 bits, and current clipping from Pillow is wrong, see : python-pillow/Pillow#3011
This looks related to #3159 |
I've created PR #3838 to resolve this. |
Resolved by #3838 |
It turns out that this situation is more complicated. See #3838 (comment) |
FYI, my work around for my use case (large gray-scale images): x = np.linspace(0, 65535, 1000, dtype=np.uint16)
image = np.tile(x, (1000, 1)).T
plt.imshow(image)
plt.show()
im32 = image.astype(np.int32)
pil = Image.fromarray(im32, mode='I') Shouldn't lose precision. |
For I to L conversion, this works for me: def convert_I_to_L(img)
array = np.uint8(np.array(img) / 256)
return Image.fromarray(array) |
I wanted a non-numpy based solution and came up with: def convert_I_to_L(im: Image):
return ImageMath.eval('im >> 8', im=im.convert('I')).convert('L') comparing this to
|
Closing as part of #3159 |
Pull Request regarding Issue #2987 PIL.Image conversion from I;16 to L or RGB are unsuccessful as for now. See the corresponding Issue in the Pillow GitHub (Opened 2018, so no changes to be expected) python-pillow/Pillow#3011 The proposed changes at least fix this issue for the mode 'I;16' and delivers a possible solution for other modes (eg. I;16B/L/N). This results in a correct calculation of the preview thumbnail and the actual image, the annotation will be performed on. We have used this solution on our own dataset and created annotations accordingly.
Pull Request regarding Issue cvat-ai#2987 PIL.Image conversion from I;16 to L or RGB are unsuccessful as for now. See the corresponding Issue in the Pillow GitHub (Opened 2018, so no changes to be expected) python-pillow/Pillow#3011 The proposed changes at least fix this issue for the mode 'I;16' and delivers a possible solution for other modes (eg. I;16B/L/N). This results in a correct calculation of the preview thumbnail and the actual image, the annotation will be performed on. We have used this solution on our own dataset and created annotations accordingly.
Here is a 16-bit grayscale image:
It clearly contains a gradient of grays.
If I open it with Pillow, convert it to 8-bit grayscale, and save it, like so...
... then I get this, which is mostly completely white:
This conversion should work; according to http://pillow.readthedocs.io/en/4.2.x/handbook/tutorial.html#converting-between-modes
and according to http://pillow.readthedocs.io/en/latest/handbook/concepts.html#modes,
I
is a supported mode.Notably, I don't see this same problem if I start by loading an 8-bit RGB image from a JPG and then do
.convert('I').convert('L')
, so it's not simply the case thatI
->L
conversion is broken in general. I'm not what specifically leads to the breakage in this case.The text was updated successfully, but these errors were encountered: