Page 1 of 1

Possible bug grayscale color reduction IM 6.8.8.10 Q16

Posted: 2014-04-02T11:08:57-07:00
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.

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Posted: 2014-04-02T12:32:07-07:00
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

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Posted: 2014-04-02T13:52:48-07:00
by magick
Add -treedepth 8 to your command line.

Re: Possible bug grayscale color reduction IM 6.8.8.10 Q16

Posted: 2014-04-02T14:23:33-07:00
by fmw42
magick wrote:Add -treedepth 8 to your command line.
That helps, but is not as good as using -posterize.