- 灰阶图像,通常每个Pixel是由8个bit构成,即有256种变化。然而每个Pixel的8个bit,从最高位到最低位携带的信息量是逐渐递减的。可以看下面几幅图:
- 右边是原图,下面就是将灰阶图每一个pixel的8bit分别取出,然后构成的8个平面,从右到左是0bit - 7bit 。可以看出越高位的位图携带原图的信息量越多、特征越多,甚至最后几张位图看上去就像杂讯。所以,其实最后几个位图完全不记录、去除,对原图的影响也是微乎其微,我们肉眼几乎无法察觉差异。所以很多浮水印技术就是通过替换最低几bit 的位图,做到为图像添加肉眼无法察觉的水印。
- 格雷码形式:计算机中格雷码的出现是为了避免牵一发而动全身的情况,比如说:0111 1000 , 一个自然进位会导致四个bit同时都被改变的情况,这样就会降低系统的稳定性,因为在0111变化到1000时通常还会有1100、1111...等情况出现。所以为了避免,格雷码就诞生了,一次只会有一个bit变化。同样,灰阶图像的位图也可以先化为格雷码的形式,再进行分割。
- 自然二进位变换成格雷码的规则:最高位直接保留,构成格雷码的最高位。然后从左往右,最高位与次高位异或,结果为格雷码的次高位。以此类推......。
- 当然还要来个格雷码变二进制:同样格雷码最高位变成二进制最高位,不同的是格雷码次高位与二进制最高位异或,结果为二进制次高位。以此类推......从左往右。
C#代码:
自然二进位分割:
public void bitSlicing(Bitmap Image)
{
graycode = false;
imop = new imageOperate();
Bitmap GrayImg = imop.getGrayImage8(Image);
PCXPicture.Image = GrayImg;
int width = Image.Width;
int height = Image.Height;
Bitmap level1 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level2 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level3 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level4 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level5 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level6 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level7 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
Bitmap level8 = new Bitmap(width, height, PixelFormat.Format24bppRgb);
BitmapData level1Data = level1.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData level2Data = level2.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData level3Data = level3.LockBits(new Rectangle(0, 0, widt