• 灰阶图像,通常每个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, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level4Data = level4.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level5Data = level5.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level6Data = level6.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level7Data = level7.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level8Data = level8.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData GrayImgData = GrayImg.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);int size = GrayImgData.Stride * GrayImgData.Height;IntPtr intPtr = GrayImgData.Scan0;IntPtr intPtr1 = level1Data.Scan0;IntPtr intPtr2 = level2Data.Scan0;IntPtr intPtr3 = level3Data.Scan0;IntPtr intPtr4 = level4Data.Scan0;IntPtr intPtr5 = level5Data.Scan0;IntPtr intPtr6 = level6Data.Scan0;IntPtr intPtr7 = level7Data.Scan0;IntPtr intPtr8 = level8Data.Scan0;byte[] GrayImgBytes = new byte[size];byte[] level1Bytes = new byte[size];byte[] level2Bytes = new byte[size];byte[] level3Bytes = new byte[size];byte[] level4Bytes = new byte[size];byte[] level5Bytes = new byte[size];byte[] level6Bytes = new byte[size];byte[] level7Bytes = new byte[size];byte[] level8Bytes = new byte[size];Marshal.Copy(intPtr, GrayImgBytes, 0, size);Marshal.Copy(intPtr1, level1Bytes, 0, size);Marshal.Copy(intPtr2, level2Bytes, 0, size);Marshal.Copy(intPtr3, level3Bytes, 0, size);Marshal.Copy(intPtr4, level4Bytes, 0, size);Marshal.Copy(intPtr5, level5Bytes, 0, size);Marshal.Copy(intPtr6, level6Bytes, 0, size);Marshal.Copy(intPtr7, level7Bytes, 0, size);Marshal.Copy(intPtr8, level8Bytes, 0, size);int k = 3;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){byte R = GrayImgBytes[i * GrayImgData.Stride + j * k];int L1 = R & 1;if (L1 != 0) { L1 = 255; }int L2 = R & 2;if (L2 != 0) { L2 = 255; }int L3 = R & 4;if (L3 != 0) { L3 = 255; }int L4 = R & 8;if (L4 != 0) { L4 = 255; }int L5 = R & 16;if (L5 != 0) { L5 = 255; }int L6 = R & 32;if (L6 != 0) { L6 = 255; }int L7 = R & 64;if (L7 != 0) { L7 = 255; }int L8 = R & 128;if (L8 != 0) { L8 = 255; }level1Bytes[i * GrayImgData.Stride + j * k] = (byte)L1 ;level1Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L1;level1Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L1;level2Bytes[i * GrayImgData.Stride + j * k] = (byte)L2;level2Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L2;level2Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L2;level3Bytes[i * GrayImgData.Stride + j * k] = (byte)L3;level3Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L3;level3Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L3;level4Bytes[i * GrayImgData.Stride + j * k] = (byte)L4;level4Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L4;level4Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L4;level5Bytes[i * GrayImgData.Stride + j * k] = (byte)L5;level5Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L5;level5Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L5;level6Bytes[i * GrayImgData.Stride + j * k] = (byte)L6;level6Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L6;level6Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L6;level7Bytes[i * GrayImgData.Stride + j * k] = (byte)L7;level7Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L7;level7Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L7;level8Bytes[i * GrayImgData.Stride + j * k] = (byte)L8;level8Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)L8;level8Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)L8;}}Marshal.Copy(level1Bytes, 0, intPtr1, level1Bytes.Length);Marshal.Copy(level2Bytes, 0, intPtr2, level2Bytes.Length);Marshal.Copy(level3Bytes, 0, intPtr3, level3Bytes.Length);Marshal.Copy(level4Bytes, 0, intPtr4, level4Bytes.Length);Marshal.Copy(level5Bytes, 0, intPtr5, level5Bytes.Length);Marshal.Copy(level6Bytes, 0, intPtr6, level6Bytes.Length);Marshal.Copy(level7Bytes, 0, intPtr7, level7Bytes.Length);Marshal.Copy(level8Bytes, 0, intPtr8, level8Bytes.Length);level1.UnlockBits(level1Data);level2.UnlockBits(level2Data);level3.UnlockBits(level3Data);level4.UnlockBits(level4Data);level5.UnlockBits(level5Data);level6.UnlockBits(level6Data);level7.UnlockBits(level7Data);level8.UnlockBits(level8Data);GrayImg.UnlockBits(GrayImgData);level1Picture.Image = level1;level2Picture.Image = level2;level3Picture.Image = level3;level4Picture.Image = level4;level5Picture.Image = level5;level6Picture.Image = level6;level7Picture.Image = level7;level8Picture.Image = level8;}

格雷码风格:

public void grayCodeSlicing(Bitmap Image){graycode = true;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, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level4Data = level4.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level5Data = level5.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level6Data = level6.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level7Data = level7.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData level8Data = level8.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);BitmapData GrayImgData = GrayImg.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);int size = GrayImgData.Stride * GrayImgData.Height;IntPtr intPtr = GrayImgData.Scan0;IntPtr intPtr1 = level1Data.Scan0;IntPtr intPtr2 = level2Data.Scan0;IntPtr intPtr3 = level3Data.Scan0;IntPtr intPtr4 = level4Data.Scan0;IntPtr intPtr5 = level5Data.Scan0;IntPtr intPtr6 = level6Data.Scan0;IntPtr intPtr7 = level7Data.Scan0;IntPtr intPtr8 = level8Data.Scan0;byte[] GrayImgBytes = new byte[size];byte[] level1Bytes = new byte[size];byte[] level2Bytes = new byte[size];byte[] level3Bytes = new byte[size];byte[] level4Bytes = new byte[size];byte[] level5Bytes = new byte[size];byte[] level6Bytes = new byte[size];byte[] level7Bytes = new byte[size];byte[] level8Bytes = new byte[size];Marshal.Copy(intPtr, GrayImgBytes, 0, size);Marshal.Copy(intPtr1, level1Bytes, 0, size);Marshal.Copy(intPtr2, level2Bytes, 0, size);Marshal.Copy(intPtr3, level3Bytes, 0, size);Marshal.Copy(intPtr4, level4Bytes, 0, size);Marshal.Copy(intPtr5, level5Bytes, 0, size);Marshal.Copy(intPtr6, level6Bytes, 0, size);Marshal.Copy(intPtr7, level7Bytes, 0, size);Marshal.Copy(intPtr8, level8Bytes, 0, size);int k = 3;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){byte R = GrayImgBytes[i * GrayImgData.Stride + j * k];            int L1 = R & 1;if (L1 != 0) { L1 = 1; }int L2 = R & 2;if (L2 != 0) { L2 = 1; }int L3 = R & 4;if (L3 != 0) { L3 = 1; }int L4 = R & 8;if (L4 != 0) { L4 = 1; }int L5 = R & 16;if (L5 != 0) { L5 = 1; }int L6 = R & 32;if (L6 != 0) { L6 = 1; }int L7 = R & 64;if (L7 != 0) { L7 = 1; }int L8 = R & 128;if (L8 != 0) { L8 = 1; }int G8 = L8;if (G8 != 0) { G8 = 255; }int G7 = L8 ^ L7;if (G7 != 0) { G7 = 255; }int G6 = L7 ^ L6;if (G6 != 0) { G6 = 255; }int G5 = L6 ^ L5;if (G5 != 0) { G5 = 255; }int G4 = L5 ^ L4;if (G4 != 0) { G4 = 255; }int G3 = L4 ^ L3;if (G3 != 0) { G3 = 255; }int G2 = L3 ^ L2;if (G2 != 0) { G2 = 255; }int G1 = L2 ^ L1;if (G1 != 0) { G1 = 255; }level1Bytes[i * GrayImgData.Stride + j * k] = (byte)G1;level1Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G1;level1Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G1;level2Bytes[i * GrayImgData.Stride + j * k] = (byte)G2;level2Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G2;level2Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G2;level3Bytes[i * GrayImgData.Stride + j * k] = (byte)G3;level3Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G3;level3Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G3;level4Bytes[i * GrayImgData.Stride + j * k] = (byte)G4;level4Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G4;level4Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G4;level5Bytes[i * GrayImgData.Stride + j * k] = (byte)G5;level5Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G5;level5Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G5;level6Bytes[i * GrayImgData.Stride + j * k] = (byte)G6;level6Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G6;level6Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G6;level7Bytes[i * GrayImgData.Stride + j * k] = (byte)G7;level7Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G7;level7Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G7;level8Bytes[i * GrayImgData.Stride + j * k] = (byte)G8;level8Bytes[i * GrayImgData.Stride + j * k + 1] = (byte)G8;level8Bytes[i * GrayImgData.Stride + j * k + 2] = (byte)G8;}}Marshal.Copy(level1Bytes, 0, intPtr1, level1Bytes.Length);Marshal.Copy(level2Bytes, 0, intPtr2, level2Bytes.Length);Marshal.Copy(level3Bytes, 0, intPtr3, level3Bytes.Length);Marshal.Copy(level4Bytes, 0, intPtr4, level4Bytes.Length);Marshal.Copy(level5Bytes, 0, intPtr5, level5Bytes.Length);Marshal.Copy(level6Bytes, 0, intPtr6, level6Bytes.Length);Marshal.Copy(level7Bytes, 0, intPtr7, level7Bytes.Length);Marshal.Copy(level8Bytes, 0, intPtr8, level8Bytes.Length);level1.UnlockBits(level1Data);level2.UnlockBits(level2Data);level3.UnlockBits(level3Data);level4.UnlockBits(level4Data);level5.UnlockBits(level5Data);level6.UnlockBits(level6Data);level7.UnlockBits(level7Data);level8.UnlockBits(level8Data);GrayImg.UnlockBits(GrayImgData);level1Picture.Image = level1;level2Picture.Image = level2;level3Picture.Image = level3;level4Picture.Image = level4;level5Picture.Image = level5;level6Picture.Image = level6;level7Picture.Image = level7;level8Picture.Image = level8;}

仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044

图像处理(Image Processing) ---------- 灰阶位图分割 (bit-plane slicing)(浮水印)(C#实现)相关推荐

  1. 基于数字图像处理的车牌定位和分割的研究 -- 开题报告

    本科毕业设计(论文)开题报告             课题名称 基于数字图像处理的车牌定位和分割的研究 毕业设计的内容和意义 采用数字图像处理的原理和技术,进行车牌区域的准确定位和分割的研究,给出相应 ...

  2. 【深度学习】医学图像处理之视杯视盘分割调研分析

    [深度学习]医学图像处理之视杯视盘分割数据集和评价指标 文章目录 [深度学习]医学图像处理之视杯视盘分割数据集和评价指标 1 数据集(公开) 2.1 视盘标签 2.2 视杯视盘标签 2 评价指标 2. ...

  3. 7.2 Python图像处理之图像分割-单阈值分割

    7.2 Python图像处理之图像分割-单阈值分割 文章目录 7.2 Python图像处理之图像分割-单阈值分割 1 算法原理 2 代码 3 效果 1 算法原理 单阈值分割算法原理: 单阈值分割是指将 ...

  4. PCL点云(平面点云)分割:Plane Model Segmentation

    背景: pcl官方教程: http://www.pointclouds.org/documentation/tutorials/planar_segmentation.php#planar-segme ...

  5. python图像分割动态域值_图像处理基本算法 动态阈值分割

    在图像处理时,受外界光线的干扰一般比较大,假如在阈值分割时采用固 定阈值,那么在环境改变时分割效果受影响极大,那么为了避免此影响就 必须采用动态阈值,自动求出合适的阈值进行分割. 本文的介绍几种主要的 ...

  6. python——适用于py3的pillow图像处理模块plist组图分割

    首先说明一下PIL库,PIL(Python Imaging Library)是Python一个强大方便的图像处理库,之前的博客也有用到过PIL模块的demo http://blog.csdn.net/ ...

  7. 《图像处理实例》 之 二值图像分割

    二值图像分割 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 原理:给定最大值处的 ...

  8. matlab实现细胞分割,MATLAB图像处理实验——细胞图像的分割和计数

    代码戳这里 1. 实验内容 本实验为使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像. 实验步骤共分为图像预处 ...

  9. 图像处理Image Processing(一)

    目录 一.图像处理的原理 二.图像处理的方法 (1)将图片转换成二维数组 (2)绘制原图 (3)绘制灰度图像 (4)绘制马赛克图像 (5)绘制珠纹化图像 ​(6)绘制融合图像 ​(7)绘制轮廓图像 ( ...

最新文章

  1. java线程挂起唤醒_JAVA并发(10)—interrupt唤醒挂起线程
  2. 广播,多播(二)(Broadcasting, Multicasting)
  3. GraphPad Prism绘制时间轴图
  4. [原创]互联网金融App测试介绍
  5. vue实战学习第二天
  6. python建立空集合_「python」集合类型及操作
  7. 区块链,到底是美好未来还是题材炒作?
  8. MySQL管理之 MyISAM和InnoDB存储引擎简单对比
  9. 俺重装系统后一些小配置(给自己备忘)
  10. arm linux系统启动流程
  11. MySQL复制 自动监控脚本
  12. java 关闭对话框_java等待关闭对话框
  13. 32个参数累加_「机械设计教程」滚珠丝杠选型过程中考虑的9个参数
  14. 获取windows当前登录的用户名
  15. Python--所有的库
  16. Centos7之LVM(逻辑卷管理器)
  17. 字符串的几个常用属性
  18. oracle的insert写法,Oracle中Insert语句的总结
  19. java将string转为json_java 怎么将string转为json数据
  20. C++进阶 必读书籍

热门文章

  1. 一朵为员工赋能的“美”云
  2. 基于Cesium的实景三维模型动态更新-以3Dtiles为例(三)
  3. Matplotlib笔记 · 绘图区域的结构和子图布局与划分(figure, axes, subplots)
  4. linux环境下blastn命令怎么用,Linux下BLAST的安装与使用
  5. 我35岁,程序员,“中危”后帮别人规划人生
  6. 摘抄《人工智能》的经典语句
  7. ruby小概念 须知
  8. 让你快乐的20个习惯
  9. python使用演示文稿-python 操作PPT练习
  10. gulp AND suss