matlab图像处理

matlab图像处理

(一)图像基本问题

1、图像噪声的来源:

(1)图像获取过程中
两种常用类型的图像传感器CCD和CMOS采集图像过程中,由于受传感器材料属性、工作环境、电子元器件和电路结构等影响,会引入各种噪声,如电阻引起的热噪声、场效应管的沟道热噪声、光子噪声、暗电流噪声、光响应非均匀性噪声。
(2)图像信号传输过程中
由于传输介质和记录设备等的不完善,数字图像在其传输记录过程中往往会受到多种噪声的污染。另外,在图像处理的某些环节当输入的对象并不如预想时也会在结果图像中引入噪声。

图像常见噪声基本上有以下四种,高斯噪声,泊松噪声,乘性噪声,椒盐噪声。

2、灰度级:

0是黑,255是白

(二)图像处理的一些基本步奏及实现这些步奏的方法

2.1 图像的锐化:

原理:首先图像的锐化是由于我们一般会先对图片进行去除噪声的滤波,但是这种滤波是属于高频的滤波,这种滤波的有点就是会滤除图片轮廓中的高频的噪声部分,但是由于图像的边缘部分也属于高频部分,所以这时我们的图像的边缘部分也就会变得模糊(像打了马赛克一样)。
这时就需要我们的锐化功能,由于我们之前通过滤波已经去除了噪声,只是让图像的边界模糊不清,我们可以通过锐化来使这些细节更加清晰,当然这个清晰是需要对图像进行高频滤波的,这时低频信号会被抑制高频信号会被凸显,当然你滤波器的频段设的越高,那么不满足你这个频段的像素都会被抑制,都会慢慢变暗(只是低频变的更快)。
由于锐化也会增强噪声,所以我们在锐化之前要先平滑图像(即低频滤波)。
图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。
锐化:增强了图像中灰度突变处的对比度,使图像中小的细节部分得到增强并保留了图像的背景色调,使图像的细节比原始图像更加清晰。

见例子:人的骨骼信息的提取
先通过快速傅里叶变化到频域,再通过二阶巴特沃斯滤波器高通滤波器来抑制低频增强高频和低频之间的对比度。而后再通过直方图均衡化处理(即实现对比度的拉伸,黑的越黑白的越白),那么这样边界信息就会更加清晰。而边缘检测就是通过图像中周围像素灰度有阶跃变化来判别是否属于边界信息的。

2.2 图像的边缘提取:

见例子:人的骨骼信息的提取

2、注释一段程序以及程序分段

方法一:
注释语句的快捷键是Ctrl+R
取消注释的快捷键是Ctrl+T
并且支持一次注释(或者取消注释)多行语句。
选定要注释(或者取消注释)的那些语句,然后按Ctrl+R(或者Ctrl+T)就可以了。

方法二:
采用matlab块注释方法
%{
需要注释的若干语句
%}

程序分段就是在程序段首尾都加上%%符号。

1、报错问题

1.1如果报错信息为:
找不到文件的定义,那么首先就要看你定义的文件目录是否正确。

2、函数解析

2.1 imread()函数

A = imread('filename')
f1 = imread('cam.tif');  %%注意图片名字参数要加引号,还有写图片名字的时候一定要带上图片后缀。
A = imread(filename,fmt)
f1 = imread('cam.tif','tif');
[A,map] = imread(___)  
[X,MAP]=imread('cam.tif','tif'); 
这种表达方式往往是读出一张索引图片时的用到的表达方式

2.2 imwrite()函数

imwrite(A,filename);
将图像数据 A 写入 filename 指定的文件,并从扩展名推断出文件格式

imwrite(f1,'f2.jpg','jpg'); 
 %%该函数可以用来修改图片的后缀,第三个参数加不加都行。
 %%注意filename和文件格式都要加引号。

2.3 subplot()函数(一个画板显示多幅图)

subplot(m,n,p) 将当前图窗划分为 m×n 网格。
m表示行,n表示列。
P表示存储图片在网格的位置。

subplot(2,2,1);
imshow(f1);
将图片显示区划分为一个2*2的的4宫格显示,
并将该图片在4宫格的第1个格子中显示。

2.4 多个画板显示多幅图

通过在imshow()函数显示之前用关键字figure;

figure;
imshow(f1);
set(gcf,'position',[60,60,200,200]); 

figure;
imshow(d1);
set(gcf,'position',[50,50,600,600]); 

imshow(J1);title(‘Sobel’);
在显示函数下方,加上这个,可以显示标题,标题是字符所以加引号。

2.5 set()函数

set(gcf,'Position',[10,60,900,700], 'color','w')%%这里设置了figure(要显示图片)的位置:起始坐标为10,60;
图片显示的宽度为900个像素,高度为700个像素。
'color','w' 设置了图片背景为白色,w表示白色,如果不设置默认也是白的。

2.6bither()函数 抖动函数

BW=dither(I);    %通过抖动转换为二值图像来增强图像的色彩对比度

设置一个中间点,大于这个点的灰度都使其变为黑色;小于它的变为白色。
在这里插入图片描述

2.7 imadd()函数 图片相加函数

图像相加:如果大于255就设置为255

clear all;
close all;
I=imread('cam.tif');
J=imread('girl.tif');
K=imadd(I,J,'uint16');
subplot(2,2,1);
imshow(K,[]);
%%该函数是带返回值的,这里将图片I和J进行相加,
防止出现数据像素大小超过了uint8定义的数据类型,
所以后面用了uint16

在这里插入图片描述灰度图像由于没有色素所以是1维的,uint8表示像素存放的数据类型
512x512表示图片的大小。
在这里插入图片描述

2.8 imsubtract()函数 图片相减函数

图像相减:如果小于0就设置为0
Z = imsubtract(X,Y)

I=imread('cam.tif');
J=imsubtract(I,90);  %%减去一个常数颜色更深
subplot(1,2,1);
imshow(I);
subplot(1,2,2);
imshow(J);

[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imblog.csdnimg.cn/20HaLv0922203812839.png#pic_cent5)(图像)]

2.9 图像相乘

I=imread('cam.tif','tif');
J=immultiply(I,0.6);
subplot(121);
imshow(I);
subplot(122);
imshow(J);

由于乘以一个小数,所以图像颜色会加深。

2.10绝对差异函数imabsdiff()

Z = imsubtract(X,Y) Z = imabsdiff(X,Y) 实现:图像-图像,图像-常数

imsubtract函数自动将这些负数截取为0,而imabsdiff计算后取了绝对值,从而使用的时候,为了避免差值产生负值,同时避免像素值运算结果之间差异过小(减去后结果为负数的不好都变成0),建议调用函数imabsdiff。

2.11 滤波函数filter2()

filter2(B,X)
B为滤波器.X为要滤波的数据,这里将B放在X上,一个一个移动进行模板滤波.
在这里插入图片描述将d放到c上面,c的每一个元素都设为d放上去的起点位置。

2.12 卷积的概念

卷积分为离散卷积和连续卷积:
离散卷积公式:z(n) = f(n) * g(n) =

连续卷积公式:z(t) = f(t) * g(t)

卷积的意义:
卷积是一种积分运算,积分本来就有平滑的作用,由卷积得到的函数,比卷积前的两个函数都要“光滑”,相当于一个高通滤波器,可以滤除高频噪声。
本来小明的包几分钟就可以消肿,可是如果连续打,几个小时也消不了肿了,这难道不是一种平滑过程么。
图像变平滑就是去噪的过程。

卷积在图像中的作用就是让它其中的一个点和周围的多个点进行加权求和,实际上这个点会被慢慢同化。

2.13 高斯卷积滤波矩阵

h = fspecial(type,parameters,sigma)
参数type制定算子类型;
参数parameters表示矩阵的尺寸,默认是3*3的。
参数sigma表示滤波器的标准差,单位为像素,默认值为 0.5。

fspecial函数用于创建预定义的滤波算子;
type= ‘gaussian’,为高斯低通滤波器
其中标准差越大,那么处理所得的图像与原图相比就越模糊,所以要把握好方差的度;

滤波矩阵就是为了一定程度上消除噪声;
图像处理中很关键的一块就是提取图像的内容有一种方法就是根据颜色变化的剧烈程度来提取,也就是对图像的像素点求偏导数,如果某个方向偏导数很大,一般来说就是不连续的,即轮廓线.但是图像里往往会有很讨厌的噪声点如果不考虑这些点,直接对图像求梯度函数的话,就会收到很大的影响,滤波矩阵就是为了一定程度上消除噪声,其中比较常见的是高斯卷积滤波矩阵

高斯滤波:
图像大多数噪声均属于高斯噪声,因此高斯滤波器应用也较广泛。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像去噪。
可以简单地理解为,高斯滤波去噪就是对整幅图像像素值进行加权平均,针对每一个像素点的值,都由其本身值和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个用户指定的模板(或称卷积、掩膜)去扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。
高斯滤波器相比于均值滤波器对图像个模糊程度较小。
高斯滤波器模板的各个数字是可以计算的。
高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。

2.14 加噪声函数imnoise()

g=imnoise(f,‘salt & pepper’,d)
用椒盐噪声污染图像f,其中d是噪声密度(即包括噪声值的图像区域的百分比)。因此,大约有d*numel(f)个像素受到影响。默认的噪声密度为0.05。

I=imnoise(I,'salt & pepper',0.03);

添加高斯噪声:
g=imnoise(f,‘gaussian’,m,var)
将均值m,方差为var的高斯噪声加到图像f上,默认值是均值m为0,方差var为0.01的噪声

2.15 中值滤波

在去除噪声时还可以有效的保护图像边缘
格式:
B = medfilt2(A, [m n]) ;
其中[m n]表示邻域块的大小,默认值为[3 3]。

2.16 自适应滤波wiener()

自适应滤波,根据图像局部均值和方差进行自动调整,还可估计噪声的类型。
I = wiener2(I,[m n]);
使用像素级自适应低通 Wiener 滤波器对灰度图像 I 进行滤波。[m n] 指定用于估计局部图像均值和标准差的邻域的大小(m×n)即添加的模板。

J=wiener2(I,[5 5]);

2.17 图像边缘检测函数edge()

格式:
BW = edge(I,‘sobel’,thresh)
根据所指定的敏感度阈值thresh,用Sobel算子进行边缘检测,它忽略了所有小于阈值的边缘。当thresh为空时,自动选择阈值。
采用灰度或一个二值化图像I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0(这也就表示背景地方用黑色显示用0表示;检测到的边缘地方用白色显示用1表示)。

2.18 3大算子

索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

Prewitt算子对边缘的定位却不如Roberts算子
在这里插入图片描述

2.18 升序函数(sort)

sort(A):对一维或二维矩阵进行升序排序,并返回排序后的矩阵;当A为二维矩阵时,对矩阵的每一列分别进行排序(默认,dim=1对列排序)。
sort(A,dim):对矩阵按指定的方向进行升序排序,并返回排序后的矩阵。当dim=1时,对矩阵的每一列排序;当dim=2时,对矩阵的每一行排序。
[B,IX]=sort(A,…):IX为排序后备元素在原矩阵中的行位置或列位置的索引,为与A同样大小的标量矩阵。

[x,IX]=sort(x); %将x按升序排列
y=y(IX);
这两句可是先将x排序,然后将y再和x还是按照之前的关系再对应起来。

clear all;clc;close all;
A=[10 13 7;1 5 9;6 2 3]
%下面两种排序方式中,mode均未指定,默认'ascend'升序
 
%dim==2,按行排序的sort函数实现
[B,indb]=sort(A,2)
%按行排序的循环语句实现
for i=1:size(A,1)
    B1(i,:)=A(i,indb(i,:));
end
 
%dim==1,按列排序的sort函数实现
[C,indc]=sort(A,1)
%按列排序的循环语句实现
for j=1:size(A,2)
    C1(:,j)=A(indc(:,j),j);
end

运行结果:
A =

10 13 7
1 5 9
6 2 3

B =

7 10 13
1 5 9
2 3 6

indb = (B矩阵中元素所对应之前的位置。)

3 1 2
1 2 3
2 3 1

2.19 figure中标题显示函数

图像头显示
title(‘Sobel’);

图像x,y轴上显示
xlabel(‘横轴x’) %标注横轴x
ylabel(‘纵轴y’) %标注纵轴y

2.20 length()函数

lengthxy=length(x);
该函数的返回值是x矩阵中元素的个数。

2.21 size()函数

[m,n]=size(x); %计算图像的尺寸
该函数的返回值是图像x矩阵的尺寸(即行列)

2.22 max()函数

M = max(A);
[M,I] = max(A);
查找 A 的最大值的索引,并在输出向量 I 中返回这些索引。如果最大值出现多次,则 max 返回对应于第一次出现位置的索引。

2.23 scatter()函数

scatter可用于描绘散点图。
scatter(x,y,sz,c)
sz指定圆大小。sz这个参数不要都可以。
c指定圆颜色。
在这里插入图片描述

scatter(___,‘filled’) 填充圆形。可以将 ‘filled’ 选项与前面语法中的任何输入参数组合一起使用

scatter(bofengx,bofengy)              %绘制出波峰的点
scatter(bogux,boguy,'k')              %绘制出波谷的点

2.23 显示灰度直方图imhist()函数

imhist( i );直接显示图像i的灰度直方图;
imhist(i,n)n为指定灰度级显示直方图;
[count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,x为灰度级

2.24 对图像进行直方图均衡化处理

1.有两种方式进行直方图处理:
分别用到的是histep()函数和adapthistep()函数,adapthistep()函数是
histep()函数的加强版,该函数对图像较亮区域和较暗区域的处理要比
histep()函数处理的好。

A=imread('01.png');   %读取图像
figure(1),imshow(A)

B=histeq(A);   %利用histeq函数对lena图像进行直方图均衡化
figure(2),imshow(B);

C=adapthisteq(A);   %利用adapthisteq函数对lena图像进行直方图均衡化
figure(3),imshow(C);

结果显示:
在这里插入图片描述
2、还一种直方图匹配法来实现图像的增强
f=imread(‘01.png’); %读取图像

%% 获取一个指定的函数
p=manualhist; %%这是一个算法

%% 使结果图像的直方图与获取函数图像一致
gg=histeq(f,p);
figure(1)
imshow(gg);title(‘直方图匹配增强结果’)
figure(2)
imhist(gg);title(‘结果图像直方图’)

2.25 主函数文件和子函数文件

1、我们知道matlab中如果一上来就遇到function命名的函数,那么就会将该.m文件变为函数文件,函数文件是不能直接运行的,它必须在主函数中调用才能执行,或者在命令窗口进行调用。
2、matlab遇到函数的时候是直接会去该目录中找该函数名对应的函数文件的,如果没有找到函数名对应的函数文件它会报错。
3、在函数文件中,可以写多个函数,但是你的子函数中的核心函数名必须对应文件名,该核心函数可以调用同一个函数文件中的子函数。

3、打开一张图片+保存一张图片

3.1打开一张图片

1、打开一副图片
f = imread(‘图片名.后缀’)
imshow(f) 该语句可以将图片进行显示。

打开一副图片会在figure中显示但再打开一张图片,上一张图片就会被覆盖,这里可以通过:figure, imshow(g) 这样就会再创建一个figure,那么上一张照片就不会被覆盖。

3.2保存一张图片

imwrite(f ,‘要保存图片的名字.后缀名’)
f 就是我们之前读出来的照片的内容,后面一个参数它会自己创建一个我们命名的图片名,然后将 f 的内容给放进去。

1、我们先读出一副图片(注意图片位置要定位)
2、然后再新建一个文件夹,然后定位到该文件夹,然后再使用imwrite(f, ‘filename’)函数就可以在左边的目录下看到有一副图片在该目录下了。

4、图片之间的相互转换

4.1将索引图像转换为RGB图像

[X,map]=imread('trees.tif','tif');  %%读取索引图像的两个信息
RGB=ind2rgb(X,map); 

4.2 将RGB图像转换为索引图像

RGB=imread('peppers.jpg');     %读取RGB图像
[X,map]=rgb2ind(RGB,12); 
%%index是索引

4.3 将RGB图像转换为灰度图像

RGB=imread('peppers.png','png');
I=rgb2gray(RGB);
%%gray是灰度

4.4 将RGB图像转换为二值图像

RGB=imread('peppers.jpg');
bw=im2bw(RGB,0.4);    %  归一化阈值是0.4    
二值图像只有黑色和白色,0.41

5、项目

5.1 通过边缘检测得到螺纹的波形并绘制出螺纹波形以及找到峰值点

5.1 第一步先对图像进行滤波然后通过边缘检测得到边缘图像。

clear;clc;close all
I=imread('luowen1.bmp');   %读取螺纹图片

try
    I=rgb2gray(I);         %如果是RGB图,则转换成灰度图
catch
%%以后遇到图片处理这一步必须做,先将图片转换为灰度图片。
end

figure
imshow(I)
title('原图(半边螺纹)')  %%显示原始图像

for K=1:15
    I=wiener2(I,[5 5]);   %通过滤波15(滤波肯定要多次)把多余点滤除
end
[m,n]=size(I);       %%得到图像矩阵的横纵坐标(即矩阵大小)。

I=edge(I,'canny');       %通过边缘检测得到螺纹的波形
[m,n]=size(I);           %计算图像的尺寸

I=I(20:m-20,20:n-20);    %把图像的边角去掉,只留下有用部分
[m,n]=size(I);           %计算去掉边角之后的图像尺寸
figure
imshow(I)                %显示去掉边角之后的图像
title('螺纹波形')

5.2 第二步将白色边缘线离散化并得到它的所有离散点的坐标

%%  把白像素点的位置得到(像素为1的点的坐标)
N=1;                    %计数器
for i=1:m               %%离散化就是通过取离散点得到的 
    for j=1:n
        if I(i,j)==1    %%通过 I(i,j) 可以得到图像在该点的像素值是不是白点
            x(N)=i;     %保存白色像素的横坐标x  
                        %%这里用到了x(N)来存储,表示x是个一维矩阵
            y(N)=j;     %保存白色像素的纵坐标y
            N=N+1;      %计数器+1
        end
    end
end

5.3设置波峰波谷数并对每一段进行等分。

M=10;                             %设置波峰和波谷的个数
lengthxy=length(x);               %计算x和y数据点的个数
dlength=floor(lengthxy/M);        %将x和y等分成M段,计算每一段的长度

%%lengthxy = 934  
%%dlength = 93

5.4 找出每一段中的数据点的信息

for K=1:M
    xx{K}=x((K-1)*dlength+1:K*dlength);   %保存每一段x的值
    yy{K}=y((K-1)*dlength+1:K*dlength);   %保存每一段y的值
end

%% xx{K}=x((K-1)*dlength+1:K*dlength); 
%%该段程序解释就是由于M = 10,所以当k = 1的时候是就是要得出
第一段中的所有数据值。
当k = 1时xx{k}是个矩阵。
xx{1} = x(0*delength + 1:93)=x(1:93);
当k = 2时
xx{2} = x((1*93 + 1) : (2*93));

5.5 找出每一段数据中的波峰和波谷

for K=1:M
    [bofengy(K),index1]=max(yy{K});   %寻找每一段y里的最大值
    bofengx(K)=xx{K}(index1);         %得到与波峰对应的横坐标x
    [boguy(K),index2]=min(yy{K});     %寻找每一段y里的最小值
    bogux(K)=xx{K}(index2);           %得到与波谷对应的横坐标x
end
%%xx{K}(index1)这种表达方式要注意。xx{k}相当于一个数组。

5.6 绘制出波峰拟合得到的曲线

%%   对所有的波峰进行直线拟合,计算出直线斜率k1和截距b1
A1=[bofengx',ones(length(bofengx),1)];  
kb1=A1\bofengy';
k1=kb1(1);
b1=kb1(2);
%%   绘制出波峰拟合得到的直线
x0=[1 m];
Y1=k1*x0+b1; 
plot(x0,Y1,'m');

5.2 了解RGB图像内涵以及用HSV进行某种色素提取。

clc;
flag = imread('01.jpg'); % 读取图像       
figure;
imshow(flag); % 展示图像     
% 将图像的rgb色彩空间转化至hsv色彩空间
flag_hsv = rgb2hsv(flag);      
% 创建一个白色图像,将特定颜色提取到此处
flag_new = 255*ones(size(flag));     %%ones的作用是产生全1矩阵,ones(M,N)是产生一个M*N的全1矩阵
% 将该图像转至hsv色彩空间
flag_new_hsv = rgb2hsv(flag_new);
% 找出图像中绿色的像素  找出索引值点对应的下标
[row, col] = ind2sub(size(flag_hsv),find(flag_hsv(:,:,1)>0.12...         %%find函数即找出满足条件的点的索引值
& flag_hsv(:,:,1)< 0.6 & flag_hsv(:,:,2)>0.16 & flag_hsv(:,:,3)>0.18));
% 将图像中的绿色像素复制到刚才新建的白色图像中
for i = 1 : length(row)
    flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
end
% 将提取出来的绿色,转化至rgb空间,进行展示
flag_green = hsv2rgb(flag_new_hsv);
figure
imshow(flag_green)

5.3 例子:人的骨骼信息的提取

本段代码需求:
1、掌握图像锐化的原理
图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。

图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像锐化技术,使图像的边缘变的清晰

图像锐化与图像平滑是相反的操作,锐化是通过增强高频分量来减少图像中的模糊,增强图像细节边缘和轮廓,增强灰度反差,便于后期对目标的识别和处理。锐化处理在增强图像边缘的同时也增加了图像的噪声。方法通常有微分法和高通滤波法。

图像的边缘与频域中的高频分量相对应,高通滤波器可以抑制低频分量,从而达到图像锐化的目的。

2、掌握傅里叶变化的应用
傅里叶变换是得到信号在频域的分布,数字图像也是一种信号,对它进行傅里叶变换得到的也是它的频谱数据。对于数字图像这种离散的信号,频率大小表示信号变化的剧烈程度或者说是信号变化的快慢。频率越大,变化越剧烈,频率越小,信号越平缓,对应到图像中,高频信号往往是图像中的边缘信号和噪声信号,而低频信号包含图像变化频繁的图像轮廓及背景等信号。

我们可以根据需要获得在频域对图像进行处理,比如在需要除去图像中的噪声时,我们可以设计一个低通滤波器,去掉图像中的高频噪声,但是往往也会抑制图像的边缘信号,这就是造成图像模糊的原因。

傅里叶频谱图上我们看到的明暗不一的亮点,其意义是指图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅里叶变换后的频谱图,也叫功率图,我们就可以直观地看出图像的能量分布:如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小);反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的、边界分明且边界两边像素差异较大的。

对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰。一幅频谱图如果带有正弦干扰,移频到原点上就可以看出,除了中心以外还存在以另一点为中心、对称分布的亮点集合,这个集合就是干扰噪音产生的。这时可以很直观的通过在该位置放置带阻滤波器消除干扰。

i1 = fft2(ii); %======傅里叶变换
i2 =fftshift(i1); %======将变换的频率图像四角移动到中心(原来良的部分在四角 现在移动中心,便于后面的处理)
i3=log(abs(i2)); %=====显示中心低频部分,加对数是为了更好的显示
subplot(2,2,2),imshow(i3,[]);

3、掌握二阶巴特沃斯滤波器

clear;clc;close all
%%   读取图像
I=imread('1.jpg');
try
    I=rgb2gray(I);    %如果是RGB图像,则转化为灰度图
end

%%   图像锐化
[M,N]=size(I);   % 计算图像尺寸
f=double(I);     % 数据类型转换,MATLAB不支持图像的无符号整型的计算
g=fft2(f);       % 二维傅立叶变换,得到频域信息
g=fftshift(g);   % 0频率移到(M/2,N/2)% G = real(g);
% T = log(G+1);
imshow(T,[]),title('原始图像其频谱图')



n=2;             % 二阶巴特沃斯滤波器
D0=3;            % 巴特沃斯滤波器的D0,D0越大,保留的高频信号就越少(对于不同的图片,可以自行调节,以便得到好的效果)
for i=1:M
    for j=1:N 
        D=sqrt((i-M/2)^2+(j-N/2)^2);   %计算离0频率(M/2,N/2)的距离
        h=1/(1+(D0/D)^(2*n));          %计算传递函数的值
        output(i,j)=h*g(i,j);          %高通滤波之后(i,j)处的值
    end
end
result=ifftshift(output);              %与g=fftshift(g)对应,还原回去
I=ifft2(result);                       %傅里叶反变换
I=uint8(real(I));                      %得到滤波之后的图像(锐化之后的图像)
figure
imshow(I)                               %滤波后图像显示
title('锐化之后的图像')
%%   直方图均衡化处理
I=histeq(I);                             %得到直方图均衡化之后的图像
figure
imshow(I)
title('直方图均衡之后的图像')

%%   边缘检测
I1=edge(I,'prewitt');
I2=edge(I,'roberts');
I3=edge(I,'sobel');

figure
imshow(I1)
title('prewitt边缘检测之后的图像')

figure
imshow(I2)
title('roberts边缘检测之后的图像')

figure
imshow(I3)
title('sobel边缘检测之后的图像')

5.4 对图像边缘提取和锐化以实现图像增强

1、掌握sobel模板
2、掌握滤波原理

I = imread('01.png');
h = fspecial('sobel');   %生成'soble'模板(水平)
BW1= edge(I,'sobel','horizontal');   %水平'soble'模板边缘提取
BW2=imfilter(I,h);   %水平'soble'滤波
%%   显示图像
subplot(1,3,1),subimage([0,256],[0,256],I),title('原图');
subplot(1,3,2),subimage([0,256],[0,256],BW1),title('soble边缘提取')
subplot(1,3,3),subimage([0,256],[0,256],uint8(BW2)),title('soble滤波')

5.5 小波变化+小波分解和重构

1、掌握小波变化的原理
2、掌握小波分解和重构的原理
3、掌握小波的应用

%%  学习目标:小波变换    小波分解和重构
load woman;             %打开显示原始的图像
imshow(X,map);          %X包含原始图像信息,map是调色板,这是一个索引图像
%% 对图像X数据信息进行单层分解,小波为db1
nbcol=size(map,1);
[cA1,cH1,cV1,cD1]=dwt2(X,'db1');   
cod_X=wcodemat(X,nbcol);
cod_cA1=wcodemat(cA1,nbcol);
cod_cH1=wcodemat(cH1,nbcol);
cod_cV1=wcodemat(cV1,nbcol);
cod_cD1=wcodemat(cD1,nbcol);
%%   图像编码    4种细节系数
figure
subplot(221)
imshow(cod_cA1,map)
title('近似细节系数')
subplot(222)
imshow(cod_cH1,map)
title('水平细节系数')
subplot(223)
imshow(cod_cV1,map)
title('垂直细节系数')
subplot(224)
imshow(cod_cD1,map)
title('对角细节系数')
Y=idwt2(cA1,cH1,cV1,cD1,'db1','nbcol');
%%   对分解的细节系数执行单层重构,小波为db1
figure;
imshow(Y,map);
title('重构后的图像')

5.6 butterworth低通滤波实现图像增强

%% 学习目标: butterworth低通滤波实现图像增强
I = imread('01.png');
[f1,f2] =freqspace(size(I),'meshgrid');
D=0.5;     %截止频率
%%  n=3
n=3;
Hd = ones(size(I)); 
r = sqrt(f1.^2 + f2.^2);
for i=1:size(I,1)
    for j=1:size(I,2)
        t=r(i,j)/(D*D);
        Hd(i,j) = 1/(t^n+1);%构造滤波函数
    end
end
Y=fft2(double(I)); 
Y=fftshift(Y);
Ya=Y.*Hd;
Ya=ifftshift(Ya);
Ia1=ifft2(Ya);


%% n=6
n=6;    
Hd = ones(size(I)); 
r = sqrt(f1.^2 + f2.^2);
for i=1:size(I,1)
    for j=1:size(I,2)
        t=r(i,j)/(D*D);
        Hd(i,j) = 1/(t^n+1);%构造滤波函数
    end
end
Y=fft2(double(I)); 
Y=fftshift(Y);%
Ya=Y.*Hd;%
Ya=ifftshift(Ya);%
Ia6=ifft2(Ya);%
%%  显示图像
subplot(2,2,1),imshow(I),title('原图');
subplot(2,2,3),imshow(uint8(Ia1)),title('n=3');
subplot(2,2,4),imshow(uint8(Ia6)),title('n=6');

5.7 图像的膨胀和腐蚀以及闭合运算

1、图像的膨胀和腐蚀:
膨胀原理就是对图像中的目标对象来增加像素,这个增加的像素取决于你的结构元素的形状和大小。它会拿着结构元素去一个个对目标图像,此时和图像不曾有过的像素点都会被扩张。

bw = imread('text.png');               %读入图像
figure(1),imshow(bw),title('原图')
se = strel('line',10,91);              %生成线形结构元素
bw2 = imdilate(bw,se);                 %用生成的结构元素对图像进行 膨胀
figure(2), imshow(bw2),title('膨胀图像')

腐蚀原理就是只有结构元素和目标图像完全对应的点才会保留下来,否则会被腐蚀掉。

bw = imread('text.png');               %读入图像
figure(1),imshow(bw),title('原图') 
se = strel('line',5,68);              %生成线形结构元素
bw2 = imerode(bw,se);                 %用生成的结构元素对图像进行腐蚀
figure(2),imshow(bw2),title('腐蚀图像')

2、开启运算和闭合运算
不论是开启运算还是闭合运算都是膨胀和腐蚀的结合运算。
开启运算用于平滑图像的轮廓,用于去除轮廓中的毛刺。
闭合运算用于填平图像中的小孔。

开启运算就是先腐蚀再膨胀

I = imread('snowflakes.png');         %读入待处理的图像
figure(1),imshow(I),title('原图') 
se = strel('disk',4);                 %生成圆形结构元素
I_opened = imopen(I,se);              %执行开启运算
figure(2), imshow(I_opened),title('结果图像')

闭合运算就是先膨胀再腐蚀

originalBW = imread('circles.png');         %读入待处理的图像
figure(1),imshow(originalBW),title('原图') 
se = strel('disk',10);                       %生成圆形结构元素
closeBW = imclose(originalBW,se);            %执行闭合运算
figure(2), imshow(closeBW),title('结果图像')
  • 10
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值