Possible bug grayscale color reduction IM 6.8.8.10 Q16

Post any defects you find in the released or beta versions of the ImageMagick software here. Include the ImageMagick version, OS, and any command-line required to reproduce the problem. Got a patch for a bug? Post it here.
Post Reply
User avatar
fmw42
Posts: 25562
Joined: 2007-07-02T17:14:51-07:00
Authentication code: 1152
Location: Sunnyvale, California, USA

Possible bug grayscale color reduction IM 6.8.8.10 Q16

Post by fmw42 »

IM 6.8.8.10 Q16 Mac OSX Snow Leopard.

I am trying to use -colors to reduce the number of graylevels in a grayscale image, but am getting very coarse quantization, expecially when specifying the -colors 208 down to -colors 64 for which I always get the same number of graylevel of 28.

Is -colors working correctly for grayscale images? I would have expected to get a number of colors much closer if not equal to what was requested. I know the result can be less, but I did not expect this much less.


Here is my test code and the results follow:

for ((i=256;i>2;i--)); do
numcolors=`convert rose: -colorspace gray +dither -colors $i -depth 8 -unique-colors txt: | head -n 1 | tr -cs "0-9\n" " " | cut -d\ -f2`
echo "i=$i numcolors=$numcolors"
done

Code: Select all

i=256  numcolors=209
i=255  numcolors=209
i=254  numcolors=209
i=253  numcolors=209
i=252  numcolors=209
i=251  numcolors=209
i=250  numcolors=209
i=249  numcolors=209
i=248  numcolors=209
i=247  numcolors=209
i=246  numcolors=209
i=245  numcolors=209
i=244  numcolors=209
i=243  numcolors=209
i=242  numcolors=209
i=241  numcolors=209
i=240  numcolors=209
i=239  numcolors=209
i=238  numcolors=209
i=237  numcolors=209
i=236  numcolors=209
i=235  numcolors=209
i=234  numcolors=209
i=233  numcolors=209
i=232  numcolors=209
i=231  numcolors=209
i=230  numcolors=209
i=229  numcolors=209
i=228  numcolors=209
i=227  numcolors=209
i=226  numcolors=209
i=225  numcolors=209
i=224  numcolors=209
i=223  numcolors=209
i=222  numcolors=209
i=221  numcolors=209
i=220  numcolors=209
i=219  numcolors=209
i=218  numcolors=209
i=217  numcolors=209
i=216  numcolors=209
i=215  numcolors=209
i=214  numcolors=209
i=213  numcolors=209
i=212  numcolors=209
i=211  numcolors=209
i=210  numcolors=209
i=209  numcolors=209
i=208  numcolors=28
i=207  numcolors=28
i=206  numcolors=28
i=205  numcolors=28
i=204  numcolors=28
i=203  numcolors=28
i=202  numcolors=28
i=201  numcolors=28
i=200  numcolors=28
i=199  numcolors=28
i=198  numcolors=28
i=197  numcolors=28
i=196  numcolors=28
i=195  numcolors=28
i=194  numcolors=28
i=193  numcolors=28
i=192  numcolors=28
i=191  numcolors=28
i=190  numcolors=28
i=189  numcolors=28
i=188  numcolors=28
i=187  numcolors=28
i=186  numcolors=28
i=185  numcolors=28
i=184  numcolors=28
i=183  numcolors=28
i=182  numcolors=28
i=181  numcolors=28
i=180  numcolors=28
i=179  numcolors=28
i=178  numcolors=28
i=177  numcolors=28
i=176  numcolors=28
i=175  numcolors=28
i=174  numcolors=28
i=173  numcolors=28
i=172  numcolors=28
i=171  numcolors=28
i=170  numcolors=28
i=169  numcolors=28
i=168  numcolors=28
i=167  numcolors=28
i=166  numcolors=28
i=165  numcolors=28
i=164  numcolors=28
i=163  numcolors=28
i=162  numcolors=28
i=161  numcolors=28
i=160  numcolors=28
i=159  numcolors=28
i=158  numcolors=28
i=157  numcolors=28
i=156  numcolors=28
i=155  numcolors=28
i=154  numcolors=28
i=153  numcolors=28
i=152  numcolors=28
i=151  numcolors=28
i=150  numcolors=28
i=149  numcolors=28
i=148  numcolors=28
i=147  numcolors=28
i=146  numcolors=28
i=145  numcolors=28
i=144  numcolors=28
i=143  numcolors=28
i=142  numcolors=28
i=141  numcolors=28
i=140  numcolors=28
i=139  numcolors=28
i=138  numcolors=28
i=137  numcolors=28
i=136  numcolors=28
i=135  numcolors=28
i=134  numcolors=28
i=133  numcolors=28
i=132  numcolors=28
i=131  numcolors=28
i=130  numcolors=28
i=129  numcolors=28
i=128  numcolors=28
i=127  numcolors=28
i=126  numcolors=28
i=125  numcolors=28
i=124  numcolors=28
i=123  numcolors=28
i=122  numcolors=28
i=121  numcolors=28
i=120  numcolors=28
i=119  numcolors=28
i=118  numcolors=28
i=117  numcolors=28
i=116  numcolors=28
i=115  numcolors=28
i=114  numcolors=28
i=113  numcolors=28
i=112  numcolors=28
i=111  numcolors=28
i=110  numcolors=28
i=109  numcolors=28
i=108  numcolors=28
i=107  numcolors=28
i=106  numcolors=28
i=105  numcolors=28
i=104  numcolors=28
i=103  numcolors=28
i=102  numcolors=28
i=101  numcolors=28
i=100  numcolors=28
i=99  numcolors=28
i=98  numcolors=28
i=97  numcolors=28
i=96  numcolors=28
i=95  numcolors=28
i=94  numcolors=28
i=93  numcolors=28
i=92  numcolors=28
i=91  numcolors=28
i=90  numcolors=28
i=89  numcolors=28
i=88  numcolors=28
i=87  numcolors=28
i=86  numcolors=28
i=85  numcolors=28
i=84  numcolors=28
i=83  numcolors=28
i=82  numcolors=28
i=81  numcolors=28
i=80  numcolors=28
i=79  numcolors=28
i=78  numcolors=28
i=77  numcolors=28
i=76  numcolors=28
i=75  numcolors=28
i=74  numcolors=28
i=73  numcolors=28
i=72  numcolors=28
i=71  numcolors=28
i=70  numcolors=28
i=69  numcolors=28
i=68  numcolors=28
i=67  numcolors=28
i=66  numcolors=28
i=65  numcolors=28
i=64  numcolors=28
i=63  numcolors=14
i=62  numcolors=14
i=61  numcolors=14
i=60  numcolors=14
i=59  numcolors=14
i=58  numcolors=14
i=57  numcolors=14
i=56  numcolors=14
i=55  numcolors=14
i=54  numcolors=14
i=53  numcolors=14
i=52  numcolors=14
i=51  numcolors=14
i=50  numcolors=14
i=49  numcolors=14
i=48  numcolors=14
i=47  numcolors=14
i=46  numcolors=14
i=45  numcolors=14
i=44  numcolors=14
i=43  numcolors=14
i=42  numcolors=14
i=41  numcolors=14
i=40  numcolors=14
i=39  numcolors=14
i=38  numcolors=14
i=37  numcolors=14
i=36  numcolors=14
i=35  numcolors=14
i=34  numcolors=14
i=33  numcolors=14
i=32  numcolors=14
i=31  numcolors=14
i=30  numcolors=14
i=29  numcolors=14
i=28  numcolors=14
i=27  numcolors=14
i=26  numcolors=14
i=25  numcolors=14
i=24  numcolors=14
i=23  numcolors=14
i=22  numcolors=14
i=21  numcolors=14
i=20  numcolors=14
i=19  numcolors=14
i=18  numcolors=14
i=17  numcolors=14
i=16  numcolors=14
i=15  numcolors=7
i=14  numcolors=7
i=13  numcolors=7
i=12  numcolors=7
i=11  numcolors=7
i=10  numcolors=7
i=9  numcolors=7
i=8  numcolors=7
i=7  numcolors=7
i=6  numcolors=6
i=5  numcolors=5
i=4  numcolors=4
i=3  numcolors=3
Here is just one extreme example where -colors 208 returns only 28 colors:

Code: Select all

convert rose: -colorspace gray +dither -colors 208 -depth 8 -unique-colors txt:

Code: Select all

# ImageMagick pixel enumeration: 28,1,255,gray
0,0: (39,39,39)  #272727  gray(39)
1,0: (45,45,45)  #2D2D2D  gray(45)
2,0: (51,51,51)  #333333  gray(51)
3,0: (59,59,59)  #3B3B3B  gray(59)
4,0: (67,67,67)  #434343  gray(67)
5,0: (76,76,76)  #4C4C4C  gray(76)
6,0: (84,84,84)  #545454  gray(84)
7,0: (91,91,91)  #5B5B5B  gray(91)
8,0: (99,99,99)  #636363  gray(99)
9,0: (107,107,107)  #6B6B6B  gray(107)
10,0: (116,116,116)  #747474  gray(116)
11,0: (124,124,124)  #7C7C7C  gray(124)
12,0: (132,132,132)  #848484  gray(132)
13,0: (139,139,139)  #8B8B8B  gray(139)
14,0: (147,147,147)  #939393  gray(147)
15,0: (155,155,155)  #9B9B9B  gray(155)
16,0: (163,163,163)  #A3A3A3  gray(163)
17,0: (171,171,171)  #ABABAB  gray(171)
18,0: (179,179,179)  #B3B3B3  gray(179)
19,0: (187,187,187)  #BBBBBB  gray(187)
20,0: (194,194,194)  #C2C2C2  gray(194)
21,0: (204,204,204)  #CCCCCC  gray(204)
22,0: (211,211,211)  #D3D3D3  gray(211)
23,0: (220,220,220)  #DCDCDC  gray(220)
24,0: (228,228,228)  #E4E4E4  gray(228)
25,0: (235,235,235)  #EBEBEB  gray(235)
26,0: (244,244,244)  #F4F4F4  gray(244)
27,0: (253,253,253)  #FDFDFD  gray(253)

P.S. 1
Looking back at several old versions of IM, this seems to be the way it has always worked for grayscale image. But I wonder if this can be improved or is just the limitation of color quantization for grayscale images?


P.S. 2
Using -posterize seems to do a much better job of returning a number of colors that is close if not equal to the number requested.
snibgo
Posts: 12159
Joined: 2010-01-23T23:01:33-07:00
Authentication code: 1151
Location: England, UK

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Post by snibgo »

I have noticed similar problems. "-colors" doesn't work well for grayscale images. "-posterize" forces a wide spread of alternatives, which can then be remapped to give what we would like "-colors" to do.

F:\web\im>%IM%convert rose: -colorspace gray +dither -colors 208 -unique-colors info:
rose: PPM 28x1 28x1+0+0 8-bit Grayscale Gray 28c 0.000u 0:00.000

F:\web\im>%IM%convert rose: -colorspace gray -write mpr:XX +dither -posterize 208 -remap mpr:XX -unique-colors info:
rose: PPM 171x1 171x1+0+0 8-bit Grayscale Gray 171c 0.000u 0:00.000
snibgo's IM pages: im.snibgo.com
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Post by magick »

Add -treedepth 8 to your command line.
User avatar
fmw42
Posts: 25562
Joined: 2007-07-02T17:14:51-07:00
Authentication code: 1152
Location: Sunnyvale, California, USA

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Post by fmw42 »

magick wrote:Add -treedepth 8 to your command line.
That helps, but is not as good as using -posterize.
Post Reply