1.读入一副图像,对其进行缩放。
源代码:
clear;
% 读入图像函数imread();
% 参数:‘文件名/文件路径’
I=imread('lena.tif');
% 图像缩放函数imresize();
% 参数:图像对象,缩放倍率
I1=imresize(I,0.5);
I2=imresize(I,2);
% 显示图像函数imshow();
% 参数:图像变量;
imshow(I);
title('原图')
figure
imshow(I1);
title('0.5倍缩放图像')
figure
imshow(I2);
title('2倍缩放图像')
实验结果:
结果分析:
matlab中使用imresize()函数实现图像大小的修改,倍数大于1时放大,小于则反之,如果修改图片大小后,还以相同比例的图形用户界面显示,显示改变的则是图像的清晰度。
2.读入一副图像,对其添加椒盐噪声,用均值滤波器对其进行滤波;对其添加高斯噪声,用高斯滤波器对其进行滤波。
源代码:
clear;
I=imread('lena.tif');
% 添加噪声函数imnosie();
% 参数:待处理图像,'method',噪声密度
J1=imnoise(I,'gaussian');
J2=imnoise(I,'salt & pepper');
% 二维图像滤波器创建函数fepecial();
% 参数:'method',滤波区间/半径,滤波密度
h1=fspecial('gaussian',[5,5]);
h2=fspecial('average',[5,5]);
J0=rgb2gray(J1);
h3=medfilt2(J0,[5,5]);
% 滤波实现函数imfilter();
% 参数:滤波对象,滤波器
F1=imfilter(J1,h1);
F2=imfilter(J2,h2);
subplot(2,3,1);
imshow(I);title('原图')
subplot(2,3,2);
imshow(J1);title('高斯噪声图')
subplot(2,3,3);
imshow(J2);title('椒盐噪声图')
subplot(2,3,4);
imshow(h3);title('中值滤波图')
subplot(2,3,5)
imshow(F1);title('高斯滤波图')
subplot(2,3,6)
imshow(F2);title('均值滤波图')
实验结果:
结果分析:
matlab中使用imnoise()函数为图像添加噪声,添加何种噪声由参数决定;之后想要滤波则可以先借助fspecial()函数创建滤波器,同时指定相应的滤波方法,再只用imfilter()函数实现滤波即可。
3.读入一副图像,对其提取边缘。
源代码:
clear;
I=imread('lena.tif');
% 彩图图片转化灰度图函数rgb2gray();
% 参数待转化的三维彩色图片,数据由三维降到二维;
gray=rgb2gray(I);
% 边缘提取函数edge();
% 参数:处理对象(灰度图),'提取方法',起始门槛,方向(等)
BW1=edge(gray,'sobel');
% Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,Sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。
BW2=edge(gray,'roberts');
% Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。
BW3=edge(gray,'prewitt');
% Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。
BW4=edge(gray,'canny');
% Canny算子是目前边缘检测最常用的算法,效果也是最理想的。
BW5=edge(gray,'log');
% Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。
subplot(2,3,1)
imshow(gray);title('灰度图')
subplot(2,3,2);
imshow(BW1);title('sobel算子提取')
subplot(2,3,3);
imshow(BW2);title('roberts算子提取')
subplot(2,3,4);
imshow(BW3);title('prewitt算子提取')
subplot(2,3,5);
imshow(BW4);title('canny算子提取')
subplot(2,3,6);
imshow(BW5);title('laplasian算子提取')
实验结果:
结果分析:
matlab中图片边缘提取函数为edge()函数,其中第一个参数,即待处理图片须是灰度图,然后提取方法有很多的算子,不同的算法机理不同,因此得到的提取效果也大不相同。
4.读入一副图像,对其进行直方图统计。
源代码:
clear;
I=imread('lena.tif');
G=rgb2gray(I);
% 通过直方图均衡化来增加灰度图像(原图)对比度,函数histeq(I)
% 参数:待均衡灰度图;
J=histeq(I);
subplot(2,2,1)
imshow(I);title('原图')
subplot(2,2,2)
% 得到图像数据的灰度直方图,imhist(I,n)函数
% 参数:待处理图像(灰度图像),(n为指定的灰度级)默认256
imhist(G,32);title('32直方统计图')
subplot(2,2,3)
imshow(J);title('均衡化的图')
subplot(2,2,4)
imhist(J,32);title('32均衡化的直方统计图')
实验结果:
结果分析:
matlab中使用histeq()函数实现图像均衡化处理,即对比度调整,参数为待处理的图像和均衡化等级,处理后的图片色彩对比有明显变化,在直方图中则更加直观,所有亮度范围的直方统计图都大致相同,没有原图像那样突出或凹陷的部分。
5.读入一副图像,对其进行增强。
源代码:
clear;
I=imread('lena.tif');
G=rgb2gray(I);
% 灰度图的灰度转换,imadjust(I)函数;
% 参数:待处理图像(自动调整);
% 或者
% imsdjust(I,[low-in hign-in],[low-out high-out])
% 灰度输入以及输出范围;
% 输入灰度小于low_in,则输出灰度为low_out;
% 输入灰度大于high_in,则输出灰度为high_out;
% 将low_in至high_in间值映射到low_out至high_out之间;
J1=imadjust(G);
J2=imadjust(G,[0,1],[1,0]);
H=histeq(G);
subplot(2,2,1);
imshow(G);title('原灰度图')
subplot(2,2,2);
imshow(H);title('对比度增强图')
subplot(2,2,3);
imshow(J1);title('灰度自动调整图')
subplot(2,2,4);
imshow(J2);title('黑白颠倒图')
实验结果:
结果分析:
matlab中图像增强处理,可以imjust()函数进行亮度调整,或者是histeq()函数实现对比度的调节,需要注意的是imjust()函数处理对象须为灰度图,故对于彩色图像处理前面需要进行类型转化操作。
6.读入一副图像,在其中添加水印,然后将添加进去的水印提取出来。
源代码:
clear;clc;
% 使用最低有效位LSB图像水印法添加水印;
% least significant bit,通过分离图层,将水印图层替换到原图低层,以实现水印的“不外露”添加;
% % 背景图片;
img=imread('lena.tif');
imgsize=size(img);
% 提取原图比特平面;
bitplane=zeros(imgsize(1),imgsize(2),8);
for i=1:8 % 各个图层的处理;
for row=1:imgsize(1)% 图片行;
for column=1:imgsize(2)% 图片列;
bitplane(row,column,i)=bitget(img(row,column),i);
end
end
end
%绘制原图bitplane;
figure(1)
for i=1:8
subplot(2,4,i)
imshow(im2uint8(255*bitplane(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% % 水印图片;
imgMark=imread('txt.tif');
imgMarksize=size(imgMark);
% 提取水印比特平面;
bitplaneM=zeros(imgMarksize(1),imgMarksize(2),8);
for i=1:8
for row=1:imgMarksize(1)
for column=1:imgMarksize(2)
bitplaneM(row,column,i)=bitget(imgMark(row,column),i);
end
end
end
%绘制水印bitplane;
figure(2)
for i=1:8
subplot(2,4,i)
imshow(im2uint8(255*bitplaneM(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% % 构造新的bitplane,即嵌套水印;
newbitplane=bitplane;
newbitplane(:,:,1)=bitplaneM(:,:,6);
newbitplane(:,:,2)=bitplaneM(:,:,7);
newbitplane(:,:,3)=bitplaneM(:,:,8);
% 替换背景图片低层bitplane后,生成新的含水印的图片;
newimg=zeros(256,256);
for i=1:8
newimg=newimg+newbitplane(:,:,i)*2^(i-1);
% 不同的bitplane乘以响应的权值,计算出灰度图(8位)的参数值;
end
newimg=uint8(newimg);%转换为8位无符号整数数据类型;
figure(3)
imshow(newimg);%展示水印嵌套图片;
title('水印嵌套图片')
% % 水印提取(添加水印的逆过程);
bitplanerec=zeros(imgsize(1),imgsize(2),8);
for i=1:8
for row=1:imgsize(1)
for column=1:imgsize(2)
bitplanerec(row,column,i)=bitget(newimg(row,column),i);
end
end
end
figure(4)
for i=1:8
subplot(2,4,i)
% 展示嵌套后的图层;
imshow(im2uint8(255*bitplanerec(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% 复制水印图,即将水印图层赋值给新的变量,生成水印提取图片;
newimgM=zeros(imgsize(1),imgsize(2));
for i=1:3
newimgM=newimgM+bitplanerec(:,:,i)*2^(4+1);
end
figure(5)
imshow(im2uint8(newimgM));
title('水印提取图片')
实验结果及分析:
背景待嵌入图片的八个图层,可以看出随着图层(权值)的增加,图像信息越多,也就是说低图层的信息显示在主图上不明显,因此可以使用水印的高图层替换背景图的低图层,实现几乎不能使用肉眼辨别的水印的添加。
待嵌入水印图片的八个图层,
如图为水印添加的嵌套图片,可以看出水印添加的隐藏效果是非常好的,肉眼以及无法辨别图片是否有水印,直观上看着和原背景一样。
但是提取该图的八个子图层,并分别绘制出来,此时便可以清晰的看出水印已经添加到嵌套结果图中。
而对于水印的提取,则可以利用图层分解合成的逆过程实现,将上述嵌套结果图分层绘制,可以看出有三个图层都是有关水印图片的信息,因此可以将该三层信息(矩阵)赋值给新的变量,并整合转化数据类型(这里转化为8位无符号整形),以便于以直观的图片形式呈现出来。
观看更多精彩内容,请关注我!!更新ing
不妨点个“再看”再走吧!谢谢大家。