【matlab】小学都能学会的数字图像处理

    技术2022-07-11  68

    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位无符号整形),以便于以直观的图片形式呈现出来。​

    希望此文档对你有所帮助,谢谢大家的观看,查看更多精彩内容请关注微信公众号“理工科日记”!!

    Processed: 0.010, SQL: 9