学校数字水印课笔记——matlab使用小记
task1 清除最低RGB位
将图像的第0位位平面清零。
位平面就是把图像RGB表示下的每一个bit分层表示。
完成task1代码。主要是用bitand来去除最后一个bit。注意这里输入结束之后好像没有自动弹窗?要放在脚本中运行才可以,如果是交互式可能一次只能弹出一个图像
1 | >> data = imread('e:\\lena.bmp'); |
新建脚本的地方在这里。
task2 清除最高RGB位
和上面的代码类似,现在是处理最高位,将最高位清零。
1 | data = imread('e:\\lena.bmp'); |
可以看到差别很大
task3 处理每个图层生成灰度图像
这里需要知道图层是怎么储存的。在matlab中,每读入一个图片,图片的bitmap都会以[R,G,B]的数组形式储存。因此我们需要把每一个像素点切片。代码如下。
1 | data = imread('e:\\lena.bmp'); |
可以直接观察data和RGB三种数组的区别。可以看到matlab为了节省空间,并不是将每一个像素点用一个结构体(red,green,blue)表示,而是分开存放每一种像素。这种操作能够在我们提取出每种像素点时,大大节约空间。(不然会出现(0,0,255)这种情况,会浪费)
以下是输出结果。
这里有一个疑问,为什么不是输出每种颜色的纯色图像,而是灰度图像呢?
个人觉得是因为储存方式改变了(没有*3的bitmap),让matlab默认处理时当成了灰度图片输出。
同时注意,如果按照1中方法对图片末尾bit清零,实际上是对R,G,B三个数组的每一个的最后一位都清零。也就是方法一等价于我们提取出每一种RGB的图层,清除最低位之后再合并的结果。
直观上来理解,也是原始图像的三维数组每一个数组都经过了这种操作。
合并图像各个图层
下面做实验复现一下上面的想法。用两种方法处理各个图层,后者进行合并。然后用assert判断两者是相等的。
代码如下
1 | data = imread('e:\\lena.bmp'); |