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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章