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
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.