MATLAB图像隐藏基础
一、MATLAB基础
clc :清除命令窗口;clear all :清除环境(从内存中清除所有变量);dir :列出当前目录下的所有文件;who:将内存中的当前变量以简单形式列出;close all :关闭所有的 Figure 窗口。Matlab的变量名以字母打头,后面最多可跟19个字母或数字,不能使用内部函数或命令名作为变量名,Matlab中的变量名区分大小写。
fread % 读取二进制文件中的数据
A = fread(fileID) % 将打开的二进制文件中的数据读取到列向量 A 中,并将文件指针定位在文件结尾标记处。
% 该二进制文件由文件标识符 fileID 指示。读取文件后,请调用 fclose(fileID) 来关闭文件。
A = fread(fileID,sizeA) % 将文件数据读取到维度为sizeA的数组A中,并将文件指针定位到最后读取的值之后。fread按列顺序填充A。
A = fread(fileID,sizeA,precision) % 根据 precision(精度) 描述的格式和大小解释文件中的值。sizeA 参数为可选参数。
[A,count] = fread(___) % 还将返回 fread 读取到 A 中的字符数。
fileID = fopen(filename) % 打开文件 filename 以便以二进制读取形式进行访问,并返回等于或大于 3 的整数文件标识符。
% MATLAB保留文件标识符 0、1 和 2 分别用于标准输入、标准输出(屏幕)和标准错误。
% 如果 fopen 无法打开文件,则 fileID 为 -1。
fwrite(fileID,A) % 将数组 A 的元素按列顺序以 8 位无符号整数的形式写入一个二进制文件。
fwrite(fileID,A,precision) % 按照 precision 说明的形式和大小写入 A 中的值。
count = fwrite(___) % 返回 A 中 fwrite 已成功写入到文件的元素数。
fseek % 移至文件中的指定位置,语法:fseek(fileID, offset, origin)、status = fseek(___)
fseek(fileID, offset, origin) % 在指定文件中设置文件位置指示符相对于 origin 的 offset 字节数。
% 当操作成功时,status = fseek(___) 返回 0。否则,fseek 将返回 -1。
C=[-1,0,0;1,-1,0;0,0,2]; % 矩阵赋值:数值按行输入,行之间用分号隔开。省略最后的分号会回显矩阵值。
rand % 无变量输入时只产生一个随机数
y = rand(n) % 生成n x n随机矩阵,其元素在(0,1)内
y = rand(m,n) % 生成m x n随机矩阵,其元素在(0,1)内
MATLAB官方语法支持
MATLAB位运算:
函数 目的/作用
bitand(a,b) 整数a和b的逐位AND,即相应的位 都是1 ,相应的结果位就是 1;否则相应的结果位是 0。
bitor(a,b) 整数a和b的逐位OR
bitget(x,m:n) 由低位到高位输出。x是要被转换为 2进制 的数,输出从低位低 m 位到第 n 位的数字
bitset(A,pos,V) 将A以二进制来表示,并将第pos个位置,设置为V的值,再将所得到的值转换成 10进制数 并返回。
bitshift(a,k) 返回向左移位k位,相当于乘以2k。k的负值对应于向右移位或除以2|k|并舍入到最接近的整数到负无穷大。
bitxor(a,b) 整数a和b的逐位异或
bitcmp(a) a的位补码
swapbytes 交换字节顺序
a = 60; % 60 = 0011 1100
b = 13; % 13 = 0000 1101
c = bitand(a, b) % 12 = 0000 1100
c = bitor(a, b) % 61 = 0011 1101
c = bitxor(a, b) % 49 = 0011 0001
c = bitshift(a, 2) % 240 = 1111 0000
c = bitshift(a,-2) % 15 = 0000 1111
A=bitset(255,8,0) % 将255转变成11111111,然后将第八个位置(从右开始数)置为0,
% 即为01111111,转换成十进制为127,因此返回A的值为127。
二、图像基础
二进制图像(binary images)像素只存在0,1两个值。每一个像素值将取两个离散值(0或1)中的一个,0表示黑,1表示白。二进制图像能够使用无符号8位整型或双精度类型的数组来存储。
灰度图像(intensity images )是包含灰度级(亮度)的图像。在MATLAB中,灰度图像由一个unit8、unit16或双精度类型的数组来描述。灰度图像实际上是一个数据矩阵,该矩阵的每一个元素对应于图像的一个像素点,元素的数值代表一定范围内的灰度级,通常0代表黑色,1、255或65535(不同存储类型)代表白色。 由于灰度图像存储时不使用调色板,因而MATLAB使用一个默认的系统调色板来显示图像。灰度图像的像素值就是YCbCr中每个像素的亮度分量值。
索引图像(indexed images )是一种把像素值直接作为RGB调色板下标的图像。一幅索引图包含一个数据矩阵data和一个调色板矩阵map, data可以是unit8、unit16或双精度类型,而map矩阵内的浮点数。map矩阵的每一行指定一个总是一个m×3的双精度类型矩阵(其中,m表示颜色数目),该矩阵的元素都是[0,1]颜色的红、绿、蓝颜色分量。索引图像可以把像素值直接映射为调色板数值,每一个像素的颜色使用data的数值作为map的下标来获得:数值1表示map的第一行,数值2表示map的第二行,依此类推。
读取索引图像:
[data,map]=imread(filename,permission);
显示索引图像:
image(data),colormap(map);
存储索引图像:
imwrite(data,map,filename,permission)
其中,data为像素索引矩阵,map为调色板矩阵,filename为文件路径,permission为图像文件格式。
RGB图像 。这类图像不使用单独的调色板,每一个像素的颜色由存储在相应位置的红、绿、蓝颜色分量共同决定。RGB图像是24位图像,红、绿、蓝分量分别占用8位,理论上可以包含16M种不同颜色,由于这种颜色精度能够再现图像的真实色彩,所以又称RGB图像为真彩图像。在MATLAB中,一幅RGB图像由一个unit8、unit16或双精度类型的m×n×3数组(通常称为RGB数组)来描述,其中m和n分别表示图像的宽度和高度。在一个双精度类型RGB数组中,每一颜色分量都是一个[0,1]范围内的数值,颜色分量为(0, 0,0)的像素将显示为黑色,颜色分量为(1,1,1)的像素将显示为白色。每一个像素三个颜色分量都存储在数据数组的第三维。例如,像素(10,5)的红、绿、蓝色分量都存储在RGB(10,5,1)、RGB(10,5,2)、RGB(10,5,3)中。
图像存储方式 :MATLAB将图像中的数据存储为双精度型(double),即64位的浮点数。这种存储方法的优点在于使用中不需要数据类型转换,因为几乎所有的MATLAB及其工具箱函数都可使用double作为参数类型,缺点在于表示数据会导致巨大的存储量。所以MATLAB还支持图像数据的另一种类型——8位无符号整数型(uint8),即图像矩阵中的每个数据占用一个字节。
matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算,所以要
先将图像转为double格式再运算。
img = imread('test.jpg'); % 读入是unit8型(0~255)数据
I1 = im2double(img); % 把图像转换成double精度类型(0~1)
I2 = double(img)/255; % uint8转换成double,作用同im2double
图像格式间的转换可以间接利用图像读写函数来完成:首先使用imread 函数按照原有图像格式进行图像读取,然后调用imwrite函数对图像进行保存,并指定图像的保存格式。例如,将一幅图像由BMP格式转换为PNG格式,则可以这样实现:首先使用imread读取BMP图像,然后调用imwrite函数来保存图像并指定为PNG格式:
bitmap=imread('mybitmap.bmp','bmp');
imwrite(bitmap,'mybitmap.png','png');
颜色模型之间的转换:
三、文件的读取与图像格式转换
imfinfo('binary.tif') 读取图像文件属性
I=imread('binary.tif'); 将指定图像文件读入工作区
figure; imshow(I); 新创建一个显示窗口,并显示图像文件
imshow(I,[]); 自动调整数据的范围以便于显示
M=imread('football.jpg'); 读取 RGB图像 football.jpg
MR=M(:,:,1); 提取图像 R层数据矩阵
MG=M(:,:,2); 提取图像 G层数据矩阵
MB=M(:,:,3); 提取图像 B层数据矩阵
subplot(2,2,1); imshow(M); title('原始图像 ');
subplot(2,2,2); imshow(MR); title('R层灰度图像 ');
subplot(2,2,3); imshow(MG) ;title('G层灰度图像 ');
subplot(2,2,4); imshow(MB); title('B层灰度图像 ');
I=rgb2gray(M); 将真彩色图像转换为灰度图
figure;imshow(I);
因为RGB图像的色彩非常丰富,而索引图无法全部显示,故利用参数(256)控制转换的图像色彩数量
[X,map]=rgb2ind(M,256); 将真彩色图像 football.jpg转换成256色索引图像
[X1,map1]=rgb2ind(M,32);
[X2,map2]=rgb2ind(M,8);
subplot(2,2,1);imshow(M);
subplot(2,2,2);imshow(X,map);
subplot(2,2,3);imshow(X1,map1);
subplot(2,2,4);imshow(X2,map2);
imwrite(X1,map1,'footballind.bmp'); 将转换后的 32色索引图像保存为 footballind.bmp
subplot(m,n,p)或者subplot(m n p)。subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果m=2就是表示2行图。p表示图所在的位置,p=1表示从左到右从上到下的第一个位置。
clear;
clc;
[a,b]=imread('footballind.bmp'); 读取刚才保存的索引图像footballind.bmp
K=ind2gray(a,b); 将其转换为灰度图
subplot(1,2,1);imshow(a,b);
subplot(1,2,2);imshow(K);
level=graythresh(K); 取灰度图的一个合适阈值
BW=im2bw(K,level); 再将灰度图转换成二值图像
subplot(1,2,1);imshow(K);
subplot(1,2,2);imshow(BW);