小白求教几句关于图像处理的语句

wangxiahui58 2010-12-21 03:27:48
pixel = Picture2.Point(i, j)
red = pixel Mod 256
green = (pixel And &HFF00FF00) / 256
blue = (pixel And &HFF0000) / 65536
red这里为什么要与256取余啊,它的含义是什么?下面的先和16进制数与运算后,为什么还要除以256和65534,与运算是取相应的位数这个理解对吗?对于位运算不太熟悉,不知道怎么提取变量个字节,请各位大虾耐心点讲清楚,谢谢了!!
...全文
98 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiahui58 2010-12-22
  • 打赏
  • 举报
回复
我这段代码其实是图像隐藏里的一段,不是转换为灰度图像的
wangxiahui58 2010-12-22
  • 打赏
  • 举报
回复
谢谢各位,尤其谢谢2楼,讲得很仔细,谢谢啊!
贝隆 2010-12-21
  • 打赏
  • 举报
回复
2楼的说法是正确的
颜色是存储在三个字节中的,这三个字节由高到底依次:B G R 之所以要进行 MOD运行也就是分离字节内容而已。
dbcontrols 2010-12-21
  • 打赏
  • 举报
回复
哈哈,楼主的代码来自一个图片换为灰度的示例,不相及么?
只是想告诉他为什么是256和65536
laviewpbt 2010-12-21
  • 打赏
  • 举报
回复
Red = Pixel And 255改为
Red = Pixel And &HFF 你就可以感到特征更明显。
laviewpbt 2010-12-21
  • 打赏
  • 举报
回复
楼上的回答和楼主问题风马牛不相及啊。
首先告诉正确的计算公式应该是:

Red = Pixel And 255
Green = (Pixel And &HFF00) \ 256
Blue = (Pixel And &HFF0000) \ 65536

VB的Point函数返回值是long型变量,该变量保存当前的颜色值。
首先你要知道VB中的颜色值的在内存中的顺序,如下

字节 1 2 3 4 ( 四个字节,即一个long型变量)
RGB _ B G R

即 long 变量的第四个字节代表Red分量,第三个字节代表Green分量,第二个字节代表Blue分量,第一个字节在VB的颜色体系中没有用。
那剩下的就是如何得到每个字节的问题了,这就需要用到位运算。

比如要得到Red分量,我们就把这个long颜色值直接和255进行AND运算就可以了,因为255的二进制字符串为
00000000000000000000000011111111,即最后八位为1,我们知道只有1和1进行AND位运算结果才为1,那么原先的LONG变量和255进行AND运算就只会保留最后的8位不变,而前24位都为0了。这样就得到了RED分量

而对于Green分量,我们用这样的二进制数字 00000000000000001111111100000000,即第17位到24位为1的数字(对应的16进制数据为&HFF00)和颜色值进行AND运算,但是这样的运算结果比实际的 Green分量放大了256倍(注意到后面的8个0没),所以要对这个数据右移8位,在VB中没有移位的运算符,但是对于整数,右移运算符在适当情况下会被编译为右移。

对于BLUE分量,道理同Green分量。

大部分人的Red公式用的是Mod运算符,这只能说是256这个数字的特殊性,真正从原理上还是用应该用And来计算的。

其实我们可以这样做,还有益于VB中最高位为0表示正数。


dbcontrols 2010-12-21
  • 打赏
  • 举报
回复
65536颜色(灰度级)  所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新存储单元的位数和显示器本身的性能。如每个象素的颜色用16位二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777216种颜色。

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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