如何修改8位图的灰度值

killercat 2008-04-02 03:19:24
读取8位图的灰度值倒是容易,但是如何修改8位图的灰度值?
...全文
578 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
wangdong_monkey 2008-04-09
  • 打赏
  • 举报
回复
如果你用的是8位的灰度图
那么数据区中的索引值就是灰度值
因为调色板中的灰度是按照0-255的顺序存放的!除非你用了什么表态的调色板!

如果你采用256色的彩色图
不建议你修改调色板!因为可能会产生连锁反应!
个人观点——在调色板中找到与你想改的颜色最接近的颜色(因为调色板里可能没有你要的颜色),然后把数据区索引值改掉就行了!
至于什么是最接近的颜色,我觉得不同的应用中可能要考虑的不太一样!如果单从视觉角度考虑的话,人眼的颜色不同的敏感程度要大于对亮度的敏感程度,所以可以考虑转色系分析差异!
扯的好像有点远!楼主自己考虑一下吧!
cnzdgs 2008-04-03
  • 打赏
  • 举报
回复
在调色板中查找你要修改后的灰度值,然后取索引替换像素点的索引值。
如果你要修改大量像素点,就先把位图转换一下,按灰度值次序生成调色板,这样索引值与灰度值就相同了。
killercat 2008-04-03
  • 打赏
  • 举报
回复
GetNearestPaletteIndex 这个函数是什么意思?
keaiting 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cnzdgs 的回复:]
在调色板中查找你要修改后的灰度值,然后取索引替换像素点的索引值。
如果你要修改大量像素点,就先把位图转换一下,按灰度值次序生成调色板,这样索引值与灰度值就相同了。
[/Quote]
赞成这个观点!不知搂主试验了吗?哪个效果好?
vcPlayer 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 killercat 的回复:]
我发现
索引值 0 时,灰度值为 0
索引值 255 时,灰度值为 255
但是在中间,灰度和索引值不相同,并且这个偏差是不可以忽略的,我现在把我的实验的结果帖出来给大家看一下:
1) 使用真正的灰度值,即通过颜色表计算而到的灰度值,实验中会得到如下图像:
[img]http://www.i170.com/Attach/D1C7B24C-8AB9-456D-B8F4-3694FA0A20C9[/img]
2)使用索引做灰度值的结果:
[img]http://www.i170.com/Attach/5E0A49C1-0F78…
[/Quote]

这可能是灰度转换程序经过了特殊处理的。一般都把这些设为对应的值。

还有个办法:如果LZ能得到这个图片的调色板CPalette,那么当你想把灰度100改为200的时候,可以用BYTE bytNewInd = CPalette::GetNearestPaletteIndex(200); 然后把这个bytNewInd替换100。
killercat 2008-04-02
  • 打赏
  • 举报
回复
我发现
索引值 0 时,灰度值为 0
索引值 255 时,灰度值为 255
但是在中间,灰度和索引值不相同,并且这个偏差是不可以忽略的,我现在把我的实验的结果帖出来给大家看一下:
1) 使用真正的灰度值,即通过颜色表计算而到的灰度值,实验中会得到如下图像:
[img]http://www.i170.com/Attach/D1C7B24C-8AB9-456D-B8F4-3694FA0A20C9[/img]
2)使用索引做灰度值的结果:
[img]http://www.i170.com/Attach/5E0A49C1-0F78-4B89-8F38-4078DDFF2441[/img]

使用索引做灰度值是错误的。

现在问题是,我需要修改灰度值,那么又不要影响到其他的像素点,好像是是否困难的。
cnzdgs 2008-04-02
  • 打赏
  • 举报
回复
如果你是想改变一个点的颜色值,那就改它的索引值。
killercat 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cnzdgs 的回复:]
LZ所说的“灰度”是什么意思?
我所说的“灰度”是每种颜色的R、G、B值都相等,共256种颜色,其中R、G、B的值就是灰度值。
[/Quote]

关于这个问题,我还需要详细说一下,我最近在做一个有关机器视觉的东西,我最初的时候使用索引值来表示灰度(0 ,255),但是进过实验发现,这个值并不能得到实验的正确结果,后来读取调色板中的值,使用 (r + b + g) / 3 计算灰度值(或者使用其他的计算公式),之后可以得到正确的实验结果。所以这里对灰度这个东西有一点疑问,而且在后续的程序中,需要修改灰度,不知道如何做。

按上面的说法,如果去修改调色板中的值,会导致索引相同的像素点的颜色一起改变。
killercat 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Mackz 的回复:]
你修改调色板中的颜色,不就可以了?这和灰度值计算完全是两码事儿。
[/Quote]
我想问一下,如何计算灰度值?
现在你想,图中点(1,1)在调色板中的索引值为 100,那么我现在改掉这个点对应的调色板中的值,那么也就是说,图片中所有的,索引值为 100 的点的灰度值都被改变了,这个不是想要的结果。
cnzdgs 2008-04-02
  • 打赏
  • 举报
回复
LZ所说的“灰度”是什么意思?
我所说的“灰度”是每种颜色的R、G、B值都相等,共256种颜色,其中R、G、B的值就是灰度值。
菜牛 2008-04-02
  • 打赏
  • 举报
回复
你修改调色板中的颜色,不就可以了?这和灰度值计算完全是两码事儿。
coolcoffee4051982 2008-04-02
  • 打赏
  • 举报
回复
有点晕
killercat 2008-04-02
  • 打赏
  • 举报
回复
忽然发现一个问题:
灰度值是不是就是索引值啊?
lc2236 2008-04-02
  • 打赏
  • 举报
回复
cnzdgs 正解
sunrisemaple 2008-04-02
  • 打赏
  • 举报
回复
你这个计算灰度值的方法不是一对一的,也就是说不同的RGB组合会产生相同的灰度值。
这样你往回算的时候就找不到唯一的RGB组合了。

楼主是想通过改变灰度值来改变原彩色图像的效果吗?如果这样的话,建议把RGB图先转成YUV,对Y值做变换,然后再转回RGB格式,这样图像不会失真。
killercat 2008-04-02
  • 打赏
  • 举报
回复
我自己研究了一下,写了个程序,求出了灰度对应的R,G,B的值:
0 --- 3 0 0
1 --- 7 0 0
2 --- 11 0 0
3 --- 15 0 0
4 --- 19 0 0
5 --- 23 0 0
6 --- 27 0 0
7 --- 31 0 0
8 --- 35 0 0
9 --- 39 0 0
10 --- 43 0 0
11 --- 47 0 0
12 --- 51 0 0
13 --- 55 0 0
14 --- 59 0 0
15 --- 63 0 0
16 --- 67 0 0
17 --- 71 0 0
18 --- 75 0 0
19 --- 79 0 0
20 --- 83 0 0
21 --- 87 0 0
22 --- 91 0 0
23 --- 95 0 0
24 --- 99 0 0
25 --- 103 0 0
26 --- 107 0 0
27 --- 111 0 0
28 --- 115 0 0
29 --- 119 0 0
30 --- 123 0 0
31 --- 127 0 0
32 --- 131 0 0
33 --- 135 0 0
34 --- 139 0 0
35 --- 143 0 0
36 --- 147 0 0
37 --- 151 0 0
38 --- 155 0 0
39 --- 159 0 0
40 --- 163 0 0
41 --- 167 0 0
42 --- 171 0 0
43 --- 175 0 0
44 --- 179 0 0
45 --- 183 0 0
46 --- 187 0 0
47 --- 191 0 0
48 --- 195 0 0
49 --- 199 0 0
50 --- 203 0 0
51 --- 207 0 0
52 --- 211 0 0
53 --- 215 0 0
54 --- 219 0 0
55 --- 223 0 0
56 --- 227 0 0
57 --- 231 0 0
58 --- 235 0 0
59 --- 239 0 0
60 --- 243 0 0
61 --- 247 0 0
62 --- 251 0 0
63 --- 255 0 0
64 --- 255 2 0
65 --- 255 4 0
66 --- 255 6 0
67 --- 255 8 0
68 --- 255 10 0
69 --- 255 12 0
70 --- 255 14 0
71 --- 255 16 0
72 --- 255 18 0
73 --- 255 20 0
74 --- 255 22 0
75 --- 255 24 0
76 --- 255 26 0
77 --- 255 28 0
78 --- 255 30 0
79 --- 255 32 0
80 --- 255 34 0
81 --- 255 36 0
82 --- 255 38 0
83 --- 255 40 0
84 --- 255 42 0
85 --- 255 44 0
86 --- 255 46 0
87 --- 255 48 0
88 --- 255 50 0
89 --- 255 52 0
90 --- 255 54 0
91 --- 255 56 0
92 --- 255 58 0
93 --- 255 60 0
94 --- 255 62 0
95 --- 255 64 0
96 --- 255 66 0
97 --- 255 68 0
98 --- 255 70 0
99 --- 255 72 0
100 --- 255 74 0
101 --- 255 76 0
102 --- 255 78 0
103 --- 255 80 0
104 --- 255 82 0
105 --- 255 84 0
106 --- 255 86 0
107 --- 255 88 0
108 --- 255 90 0
109 --- 255 92 0
110 --- 255 94 0
111 --- 255 96 0
112 --- 255 98 0
113 --- 255 100 0
114 --- 255 102 0
115 --- 255 104 0
116 --- 255 106 0
117 --- 255 108 0
118 --- 255 110 0
119 --- 255 112 0
120 --- 255 114 0
121 --- 255 116 0
122 --- 255 118 0
123 --- 255 120 0
124 --- 255 122 0
125 --- 255 124 0
126 --- 255 126 0
127 --- 255 128 0
128 --- 255 130 0
129 --- 255 132 0
130 --- 255 134 0
131 --- 255 136 0
132 --- 255 138 0
133 --- 255 140 0
134 --- 255 142 0
135 --- 255 144 0
136 --- 255 146 0
137 --- 255 148 0
138 --- 255 150 0
139 --- 255 152 0
140 --- 255 154 0
141 --- 255 156 0
142 --- 255 158 0
143 --- 255 160 0
144 --- 255 162 0
145 --- 255 164 0
146 --- 255 166 0
147 --- 255 168 0
148 --- 255 170 0
149 --- 255 172 0
150 --- 255 174 0
151 --- 255 176 0
152 --- 255 178 0
153 --- 255 180 0
154 --- 255 182 0
155 --- 255 184 0
156 --- 255 186 0
157 --- 255 188 0
158 --- 255 190 0
159 --- 255 192 0
160 --- 255 194 0
161 --- 255 196 0
162 --- 255 198 0
163 --- 255 200 0
164 --- 255 202 0
165 --- 255 204 0
166 --- 255 206 0
167 --- 255 208 0
168 --- 255 210 0
169 --- 255 212 0
170 --- 255 214 0
171 --- 255 216 0
172 --- 255 218 0
173 --- 255 220 0
174 --- 255 222 0
175 --- 255 224 0
176 --- 255 226 0
177 --- 255 228 0
178 --- 255 230 0
179 --- 255 232 0
180 --- 255 234 0
181 --- 255 236 0
182 --- 255 238 0
183 --- 255 240 0
184 --- 255 242 0
185 --- 255 244 0
186 --- 255 246 0
187 --- 255 248 0
188 --- 255 250 0
189 --- 255 252 0
190 --- 255 254 0
191 --- 255 255 2
192 --- 255 255 6
193 --- 255 255 10
194 --- 255 255 14
195 --- 255 255 18
196 --- 255 255 22
197 --- 255 255 26
198 --- 255 255 30
199 --- 255 255 34
200 --- 255 255 38
201 --- 255 255 42
202 --- 255 255 46
203 --- 255 255 50
204 --- 255 255 54
205 --- 255 255 58
206 --- 255 255 62
207 --- 255 255 66
208 --- 255 255 70
209 --- 255 255 74
210 --- 255 255 78
211 --- 255 255 82
212 --- 255 255 86
213 --- 255 255 90
214 --- 255 255 94
215 --- 255 255 98
216 --- 255 255 102
217 --- 255 255 106
218 --- 255 255 110
219 --- 255 255 114
220 --- 255 255 118
221 --- 255 255 122
222 --- 255 255 126
223 --- 255 255 130
224 --- 255 255 134
225 --- 255 255 138
226 --- 255 255 142
227 --- 255 255 146
228 --- 255 255 150
229 --- 255 255 154
230 --- 255 255 158
231 --- 255 255 162
232 --- 255 255 166
233 --- 255 255 170
234 --- 255 255 174
235 --- 255 255 178
236 --- 255 255 182
237 --- 255 255 186
238 --- 255 255 190
239 --- 255 255 194
240 --- 255 255 198
241 --- 255 255 202
242 --- 255 255 206
243 --- 255 255 210
244 --- 255 255 214
245 --- 255 255 218
246 --- 255 255 222
247 --- 255 255 226
248 --- 255 255 230
249 --- 255 255 234
250 --- 255 255 238
251 --- 255 255 242
252 --- 255 255 246
253 --- 255 255 250
254 --- 255 255 254
255 --- 255 255 255
其中,使用 ((r+(g < <1)+b)>>2)&0xFF 来求灰度。
killercat 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
引用 1 楼 killercat 的回复:
比如在颜色表中索引为 100 的像素点的灰度值为 80,现在需要修改成 200,如何做?

bmiColors[100].rgbRed = 200;
bmiColors[100].rgbGreen = 200;
bmiColors[100].rgbBlue = 200;
这样就行了。
[/Quote]

我用:
pal[i] = 0.299*r+0.587*g+0.114*b; 来计算灰度和 (((r+(g<<1)+b)>>2)&0xFF) 效果差不多,但是后者效率要高一些,如果改用 (r + g + b) / 3,倒是可以用你的办法。
cnzdgs 2008-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 killercat 的回复:]
比如在颜色表中索引为 100 的像素点的灰度值为 80,现在需要修改成 200,如何做?
[/Quote]
bmiColors[100].rgbRed = 200;
bmiColors[100].rgbGreen = 200;
bmiColors[100].rgbBlue = 200;
这样就行了。
加载更多回复(6)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧