数字图像处理

Lecture 2
1、定义文件路径
#在当前文件夹进行设置;
2、图像读取与输出
(1)imread函数
功能:实现多种类型图像文件的读取,如:BMP、GIF、JPEG、PNG、RAS等。
调用格式:A = imread(filename, fmt)。filename为图像文件名,可以是灰度图像,也可以是彩色图像,如果文件不在当前目录或不在Matlab目录下,则需要列全文件路径。fmt为文件的扩展名,指定文件类型。A为图像数据矩阵。
(2)imshow函数
功能:显示图像。
调用格式:
imshow(I,n):显示灰度图像I,n为要显示图像的灰度等级,整数,默认为256。
Imshow(I,[LOW HIGH]):以规定的灰度级范围[LOW HIGH]来显示灰度图像I,低于LOW值的显示为黑,高于HIGH值的显示为白,默认按256个灰度级显示。
imshow(RGB):显示真彩色图像RGB。
imshow(BW):显示二值图像BW。
imshow(X,map):显示索引图像,X为索引图像的数据矩阵,map为其颜色映射表。
imshow filename:显示filename指定的图像,若文件包括多帧图像,则显示第一幅,且文件必须在MATLAB的当前目录下。
(3)imwrite函数
功能:实现图像文件的保存。
调用格式:
imwrite(A,’filename’,fmt):A是要保存的图像数据矩阵,filename是文件名,fmt是文件格式。
imwrite(X,map,’filename’,fmt):X为索引图像的数据矩阵,map为其颜色映射表。
(4)whos函数
功能:显示当前内存中图像信息,加具体文件则为显示具体图像信息;
调用格式:
whos; %显示当前所有变量;
whos imgxx;显示变量信息;
(5)figure函数
功能:新建图形显示窗口;
调用格式:figure;
(6)subplot函数
功能:一个绘图窗口中显示多个图形;
调用格式:
subplot(m,n,k);
subplot(1,3,1);构建1行3列图形显示,显示第一个

实例1:读取图像、显示、输出
img1=imread(‘orange.jpg’);
img2=imread(‘house1.jpg’);
imshow(img1);
imshow(img2);
imwrite(img1,’orangenew.jpg’);
imwrite(img2,’housenew.jpg’);

实例2:转化为灰度图像、0~1灰度图像、rgb2hsv、rgb2ycbcr
img3=rgb2gray(img1);
img4=rgb2gray(img2);
img5=im2double(img2);
P1=rgb2hsv(img1);
P2=rgb2ycbcr(img1);

实例3:实现图像取反
img6=255-img3;
imshow(img6);

实例4:二值化图像
img6=im2double(img3);
bw=zeros(size(img6));
bw(img7>0.4)=1;
imshow(bw);

实例5:实现蓝绿通道互换
A=imread(‘house1.jpg’);
R=A(:,:,1); %获取红色分量
G=A(:,:,2); %获取绿色分量
B=A(:,:,3); %获取蓝色分量
%绿蓝交换
P1=A;
P1(:,:,3)=G;
P1(:,:,2)=B;
subplot(121),imshow(A),title(‘Original image’);
subplot(122),imshow(P1),title(‘Green2Blue image’);

实例6:实现蓝色分量加倍
A=imread(‘house1.jpg’);
A1=A;
R=A1(:,:,1);
G=A1(:,:,2);
B=A1(:,:,3);
A1(:,:,1)=R;
A1(:,:,2)=G;
A1(:,:,3)=2*B; %图像的蓝色分量加倍
subplot(121),imshow(A),title(‘Original image’);
subplot(122),imshow(A1),title(‘DoubleBlue image’);

实例7:绘制灰度图像直方图
#绘制直方图
imhist(img2);
#绘制固定区间数量的直方图;
#读取图片house1,orange,进行灰度化,观察两个图片灰度直方图差异。

clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响
close:关闭当前的Figure窗口
close all:关闭所有的Figure窗口
clear:清除工作空间的所有变量
clear all:清除工作空间的所有变量,函数,和MEX文件

Lecture 3_1图像基本运算
复习:
(1)rgb2hsv函数
功能:实现RGB数据图像向HSV数据图像的转换。
调用格式:
img1 = rgb2hsv(RGB)。RGB为RGB彩色图像,为3维矩阵;HSV为3维HSV图像矩阵,3维依次为H、S、V,取值均在[0,1]范围内。
(2)rgb2ycbcr函数
img2 = rgb2ycbcr(RGB) :实现RGB数据图像向YCbCr数据图像的转换。
(3)rgb2gray函数
功能:彩色图像灰度化。
调用格式:
img3 = rgb2gray(RGB):真彩色RGB图像变换为灰度图像I。
NEWMAP = rgb2gray(MAP):变换索引图像的调色板为灰度调色板。

本节函数与实验:

(1)imtransform函数
功能:实现图像几何变换。
调用格式:
B = imtransform(A,TFORM,INTERP,param1,val1,param2,val2,…) :对图像A实现空间变换,TFORM为maketform函数或cp2tform函数产生的结构;INTERP为插值方法,可取“‘nearest’, ‘bilinear’, ‘bicubic’”。
T = maketform(TRANSFORMTYPE,…):产生转换结构;TRANSFORMTYPE为变换类型,可以为“‘affine’ 仿射型变换, ‘projective’ 投影型变换, ‘custom’ 自定义, ‘box’ 使用另外参数, ‘composite’ 多次调用”。
实验:
Image=imread(‘lotus.bmp’);
deltax=20;deltay=20;
T=maketform(‘affine’,[1 0 0;0 1 0;deltax deltay 1]);
NewImage1=imtransform(Image,T,‘XData’,[1,size(Image,2)],‘YData’,[1,size(Image,1)],‘FillValue’,255);
NewImage2=imtransform(Image,T,‘XData’,[1,size(Image,2)+deltax],‘YData’,[1,size(Image,1)+deltay],‘FillValue’,255);
subplot(131),imshow(Image),title(‘原图’);
subplot(132),imshow(NewImage1),title(‘画布尺寸不变平移’);
subplot(133),imshow(NewImage2),title(‘画布尺寸放大平移’);

(2)imrotate函数
功能:实现图像旋转。
调用格式:
B = imrotate(A,ANGLE,METHOD,BBOX):A为要进行旋转的图像;ANGLE为要旋转的角度()逆时针为正,顺时针为负;METHOD为图像旋转插值方法,可取“‘nearest’, ‘bilinear’, ‘bicubic’”,默认为nearest;BBOX指定返回图像大小,可取“crop”,输出图像B与输入图像A具有相同的大小,对旋转图像进行剪切以满足要求;可取“loose”,默认是,B包含整个旋转后的图像。
实验2:图像旋转
bird=imread(‘bird.jpg’);
graybird=rgb2gray(bird);
Newgray1=imrotate(graybird,15);
Newgray2=imrotate(graybird,15,‘bilinear’);
figure;
subplot(121),imshow(Newgray1),title(‘旋转15°(最邻近插值)’);
subplot(122),imshow(Newgray2),title(‘旋转15°(双线性插值)’);
imwrite(Newgray1,‘rotatebird1.jpg’);
imwrite(Newgray2,‘rotatebird2.jpg’);

(2)imresize函数
功能:实现图像缩放。
调用格式:
B = imresize(A, SCALE,METHOD)):返回原图A的SCALE倍大小图像B;
B = imresize(A, [NUMROWS NUMCOLS], METHOD)):对原图A进行比例缩放,返回图像B的行数NUMROWS和列数NUMCOLS,如果二者为NaN,表明Matlab自动调整了图像的缩放比例;
[Y, NEWMAP] = imresize(X, MAP, SCALE, METHOD)):对索引图像进行成比例缩放。

实验3:图像缩放
bird1=imread(‘bird.jpg’);
graybird=rgb2gray(bird1);
Newgray3=imresize(graybird,2.5,‘nearest’);
Newgray4=imresize(graybird,2.5,‘bilinear’);
figure;
subplot(121),imshow(Newgray3),title(‘放大2.5倍(最邻近插值)’);
subplot(122),imshow(Newgray4),title(‘放大2.5倍(双线性插值)’);
imwrite(Newgray3,‘scale1.jpg’);
imwrite(Newgray4,‘scale2.jpg’);

(3)fliplr函数
B=fliplr(X):实现二维矩阵X沿垂直轴的左右翻转。
(4)flipud函数
B= flipud(X):实现二维矩阵X上下翻转。
(5)flipdim函数
B=flipdim(X,DIM):使矩阵X按特定轴翻转,dim指定翻转方式:为1表示按行翻转;为2表示按列翻转。
实验4:图像镜像与拼接
Image2=imread(‘lotus.bmp’);
HImage=flipdim(Image2,2);
VImage=flipdim(Image2,1);
CImage=flipdim(HImage,1);
[h w]=size(Image2);
NewImage=zeros(h2,w2,3);
NewImage=[Image2 HImage;VImage CImage];
figure,imshow(NewImage);

(6)imadd函数
C=imadd(A,B) :实现两幅图像相加。
1)A、B均为图像,则要求B和A的尺寸相等;若B是一个标量,则C表示对图像A整体加上某个值(对小数部分取整)。
2)假如A和B对应运算和大于255,C仍取255,即截断处理;为避免截断,可以将C存储为uint16,即C=imadd(A,B,’uint16’)。
代码:
Back=imread(‘desert.jpg’);
Foreground=imread(‘car.jpg’);
result1=imadd(Foreground,-100);
result2=imadd(Back,Foreground);
result3=imadd(Back,result1);
imwrite(result1,‘jiabiaoliang.jpg’);
imwrite(result2,‘jiabeijing.jpg’);
imwrite(result3,‘jiabiaoliangjiabeijing.jpg’);
subplot(221),imshow(Foreground),title(‘原目标图’);
subplot(222),imshow(result1),title(‘原目标图加标量’);
subplot(223),imshow(result2),title(‘原目标图加背景’);
subplot(224),imshow(result3),title(‘加标量图叠加背景’);

(7)imsubtract函数
功能:实现两幅图像相减。
调用格式:
C=imsubtract(A,B):差值结果小于0的赋值为0,对A、B的要求同imadd相同。
C=imabsdiff(A,B):差值结果取绝对值。
代码:
Back=imread(‘hallback.bmp’);
Foreground=imread(‘hallforeground.bmp’);
result=imabsdiff(Foreground,Back);
imwrite(result,‘xiangjian.jpg’);
subplot(131),imshow(Back),title(‘背景’);
subplot(132),imshow(Foreground),title(‘前景图’);
subplot(133),imshow(result),title(‘图像相减’);

(8)immultiply 函数
C=immultiply(A,B):实现两幅图像相乘。
Back=im2double(imread(‘bird.jpg’));
Templet=im2double(imread(‘birdtemplet.bmp’));
result=immultiply(Templet,Back);
imwrite(result,‘xiangcheng.jpg’);
% imwrite(result2,‘jianbeijing.jpg’);
% imwrite(result3,‘jianbiaoliangjiabeijing.jpg’);
subplot(131),imshow(Back),title(‘背景’);
subplot(132),imshow(Templet),title(‘模板’);
subplot(133),imshow(result),title(‘图像相乘’);

(9)imdivide函数
C=imdivide(A,B) :实现两幅图像相除。

Lecture 3_2图像转化(傅里叶变换)
(1)fft2函数
功能:实现二维快速傅里叶变换。
调用格式:
ImgDFT=fft2(X):abs(fft2(X))用于返回傅里叶幅度谱(频率谱),是图像增强中处理的主要对象,表示该频率的正弦(余弦)平面波在叠加中所占的比例。幅度谱直接反映频率信息,是频率域滤波的主要依据
(2)fftshift函数
功能:用于将零频点移至图像中心。
调用格式:ImgSHIFT=fftshift(X)
在fft2函数输出的频谱分析数据中,是按照原始计算所得的顺序来排列频谱的,而没有以零频为中心来排列,因此造成了零频在输出频谱矩阵的角上,显示幅度谱图像时表现为四个亮度较高的角。

实验:L3_E1_2, L3_E2, L3_E3, L3_E5, L3_E7

Lecture 3_3图像转化(二维离散余弦变换)
(1)dct2函数
功能:实现二维离散余弦变换。
调用格式:ImgDCTI=dct2(X)
(2)idct函数
功能:用于离散余弦变换的逆变换。
调用格式:ImgIDCTI=idct2(X)

实验:L3_E6, L3_E7
Lecture 4_1图像增强
函数复习:
im2double函数,如果输入是 uint8 unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间。
double 就是简单地把一个变量的类型转换成double型,数值大小不变,为了是图像处理不溢出(因为图像通道的数据是uint8类型的,计算过程中很容易溢出),通常需要转换为双精度浮点数。
im2uint8 将输入中所有小于0的设置为0,而将输入中所有大于1的设置为255。

(1)线性灰度级变换增强-分线段灰度级增强
功能:实现灰度图像线性变换增强
截取式灰度变换函数:imadjust()
调用形式:J=imadjust(imageI, [LOW_IN; HIGH_IN],[LOW_OUT;HIGH_OUT],GAMMA)
GAMMA:是一个标量,若GAMMA<1,则图像亮度增加;若GAMMA>1,则图像亮度降低;缺省值则进行线性映射。
实验:L4_1
(2)直方图均衡化
原理:直方图均衡是图像处理领域用于增强图像对比度的方法,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
缺点:直方图均衡对处理的数据不加以选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
直方图均衡化的基本思想是把原始图像的灰度分布直方图变换为均匀分布的形式,扩大了像素灰度值的动态范围,从而增强图像对比度。把原始图像{X}映射为处理后图像{Y}的映射函数需要满足以下两个条件:
(1)映射函数单调递增。
(2)映射函数值域不超过原始图像灰度的动态范围。
功能:通过图像直方图变换实现图像增强
直方图均衡化函数:histeq()
调用形式:J=histeq(imageI,N)
N表示直方图均衡化后的灰度级数。
实验:L4_2和L4_3,改变级数,看运行效果
(3)伪彩色增强
功能:将灰度图像不同灰度级数按照线性或非线性映射为不同颜色达到图像增强的目的。
实验:L4_4

(4)频率域增强-同态滤波增强
原理:一幅图f(x,y)可以表示成照度分量i(x,y)与反射分量r(x,y)的乘积,同态滤波基本思想:为了分离加性组合的信号,常采用线性滤波的方法,而非加性信号组合常用同态滤波的技术将非线性问题转化成线性问题处理,即先对非线性(乘性或者卷积性)混杂信号作某种数学运算,变换成加性的。然后用线性滤波方法处理,最后作反变换运算,恢复处理后图像。
函数:imfilter()
调用形式:J=imfilter(imageI, W, option1, option2,…)
W:是滤波操作使用的模板,是一个二维数组。
option1, option2,…是可选项,本实验中replicate指填充虚拟边界的内容总是重复与它最近的边缘像素(circular,symmetric),conv激波过程为卷积(corr指相关)
函数:fspecial()
调用形式:h=fspecial(type, parameters)
type:指定滤波器的类型,本实验中’gaussian’指高斯模板,其它包括’log’,laplacian等,parameters是和选定的滤波器类型type相关的参数配置,如尺寸和标准差等。本实验中与’gaussian’滤波器相关的参数为:
h=fspecial(‘gaussian’, hsize, sigma),返回一个大小为hsize,标准差δ=sigma的高斯低通滤波器,hsize的默认值为[3 3],sigma的默认值为5。

Lecture 4_2图像平滑
一、空间域图像平滑方法:
(1)添加噪声
功能:人为对图像添加噪声
函数:imnoise()
调用形式:h=imnoise(imageI, TYPE, PARAMETERS)
TYPE:指添加的噪声类型。
PARAMETERS为噪声对应的参数,可表示噪声密度等。
实验:L4_6
(2)均值滤波
功能:实现图像平滑,去除噪声
函数:fspecial()
调用形式:h=fspecial(type, parameters)
type:指定滤波器的类型,本实验中’average’指均值滤波器,parameters是和选定的滤波器类型type相关的参数配置,本例中指滤波器大小。
函数:filter2()
调用形式:h=filter2(type, imageI)
type:指定滤波器。
实验:L4_7
(3)高斯滤波
函数:imfilter()
调用形式:J=imfilter(imageI, W, option1, option2,…)
W:是滤波操作使用的模板,是一个二维数组。
option1, option2,…是可选项,本实验中replicate指填充虚拟边界的内容总是重复与它最近的边缘像素(circular,symmetric),conv激波过程为卷积(corr指相关)
函数:fspecial()
调用形式:h=fspecial(type, parameters)
type:指定滤波器的类型,本实验中’gaussian’指高斯模板,其它包括’log’,laplacian等,parameters是和选定的滤波器类型type相关的参数配置,如尺寸和标准差等。本实验中与’gaussian’滤波器相关的参数为:
h=fspecial(‘gaussian’, hsize, sigma),返回一个大小为hsize,标准差δ=sigma的高斯低通滤波器,hsize的默认值为[3 3],sigma的默认值为5。
实验:L4_8

(4)中值滤波
函数:medfilt2()
调用形式:J=medfilt2(imageI, [M N])
W:imageI,输入图像,[M N]为滤波器大小,默认为3x3。
实验:L4_9

二、频率域图像平滑方法:
MATLAB常用的舍入类型的基本数学函数:
round:四舍五入成最靠近的整数
fix:截去小数部分变成证书;
floor:下取整(小于或等于x的最大整数)
ceil:上取整(大于或等于x的最小整数)

(1)理想低通滤波
理想低通滤波器:

其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离。

使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分,所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。

实验:L4_10
(2)巴特沃斯低通滤波
巴特沃斯低通滤波器:

同样的,D0表示通带的半径,n表示的是巴特沃斯滤波器的次数。随着次数的增加,振铃现象会越来越明显。

实验:L4_11
(3)指数低通滤波
指数低通滤波器:

D0表示通带的半径。指数低通的过度特性非常平坦,因此是不会产生振铃现象的。

实验:L4_12

Lecture 4_3图像锐化
一、空间域图像锐化方法(一阶微分算子):
锐化原理:
有一副图像f(x,y),它的梯度采用数学概念描述时是一个向量,定义为:

可见,梯度具有以下两个重要性质:
①梯度的方向在函数f(x,y)最大变化率的方向上.
②该梯度向量的模为:

G[f(x,y)]称为图像f(x,y)的梯度,实际上是图像f(x,y)的梯度图像。
从数学上说,梯度的数值为f(x,y)f(x,y)在其最大变化率方向上的单位距离所增加的量.对于数学图像,可用差分来近似微分。以下为三种常见差分(微分算法):
(1)梯度算法
离散图像处理时,常用到梯度的大小,因此习惯称梯度的大小为“梯度”。并且一阶偏导数采用一阶差分近似表示,即
gx=f(x+1,y)-f(x,y)
gy=f(x,y +1)-f(x,y)
对应的模板为:

为简化梯度的计算,使用grad( f )=|gx|+|gy|
实验:L4_13

(2)罗伯茨(Roberts)梯度算法
gx = f(x,y)-f(x+1,y+1)
gy =f(x+1,y)-f(x,y+1)
对应的模板:

边缘检测函数:edge()
用法:BW = edge(I, TYPE, PARAMETERS),
I表示灰度或二值图像;TYPE表示指定的检测算子,返回二值图像BW,1表示边缘,0表示其他部分;PARAMETERS表示各算子对应的参数。
BW = edge(I)
返回包含1的二进制图像BW,其中函数在输入图像I中找到边缘,而在其他位置找到0。默认情况下,edge使用Sobel边缘检测方法。
BW2=double(BW1);
edge函数不能接收二进制图片,使用double强制把你的二进制图像答转换成double型的。
BW = edge(I,method)使用方法指定的边缘检测算法检测图像I中的边缘。
BW = edge(I,method,threshold)返回所有比阈值强的边缘。
BW = edge(I,method,threshold,direction)指定要检测的边缘的方向。 Sobel和Prewitt方法可以检测垂直方向和/或水平方向上的边缘。罗伯茨方法可以检测到与水平线成45度角,与水平线成135度角或两者兼有的边缘。仅当方法为“ Sobel”,“ Prewitt”或“ Roberts”时,此语法才有效。
函数:imfilter()
调用形式:g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中, f 为输入图像, w 为滤波掩模, g 为滤波后图像。 filtering_mode 用于指定在滤波过程中是使用“相关”还是“卷积”。 boundary_options 用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:

参数 选项 描述
filtering_mode ‘corr’ 通过使用相关来完成,该值为默认。
‘conv’ 通过使用卷积来完成
boundary_options ‘X’ 输入图像的边界通过用值X(无引号)来填充扩展
其默认值为0
‘replicate’ 图像大小通过复制外边界的值来扩展
‘symmetric’ 图像大小通过镜像反射其边界来扩展
‘circular’ 图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
size_ options ‘full’ 输出图像的大小与被扩展图像的大小相同
‘same’ 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。

实验:L4_14

(3)索伯尔(Sobel)算法
gx =f(x+1,y-1)-f(x-1,y-1)​​​​​​​+2f(x+1,y) -2f(x-1,y)+f(x+1,y+1)-f(x-1,y+1)
gy =f(x-1,y+1)-f(x-1,y-1)​​​​​​​+2f(x,y+1) -2f(x,y-1)+f(x+1,y+1)-f(x+1,y-1)
对应的模板为:

边缘检测函数:edge() ——用法见上节
用法:BW = edge(I, TYPE, PARAMETERS),
函数:imfilter() ——用法见上节
调用形式:g = imfilter(f, w, filtering_mode, boundary_options, size_options)

sobel模板通过旋转可以扩展为8个模板,见教材P174。
实验:L4_15

二、频率域图像锐化方法
(1)理想高通滤波
理想低通滤波器:

其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离。

高通滤波器传递函数及其径向剖面如下所示。

用这个滤波器对图像进行处理,可得到如下所示的结果。与理想的低通滤波器一样,所得到的图像有很明显的振铃现象。
实验:L4_17

(2)巴特沃斯高通滤波
巴特沃斯低通滤波器:

巴特沃斯高通滤波器也可以通过改变次数n,对过度特性进行调整,但效果较好,振铃效果不明显。

实验:L4_18

(3)指数高通滤波
指数高通滤波函数:

效果较巴特沃斯高通滤波略差,振铃效果不明显。

实验:L4_19
(4)梯形高通滤波
指数高通滤波函数:

产生微振铃效果,计算简单,较常用。
实验:L4_20
Lecture 5图像复原
一、频率域图像复原方法
matlab运算基础:
(1)*和.的联系和区别。
  1,在进行数值运行和数值乘矩阵,这两种没有区别,例如:a
b=a.b; aB=a.B; Ba=B.*a (其中小写字母表示数值,大写字母表示矩阵,下同)。
  2,在处理矩阵乘矩阵时,*表示普通的矩阵乘法,要求前面矩阵的列数等于后面矩阵的行数;.表示两个矩阵对应元素相乘,要求两个矩阵行数列数都相等。
(2)/和./的联系和区别。
  1.数值运行时,这两种没有区别,例如:a/b=a./b
  2.数值与矩阵运行时,要分数值在前还是在后。
  (1),数值在前,只能用./
    (2),数值在后,这两种一样:A/b=A./b
  3.矩阵除矩阵,A/B可粗略地看作A
inv(B)(强烈不建议进行求逆运算);A./B表示A矩阵与B矩阵对应元素相除,所以要求A,B行数列数相等。
(3)A2与A.2的区别是:

  1. A^2=A*A,这是矩阵与矩阵的乘法。
  2. A.^2 则是矩阵A的每个元素分别平方,作为新的矩阵。
    (4)conv2(A,B)
    matlab中conv2 函数在计算二维卷积应用实例如下:
    格式:C=conv2(A,B)
          C=conv2(Hcol,Hrow,A)
          C=conv2(…,‘shape’)
    说明:对于 C=conv2(A,B),conv2 计算矩阵A和B的卷积,若[Ma,Na]=size(A),[Mb,Nb]=size(B),则 size©=[Ma+Mb-1,Na+Nb-1]。

频率域复原:
(1)逆滤波复原
逆滤波传递函数:

练习L5_1

(2)维纳滤波复原
函数:J = deconvwnr(I,PSF,NSR)
Deconvolves image I using the Wiener filter algorithm, returning deblurred image J. Image I can be an N-dimensional array. PSF is the point-spread function with which I was convolved. NSR is the noise-to-signal power ratio of the additive noise. NSR can be a scalar or a spectral-domain array of the same size as I. Specifying 0 for the NSR is equivalent to creating an ideal inverse filter.
练习L5_2

空间域复原:
(1)R_L复原
函数:deconvlucy()
J = deconvlucy(I,PSF,NUMIT,DAMPAR,WEIGHT,READOUT)

NUMIT(optional)是迭代次数(默认值为10)。

DAMPAR(optional)是一个数组,用于指定图像I(根据泊松噪声的标准偏差)的结果图像的阈值偏差,低于此值会发生阻尼。对于在DAMPAR值内偏离其原始值的像素,迭代被抑制。这可以抑制这些像素中的噪音,并在其他地方保留必要的图像细节。默认值为0(无阻尼)。

WEIGHT(optional)分配给每个像素以反映相机的拍摄质量。将一个坏像素分配给零权值,从而排除该像素。可以根据平场校正的数量来调整权重,而不是给予好像素的权重。默认值是与输入图像I大小相同的单位数组。

READOUT(可选)是对应于附加噪声(例如,背景,前景噪声)和读出相机噪声方差的阵列(或值)。READOUT必须以图像为单位。默认值是0。

练习L5_3

(2)盲去卷积复原
函数:deconvblind()
[J,PSF] = deconvblind(I,INITPSF,NUMIT,DAMPAR,WEIGHT,READOUT)

NUMIT(可选)是迭代次数(默认值为10)。
DAMPAR(可选)是一个数组,用于指定图像I(根据泊松噪声的标准偏差)的结果图像的阈值偏差,低于此值会发生阻尼。对于在DAMPAR值内偏离其原始值的像素,迭代被抑制。这可以抑制这些像素中的噪音,并在其他地方保留必要的图像细节。默认值为0(无阻尼)。
WEIGHT(可选)分配给每个像素以反映相机的拍摄质量。将一个坏像素分配给零权值,从而排除该像素。可以根据平场校正的数量来调整权重,而不是给予好像素的权重。默认值是与输入图像I大小相同的单位数组。
READOUT(可选)是对应于附加噪声(例如,背景,前景噪声)和读出相机噪声方差的阵列(或值)。READOUT必须以图像为单位。默认值是0。
练习L5_4

Lecture 6图像分割
matlab基础知识:
(1)imhist()
imhist(i):直接显示图像i的灰度直方图(默认为255个灰度级);
imhist(i,n):n为指定灰度级显示直方图;
[count,x]=imhist(i)获取直方图信息,count为每一级灰度像素个数,x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图;
(2)stem()
stem(Y) 将数据序列Y从x轴到数据值按照茎状形式画出,以圆圈终止。
stem([x,] y, linefmt=None, markerfmt=None, basefmt=None,bottom=0, label=None, use_line_collection=True, data=None)
函数参数:
x: array-like, optional;The x-positions of the stems. Default: (0, 1, …, len(y) - 1).
可选参数,数组,每根棉棒的x轴位置,默认设置为(0, 1,2,…,len(y)-1)
y: array-like ;The y-values of the stem heads.
数组,棉棒头部的y值,y坐标.
linefmt: str, optional
A string defining the properties of the vertical lines. Usually, this will be a color or a color and a linestyle:
线条样式:可选参数,字符串类型,定义垂直线的属性。通常,定义垂直线的颜色,或线的颜色和线条类型.
markerfmt: str, optional
A string defining the properties of the markers at the stem heads. Default: ‘C0o’, i.e. filled circles with the first color of the color cycle.
棉棒头部标记样式:字符串,可选参数
定义棉棒头部标记属性的字符串,默认是C 0 o C0oC0o,即:用颜色循环的第一种颜色的圆圈样式.
basefmt: str, default: ‘C3-’ (‘C2-’ in classic mode)
A format string defining the properties of the baseline.
基线格式: 字符串,默认为C 3 − C3-C3−(经典模式下为C 2 − C2-C2−)
定义基线属性的字符串
bottom: float, default: 0
The y-position of the baseline.
基线位置:浮点型,默认值为0。 基线所在的y轴位置.
label: str, default: None
The label to use for the stems in legends.
标签:字符串,默认无,棉棒图例的标签.
(3)hold on & hold off
hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存;
hold off使当前轴及图像不再具备被刷新的性质,新图出现时,取消原图。即,关闭图形保持功能。
(4)graythresh()
graythresh(image)函数输入是一副图像,输出就是阈值。在这个函数中,是使用最大类间方差法找到图片的一个合适的阈值(threshold)。再利用im2bw(将灰度图像转换为二值图像)函数,将找到的阈值输入,就可以把原图变为一个二值图。
(5)im2bw和imbinarize
 bw=imbinarize( g ); 或 bw=im2bw( g );
为了使图片转换为二值图,利用 imbinarize 函数,其中的参数必须为二维的灰度图:
两个函数都是将图片转换为灰度图,除了参数的类型不同,两个函数都可再传入一个 [0,1] 的阈值,即:
bw = im2bw( g , level ); 或 bw = imbinarize( g , level );
当 im2bw 的 level 省略时,默认为 0.5 。
 imbinarize( g) 不指定level,等同于 im2bw( g, T ) ,T=graythresh(Image)。

一、阈值分割法
(1)灰度直方图阈值选择
原理:假设某图像的灰度直方图具有二峰性( f(Ta)=Ha; f(Tb)=Hb ),表明这个图像较亮的区域和较暗的区域可以较好地分离。取二峰间的谷点为阈值Th,可以得到好的二值处理的效果。
计算步骤:教材P245(程序代码).
练习L6_1

(2)基于模式分类思路的阈值选择
①最大类间分类法(OTSU)
Otsu 方法是最佳的,因为它使得类间方差最大化。其基本思想是,适当的阈值化的类就其像素灰度值而言,应当是截然不同的,相反地,就其灰度值而言,给出最佳类间分离的阈值 将是最佳的阈值。
计算步骤:教材P247.
练习L6_2

②最大熵法
原理: 熵是信息理论中一个重要的概念,这种方法常用于数据压缩领域。熵是一种统计测量方法,用以确定随机数据源中所包含的信息数量。图像中所有灰度值概率相同时,熵最大。

计算步骤:教材P248.
练习L6_3

二、边界分割
matlab基础知识:
(1)imhist()
imhist(i):直接显示图像i的灰度直方图(默认为255个灰度级);
imhist(i,n):n为指定灰度级显示直方图;
[count,x]=imhist(i)获取直方图信息,count为每一级灰度像素个数,x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图;
(2)stem()
stem(Y) 将数据序列Y从x轴到数据值按照茎状形式画出,以圆圈终止。
stem([x,] y, linefmt=None, markerfmt=None, basefmt=None,bottom=0, label=None, use_line_collection=True, data=None)
函数参数:
x: array-like, optional;The x-positions of the stems. Default: (0, 1, …, len(y) - 1).
可选参数,数组,每根棉棒的x轴位置,默认设置为(0, 1,2,…,len(y)-1)
y: array-like ;The y-values of the stem heads.
数组,棉棒头部的y值,y坐标.
linefmt: str, optional
A string defining the properties of the vertical lines. Usually, this will be a color or a color and a linestyle:
线条样式:可选参数,字符串类型,定义垂直线的属性。通常,定义垂直线的颜色,或线的颜色和线条类型.
markerfmt: str, optional
A string defining the properties of the markers at the stem heads. Default: ‘C0o’, i.e. filled circles with the first color of the color cycle.
棉棒头部标记样式:字符串,可选参数
定义棉棒头部标记属性的字符串,默认是C 0 o C0oC0o,即:用颜色循环的第一种颜色的圆圈样式.
basefmt: str, default: ‘C3-’ (‘C2-’ in classic mode)
A format string defining the properties of the baseline.
基线格式: 字符串,默认为C 3 − C3-C3−(经典模式下为C 2 − C2-C2−)
定义基线属性的字符串
bottom: float, default: 0
The y-position of the baseline.
基线位置:浮点型,默认值为0。 基线所在的y轴位置.
label: str, default: None
The label to use for the stems in legends.
标签:字符串,默认无,棉棒图例的标签.
(3)hold on & hold off
hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存;
hold off使当前轴及图像不再具备被刷新的性质,新图出现时,取消原图。即,关闭图形保持功能。
(4)graythresh()
graythresh(image)函数输入是一副图像,输出就是阈值。在这个函数中,是使用最大类间方差法找到图片的一个合适的阈值(threshold)。再利用im2bw(将灰度图像转换为二值图像)函数,将找到的阈值输入,就可以把原图变为一个二值图。
(5)im2bw和imbinarize
 bw=imbinarize( g ); 或 bw=im2bw( g );
为了使图片转换为二值图,利用 imbinarize 函数,其中的参数必须为二维的灰度图:
两个函数都是将图片转换为灰度图,除了参数的类型不同,两个函数都可再传入一个 [0,1] 的阈值,即:
bw = im2bw( g , level ); 或 bw = imbinarize( g , level );
当 im2bw 的 level 省略时,默认为 0.5 。
 imbinarize( g) 不指定level,等同于 im2bw( g, T ) ,T=graythresh(Image)。

(1)Hough变换检测直线
定义:霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,可以识别图像中的几何形状。它将图像空间中的特征点映射到参数空间进行投票,通过检测累计结果的局部极值点得到一个符合某特定形状的点的集合。经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。它的抗噪声、抗形变能力较强。
实现步骤:
1、得到图像的边缘信息;
2、对边缘图像中的每一个点,在k-b空间中画出一条直线;
3、对各直线上的点,采取“投票”(vote)的方法,即累加:有直线经过这一点,这一点的值加1;
4、遍历k-b空间,找出局部极大值点,这些点的坐标(k,b)就是原图像中可能的直线的斜率和截距。
(霍夫变换的计算量和存储都是很大的。)
同样的原理,我们可以用来检测圆,等式变为:(x –a ) ^2 + (y-b) ^ 2 = r^2,这样霍夫的参数空间就变成一个三维参数空间。若给定圆的半径则简化为二维霍夫参数空间。
[H,theta,rho] =hough(BW)
计算二值图像BW的标准霍夫变换(SHT)。 该函数返回rho(沿垂直于线的矢量从原点到直线的距离)和theta(x轴与该矢量之间的角度,以度为单位)。

peaks = houghpeaks(H,numpeaks)
peaks = houghpeaks(H,numpeaks,Name,Value)

(1)peaks = houghpeaks(H,numpeaks) locates peaks in the Hough transform matrix, H, generated by the hough function. numpeaks specifies the maximum number of peaks to identify. The function returns peaks a matrix that holds the row and column coordinates of the peaks.
(2)peaks = houghpeaks(H,numpeaks,Name,Value) controls aspects of the operation using name-value pair arguments.
参数 含义
H 霍夫变换得到的矩阵
numpeaks 限定要识别的峰值的个数,默认值为1
‘Threshold’ 可被认为是峰值的最小值,比如0.2*max(max(H))

lines = houghlines(BW,theta,rho,peaks)
lines = houghlines(___,Name,Value,…)
(1) lines = houghlines(BW,theta,rho,peaks) 提取图像 BW 中与 Hough 变换中的特定 bin 相关联的线段。theta 和 rho 是函数 hough 返回的向量。peaks 是由 houghpeaks 函数返回的矩阵,其中包含 Hough 变换 bin 的行和列坐标,用于搜索线段。返回值 lines 是结构体数组,其长度等于找到的合并后的线段数。
(2)lines = houghlines(___,Name,Value,…) 提取图像 BW 中的线段,其中指定的参数影响运算。
返回值
lines 为找到的线条,以结构体数组形式返回,其长度等于找到的合并线段数。结构体数组的每个元素都有以下字段:

计算步骤:教材P256(程序代码).
练习L6_4_1,L6_4_1,

(2)边界追踪
在matlab图像处理工具箱中,有两个函数可以用来进行边界跟踪,其中一个是bwtraceboundary,另一个是bwboundaries。
A、B = BWBOUNDARIES(BW) 跟踪对象的外部边界和对象内部的孔洞的外部边界。它也能对最外部对象(父对象)以及子对象(完全被父对象封闭的对象)进行追踪。其中,BW必须为二值图像,且非零像素属于对象,零像素为背景部分。B为返回值,为一个包含P个元素的cell 数组(单元数组),p是对象和孔洞的数量。每个cell单元包含一个Q2的二维数组,Q是对应对象的边界像素的数量。该Q2的二维数组的每行包含边界像素的行列坐标。
B、B = BWBOUNDARIES(BW,CONN) 在对父对象和子对象边界进行追踪时指定使用连通性。CONN可以为8或4,表示8连通或者4连通。如果不指定,则默认为8连通。
B是一个P1的单元数组,P代表连通体个数,B内每行是一个Q2的矩阵。Q内每一行白哦是连通体的边界像素的位置坐标。第一列是纵坐标Y,第二列是横坐标X,Q为边界像素的个数。所以boundary(:,2)为x,boundary(:,1)为x。点击打开链接
C、B = BWBOUNDARIES(BW,CONN,OPTIONS) 提供选择字符串输入。该字符串可以为noholes。即寻找不包含孔的边缘。默认情况下,追踪对象区域以及孔区域边界。

练习L6_5

你可能感兴趣的:(数学建模)