ImageResize does not linearize before resize?

216 views
Skip to first unread message

Jari Paljakka

unread,
Mar 6, 2011, 5:46:18 AM3/6/11
to
Hi,

While trialing Mathematica 8, I noticed ImageResize[] doesn't seem to linearize
the colorspace before resizing.

Is this intentional?

Reasoning why it would be a nice option to have:
http://www.4p8.com/eric.brasseur/gamma.html

Of course, to "fix" this properly, image needs to have information in what
colorspace it is in in the first place, but to have
the option available directly in ImageResize would be nice, as I suspect it
could be made quite a bit faster.

This non-linearization is probably assumed for all other image functions too?

Example how to expose the issue (and how to fix, albeit slow and convoluted):

(used "Dalai Lama" pic from the link above, which is constructed to exhibit the
issue)
(remove compilation target etc if you don't have a compiler - was testing how
to make corrections run "faster")

Clear[srgb2linear, linear2srgb, linearresize, image];
srgb2linear = Compile[{{Csrgb, _Real, 1}},
With[{\[Alpha] = 0.055}, Table[Piecewise[
{{C/12.92,
C <= 0.04045}, {((C + \[Alpha])/(1 + \[Alpha]))^2.4,
C > 0.04045}}], {C, Csrgb}]], RuntimeAttributes ->
{Listable}, Parallelization -> True, CompilationTarget ->
"C", RuntimeOptions -> "Speed"];
linear2srgb = Compile[{{Clinear, _Real, 1}},
With[{\[Alpha] = 0.055}, Table[Piecewise[
{{12.92*C,
C <= 0.0031308}, {(1 + \[Alpha])*C^(1/2.4) - \[Alpha],
C > 0.0031308}}], {C, Clinear}]],
RuntimeAttributes -> {Listable}, Parallelization -> True,
CompilationTarget -> "C", RuntimeOptions -> "Speed"];
linearresize[image_Image, scaling_] :=
Module[{}, ((Image[#1, ColorSpace -> "RGB"] & )[
linear2srgb[ImageData[#1, Interleaving -> True]]] & )[
ImageResize[(Image[#1, ColorSpace -> "RGB"] & )[
srgb2linear[ImageData[image, Interleaving -> True]]],
scaling]]]
image = Image["Dalai Lama", "Real"]

In[432]:= ImageResize[ImageResize[image, Scaled[1/2]], Scaled[2]]

Out:= Screwed up picture

In[433]:= linearresize[linearresize[image, Scaled[1/2]], Scaled[2]]

Out:= Correct image (of course sampled)


Matthias Odisio

unread,
Mar 8, 2011, 6:02:50 AM3/8/11
to
Jari,

This genuine issue will be properly addressed in a future release of
Mathematica. In the meanwhile, one needs to revert to bits of code,
as you did.

In this particular case, your code produces on my machine a white
image. That gamma correction seems to give a correct result:

lin = ImageAdjust[image, {0, 0, 1.8}];
res = ImageResize[ImageResize[lin, Scaled[1/2]], Scaled[2]];
res = ImageAdjust[res, {0, 0, 1/1.8}];

(These values may be machine and OS dependent.)

Matthias Odisio
Wolfram Research

Jari Paljakka

unread,
Mar 9, 2011, 7:03:34 AM3/9/11
to
Hi Matthias,

Thank you very much for the confirmation! I was not sure if it was something
that would be addressed, or if all imagedata was to be assumed linearized.

>In this particular case, your code produces on my machine a white
>image. That gamma correction seems to give a correct result:
>
>lin = ImageAdjust[image, {0, 0, 1.8}];
>res = ImageResize[ImageResize[lin, Scaled[1/2]], Scaled[2]];
>res = ImageAdjust[res, {0, 0, 1/1.8}];
>
>(These values may be machine and OS dependent.)

Yes, very much so, dependent on the source image, and how you got it into
Mathematica (copy/paste results from browser are dependent on browser & OS
used, for example).
My "quick code" assumes strictly SRGB (flat part of the curve accounted for
instead of pure gamma curve), normalized to [0,1] and, I think, does not handle
alpha channels properly. :)

ImageAdjust works well if you have just a pure gamma curve (like you would with
AdobeRGB, for example), or if absolute accuracy isn't too important and
approximation is good enough (like it is for this test image, actually).

Can you divulge if there would be any plans to implement generalized color
handling for images in Mathematica?
I.e. something along the lines:
(* assert image colorspace as "xxx")
img=Image[blaa, ColorSpace->"AdobeRGB"];
(* convert to new space *)
ColorConvert[img, "SRGB"]

Preferrably with the possibility of user definable matrices/color
primaries/transfer functions? (of course, this could be expanded to be usable
in Import/Export and image functions in general)

I was going to implement something like that (for my own amusement mainly, to
learn Mathematica and some color theory and to test analyzing some video data
where it is important to have the BT.601/709 primaries accounted for). This is,
of course, going to be "slowish" (for "real" use) compared to if internal
functions would support something like this directly. Compile[] seems to work
wonders, though (still slow as molasses compared to properly vectorized asm
implementation, which is not surprising). :)

>Matthias Odisio
>Wolfram Research

JariP

Matthias Odisio

unread,
Mar 10, 2011, 6:12:08 AM3/10/11
to
Jari,

>> This genuine issue will be properly addressed in a future release of
>> Mathematica. In the meanwhile, one needs to revert to bits of code,
>> as you did.
>
> Thank you very much for the confirmation! I was not sure if it was something
> that would be addressed, or if all imagedata was to be assumed linearized.

/.../


>
> Can you divulge if there would be any plans to implement generalized color
> handling for images in Mathematica?

That's what I meant by 'properly addressed', yes.

Feel free to reply to me off the list if you'd like to be in contact
with developers involved in this project.

Matthias Odisio
Wolfram Research

Alexey Popkov

unread,
Dec 3, 2012, 3:33:11 AM12/3/12
to
Hi Matthias,

Reviving an old question in connection with the release of version 9, could you please explain how to use the new image processing functionality for correct image resizing? I could not find in the documentation instructions how to do it correctly in the sense described on the page

http://www.4p8.com/eric.brasseur/gamma.html

Sincerely,
Alexey Popkov

Matthias Odisio

unread,
Dec 20, 2012, 3:19:37 AM12/20/12
to
On 11/30/12 4:59 AM, Alexey Popkov wrote:
>
> Hi Matthias,
>
> Reviving an old question in connection with the release of version 9, could you please explain how to use the new image processing functionality for correct image resizing? I could not find in the documentation instructions how to do it correctly in the sense described on the page
>
> http://www.4p8.com/eric.brasseur/gamma.html
>
> Sincerely,
> Alexey Popkov


The discussion moved to:

http://mathematica.stackexchange.com/questions/15596/the-correct-way-to-linearize-colorspace-before-resizing-blurring-etc#

For the record:

In summary, Alexey developed a solution with Mathematica 9, using
especially the new color profiles features.

Excerpts from my comment:
"[Alexey's solution] is clearly my preferred approach for this
problem. Please keep in mind that image processing is applied to
many domains where pixel data have arbitrary (or even no) physical
units; for these cases M's implementation is the most appropriate;
[the current issue] is nearly marginal, and M9 allows for an elegant
workaround."

Matthias Odisio
Wolfram Research


Reply all
Reply to author
Forward
0 new messages