Matlab-图像处理及数字水印生成

一、图像基本操作

  • 图像读取及显示
1.一般图像读取:x=imread('filename','permission'),permission 图像存储类型。例如:x=imread('lena.bmp'); 或者x=imread('lena','bmp');
2.一般图像显示:imshow(x); 
3.索引图像读取:[data,map]=imread('filename','permission');
例如:[data,map]=imread('lena','bmp');
4.索引图像显示:image(data),colormap(map);
5.图像分区显示:subplot(mnl); imshow(x);  m:行数,n:列数,l:第 l 个区域显示。 subplot(221),imshow(gray_to_binary1),title('Threshold=0.5');
subplot(222),imshow(gray_to_binary2),title('Threshold=0.4');
subplot(223),imshow(gray_to_binary3),title('Threshold=0.7');
subplot(224),imshow(gray_to_binary4),title('Threshold=0.2');

  • 图像写入

1.一般图像写入:imwrite(x,'filename','permission');permission图像存储类型,例如:imwrite(x,'lena22.bmp','bmp');
2.索引图像写入:imwrite(data,map,'filename','permission);例如:imwrite(data,map,'woman22.bmp','bmp');

  • 图像数据存储及加载

可以将现有变量存储为数据文件格式,利用 load函数命令,进行数据加载。‘save x ;’存储变量 x 为 x.mat 格式数据文件,数据变量与数据文件名称相同;‘load a.mat ;’加载 a.mat 数据文件,生成数据变量 a,数据文件与数据变量名称相同。

  • 图像格式转换

1.将灰度图像根据不用阈值转换为二值图像
gray=imread('rgb_to_gray.bmp');
gray_to_binary1=im2bw(gray,0.5);
gray_to_binary2=im2bw(gray,0.4);
gray_to_binary3=im2bw(gray,0.7);
gray_to_binary4=im2bw(gray,0.2);
2.将彩色图像转换为灰度图像
rgb=imread('lena_rgb.bmp');
rgb_to_gray=rgb2gray(rgb);

  • 灰度图像直方图显示

灰度图像的直方图事是图像的亮度分布的概率密度函数,是一幅图像的所有象素集合的最基本的统计规律,它反映的是图像的灰度值的分布情况。‘imhist(gray);’将原图像 I 直方图显示‘imhist(gray,4);’将原图像 I 直方图显示为 n 级灰度。

  • 图像加减运算-两幅图像加减运算,必须保证图像大小一致

1.图像相加运算(imadd)
a) 完成两幅图像的相加运算。例如:‘testadd=imadd(gray,y);’ 要求 x 与 y 矩阵大小一致
b) 彩色图像 RGB 分通道显示,选定某一通道进行单通道颜色加强(图像数据矩阵与常数相加)。
rgb_r=rgb(:,:,1);
rgb_g=rgb(:,:,2);
rgb_b=rgb(:,:,3);
rgb_b_add=rgb_b+88;
new_rgb(:,:,1)=rgb_r;
new_rgb(:,:,2)=rgb_g;
new_rgb(:,:,3)=rgb_b_add;
2.图像相减运算(imsubtract)
a) 完成两幅图像的相减运算。例如:‘testsub=imsubtract(gray,y);’要求 x 与 y 矩阵大小一致
b) 将图像数据减去一个常数。例如:‘gray_sub=gray-44;’

  • 图像几何变换

1.图像的插值缩放
a) 最近邻插值:输出像素的赋值为当前点的像素点。
b)双线性插值:输出像素的赋值为 2×2 矩阵所包含的有效点的加权平均值。
c) 双三次插值:输出像素的赋值为 4×4 矩阵所包含的有效点的加权平均值。
y1=imresize(y,1.5,'nearest'); %利用最近邻插值方法将 I 放大 1.5倍
y2=imresize(y,1.5,'bilinear'); %利用双线性插值方法将 I 放大 1.5倍
y3=imresize(y,1.5,'bicubic'); %利用双三次插值方法将 I 放大 1.5 倍
2.插值旋转
gray1=imrotate(gray,30,'nearest') % 利用最近邻插值方法将 I 逆时针旋转 30 度
gray2=imrotate(gray,30,'bilinear','crop') % 利用双线性插值方法将 I 逆时针旋转 30 度,大小保持不变。
3.图像的剪切
gray3=imcrop(gray,[40,50,200,200]); %给定大小剪切,前切起始位置为(40,50),大小为200*200
gray4=imcrop(gray); %利用鼠标交互对图像进行剪切

  • 图像拼接-水平拼接,要求两幅图像行数相同;垂直拼接,要求两幅图像列数相同

‘gray22=cat(2,gray,gray);’实现图像的水平拼接、垂直拼接,A1 和 A2 为读入的图像矩阵。

二、数字水印生成

  • 生成伪随机数

‘rand('state',0); ’生成伪随机数种子,‘r=rand(m,n); ’生成m行n列的0-1区间的伪随机数,将伪随机数二值化时,建议设定阈值(0.5),将伪随机数转化为0和1。
%灰度图像二值化
gray_to_binary_w=im2bw(w);
imshow(gray_to_binary_w);
rand('state',0);%随机数初值为1
r=rand(512,512);%生成512*512的随机数矩阵
%伪随机数矩阵二值化
r(r<0.5)=0;
r(r>0.5)=1;

  • 读入水印图像

a) 读入灰度图像,并将其二值化。
b) 直接读入二值水印图像

  • 水印图像与伪随机数调制-水印加密

‘z=xor(gray_to_binary_w,r);’,w为二值水印图像,x为伪随机数,z为加密后的二值水印图像,xor为异或运算。

  • 加密后水印图像解密

通过判断加密后的水印图像与伪随机数的异同,判断原始水印数据。
%解密
w1=xor(z,r);
imshow(w1);

猜你喜欢

转载自blog.csdn.net/wmrem/article/details/80753613