From 22ae88bd3b24c16e0bbf73fa33b52fce213c822c Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 31 Oct 2009 11:54:47 -0400 Subject: [PATCH 1/4] Add palette images --- scikits/image/data/palette_color.png | Bin 0 -> 1019 bytes scikits/image/data/palette_gray.png | Bin 0 -> 935 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 scikits/image/data/palette_color.png create mode 100644 scikits/image/data/palette_gray.png diff --git a/scikits/image/data/palette_color.png b/scikits/image/data/palette_color.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5878af4812cc5f65564820549c05024416f160 GIT binary patch literal 1019 zcmbu7KWGzR5XBD*qJcV!h?A&@WGLKJ1&h*FBN~bpsi2@OoGyZbLc2KBr8+2Gq=zjo zMIEGzDC%GlEJV1a6tp1XAP%959R$JU{N+pLF5ZyjyFc&VdzU*y^<&+YofQ%3t{v|` z&3Ef}WlI;IZ+`UM7wM9rlfwf%Hx3ms5f=%Oq*X;#OvP0~B}-XN%*0K?Bulrtn2WoF zOO{~`u@Dc5kSti5Vkw>yDOsSwHer-rimgqAsk&;YW?9VJOx-k0v+$s7uI?JHS!mI1 zp&lBcSy(b`sh%3CSx6%S*3g6(MA*zKumNM5cIqSuHw&{Y3R%qC-NG%4V0cjWun5bd zA6j&KTBK#M1GlgTKQI8rNJJANU=2-pL4?gfgAEwdv{NTRgnJe%QOIK65uU|a1jB=J zq-Qajvv3ED$7!s^OU%P9?7_4Hm4S2``AS8ECKpW14pAB#10G!%7sgn0J;F za(@oag*hoVy4G=#pWP?Y3qYtJeqK z&mXSuXeX}BPMrU|GO@fAdr7orR%br;tPResH}8GvWUk%)J=8q3@8;O8-ge8#yScSp zSErxPJlWit89&(gaB1m#^X=}=%*g)ji+}6m3qQ|o?PS(Zo$2}dX>`vEYjf$62al`0 Tm#e>Sw;E~#_5OvU7bpJ#d#0!R literal 0 HcmV?d00001 diff --git a/scikits/image/data/palette_gray.png b/scikits/image/data/palette_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..a47b5d54b4de73d491e8f8bf634c4c163c32aabd GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=f6{ftew|C&cyFuU`)zK0I;a#QOE? zr%jtyTU(owlH%>{ZDeF5DJcn5JPJlbU>Ju0`?FVff!<5bP0l+XkKg_=UD literal 0 HcmV?d00001 From 8077c2b206d4034c9afd242ad2777bca10b059f7 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 31 Oct 2009 11:55:46 -0400 Subject: [PATCH 2/4] Fix imread so palette images are converted to grayscale or RGB images --- scikits/image/io/pil_imread.py | 28 +++++++++++++++++++++++++++ scikits/image/io/tests/test_imread.py | 6 ++++++ 2 files changed, 34 insertions(+) diff --git a/scikits/image/io/pil_imread.py b/scikits/image/io/pil_imread.py index 421f45c7..946d00cd 100644 --- a/scikits/image/io/pil_imread.py +++ b/scikits/image/io/pil_imread.py @@ -34,6 +34,34 @@ def imread(fname, flatten=False, dtype=None): " instructions.") im = Image.open(fname) + if im.mode == 'P': + if palette_is_grayscale(im): + im = im.convert('L') + else: + im = im.convert('RGB') if flatten and not im.mode in ('1', 'L', 'I', 'F', 'I;16', 'I;16L', 'I;16B'): im = im.convert('F') return np.array(im, dtype=dtype) + + +def palette_is_grayscale(pil_image): + """Return True if PIL image is grayscale. + + Parameters + ---------- + pil_image : PIL image + PIL Image that is in Palette mode. + + Returns + ------- + is_grayscale : bool + True if all colors in image palette are gray. + """ + assert pil_image.mode == 'P' + # get palette as an array with R, G, B columns + palette = np.asarray(pil_image.getpalette()).reshape((256, 3)) + # Not all palette colors are used; unused colors have junk values. + start, stop = pil_image.getextrema() + valid_palette = palette[start:stop] + # Image is grayscale if channel differences (R - G and G - B) are all zero. + return np.allclose(np.diff(valid_palette), 0) diff --git a/scikits/image/io/tests/test_imread.py b/scikits/image/io/tests/test_imread.py index 86aa8fe6..ecbd388d 100644 --- a/scikits/image/io/tests/test_imread.py +++ b/scikits/image/io/tests/test_imread.py @@ -15,3 +15,9 @@ def test_imread_flatten(): def test_imread_dtype(): img = imread(os.path.join(data_dir, 'camera.png'), dtype=np.float64) assert img.dtype == np.float64 + +def test_imread_palette(): + img = imread(os.path.join(data_dir, 'palette_gray.png')) + assert img.ndim == 2 + img = imread(os.path.join(data_dir, 'palette_color.png')) + assert img.ndim == 3 From 56833384e1521c1a1d2b682ac975f1a783995ce8 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 31 Oct 2009 11:59:20 -0400 Subject: [PATCH 3/4] Add test for palette_is_grayscale --- scikits/image/io/pil_imread.py | 2 +- scikits/image/io/tests/test_imread.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/scikits/image/io/pil_imread.py b/scikits/image/io/pil_imread.py index 946d00cd..e81b818e 100644 --- a/scikits/image/io/pil_imread.py +++ b/scikits/image/io/pil_imread.py @@ -1,4 +1,4 @@ -__all__ = ['imread'] +__all__ = ['imread', 'palette_is_grayscale'] import numpy as np diff --git a/scikits/image/io/tests/test_imread.py b/scikits/image/io/tests/test_imread.py index ecbd388d..6ab506b4 100644 --- a/scikits/image/io/tests/test_imread.py +++ b/scikits/image/io/tests/test_imread.py @@ -2,7 +2,7 @@ import os.path import numpy as np from scikits.image import data_dir -from scikits.image.io import imread +from scikits.image.io import imread, palette_is_grayscale def test_imread_flatten(): # a color image is flattened and returned as float32 @@ -21,3 +21,13 @@ def test_imread_palette(): assert img.ndim == 2 img = imread(os.path.join(data_dir, 'palette_color.png')) assert img.ndim == 3 + +def test_palette_is_gray(): + try: + from PIL import Image + except ImportError: + return + gray = Image.open(os.path.join(data_dir, 'palette_gray.png')) + assert palette_is_grayscale(gray) + color = Image.open(os.path.join(data_dir, 'palette_color.png')) + assert not palette_is_grayscale(color) From a6ad7415d7a43185cea898d3454e087b0b01f105 Mon Sep 17 00:00:00 2001 From: Ralf Gommers Date: Sat, 31 Oct 2009 18:37:04 +0100 Subject: [PATCH 4/4] Minor changes to Tony Yu's palette_is_grayscale. --- scikits/image/io/pil_imread.py | 8 ++++---- scikits/image/io/tests/test_imread.py | 8 +++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/scikits/image/io/pil_imread.py b/scikits/image/io/pil_imread.py index e81b818e..10d273ca 100644 --- a/scikits/image/io/pil_imread.py +++ b/scikits/image/io/pil_imread.py @@ -1,4 +1,4 @@ -__all__ = ['imread', 'palette_is_grayscale'] +__all__ = ['imread'] import numpy as np @@ -45,13 +45,13 @@ def imread(fname, flatten=False, dtype=None): def palette_is_grayscale(pil_image): - """Return True if PIL image is grayscale. - + """Return True if PIL image in palette mode is grayscale. + Parameters ---------- pil_image : PIL image PIL Image that is in Palette mode. - + Returns ------- is_grayscale : bool diff --git a/scikits/image/io/tests/test_imread.py b/scikits/image/io/tests/test_imread.py index 6ab506b4..2e9a2f7a 100644 --- a/scikits/image/io/tests/test_imread.py +++ b/scikits/image/io/tests/test_imread.py @@ -2,7 +2,8 @@ import os.path import numpy as np from scikits.image import data_dir -from scikits.image.io import imread, palette_is_grayscale +from scikits.image.io import imread +from scikits.image.io.pil_imread import palette_is_grayscale def test_imread_flatten(): # a color image is flattened and returned as float32 @@ -23,10 +24,7 @@ def test_imread_palette(): assert img.ndim == 3 def test_palette_is_gray(): - try: - from PIL import Image - except ImportError: - return + from PIL import Image gray = Image.open(os.path.join(data_dir, 'palette_gray.png')) assert palette_is_grayscale(gray) color = Image.open(os.path.join(data_dir, 'palette_color.png'))