数字图像处理&&图像运算

一、图像的代数运算(医学图像处理、图像误差检测)

首先把图像转换成与Matlab基本代数符类型相容的双精度浮点型,再利用Matlab的代数运算符实现图像的代数运算。

1.图像的加法运算

加

>> i=imread('rice.png');
>> j=imread('cameraman.tif');
>> k=imadd(i,j,'uint16');
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(j);title('原始图像cameraman');
>> subplot(1,3,3);imshow(k);title('两幅图像叠加');

数字图像处理&&图像运算_第1张图片

>> subplot(1,3,3);imshow(k,[]);title('两幅图像叠加');

数字图像处理&&图像运算_第2张图片
imshow(K)直接显示灰度图像K
imshow(K,[])显示K,并将K的最大值和最小值分别作为纯白(255)和纯黑(0),中间的K值映射为0-255之间的标准灰度值。

2.添加噪声

  1. 添加高斯噪声,m,v分别为噪声的均值与方差,默认m=0,b=0.01
  2. 添加椒盐噪声,d分别为噪声的密度,默认为0.05
  3. 添加噪声,通用的格式:
>> i=imread('eight.tif');
>> j=imnoise(i,'salt & pepper',0.04);
>> subplot(1,2,1);imshow(i);title('原始图像');
>> subplot(1,2,2);imshow(j);title('添加椒盐噪声的图像');

数字图像处理&&图像运算_第3张图片
利用多图像的平均可以降低图像的噪声
对于原图像,假设有一个噪声图像集:
集合
一般噪声满足零期望:
期望
如果用均值来估计噪声分布的期望,则有:

所以可以降低图像的噪声。

>> i=imread('eight.tif');
>> j1=imnoise(i,'gaussian',0,0.006);
>> j2=imnoise(i,'gaussian',0,0.006);
>> j3=imnoise(i,'gaussian',0,0.006);
>> j4=imnoise(i,'gaussian',0,0.006);
>> K=imlincomb(0.3,j1,0.3,j2,0.3,j3,0.3,j4);%线性组合
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像');
>> subplot(1,3,2);imshow(j1);title('添加高斯噪声的图像');
>> subplot(1,3,3);imshow(K,[]);title('抑制高斯噪声的图像');

数字图像处理&&图像运算_第4张图片

3.图像的减法(差分)运算(检测变化及运动的物体)

  1. 消除背景法
    sub
>> i=imread('rice.png');
>> background=imopen(i,strel('disk',15));
>> j=imsubtract(i,background);
>> figure;
>> subplot(1,3,1);imshow(i);title('原始图像rice');
>> subplot(1,3,2);imshow(background);title('背景图像');
>> subplot(1,3,3);imshow(j,[]);title('去除背景的图像');

数字图像处理&&图像运算_第5张图片
减法操作时有时会导致某些像素值为负数,这时函数会自动截取为0,也可以调用imabsdiff函数实现。

i=imread('cameraman.tif');
subplot(1,3,1);imshow(i);title('原始图像');
j=uint8(filter2(fspecial('gaussian'),i));
subplot(1,3,2);imshow(j);title('含噪图像');
k=imabsdiff(i,j);
subplot(1,3,3);imshow(k,[]);title('两幅图像相减');
  1. 差影法
    同一景物在不同时间拍摄的图像或同一景物在不同波段的图像相减。
    差影法用于自动现场监测、运动目标的检测和跟踪、消除背景及目标识别等。
    差影法检测变化:
i=imread('eight1.png');
j=imread('eight.png');
k=imabsdiff(i,j);
figure;
subplot(1,3,1);imshow(i);title('T1时刻的状态');
subplot(1,3,2);imshow(j);title('T2时刻的状态');
subplot(1,3,3);imshow(k);title('两个时刻的状态区别');

4.图像的乘法运算

>> i0=imread('rice.png');
>> i=rgb2gray(i0);
>>subplot(2,2,1);imshow(i);title('原始图像');
>>i16=uint16(i);
>>j=immultiplt(i);
>>subplot(2,2,2);imshow(j);title('图像自身相乘效果');
>>k=immultiply(i,0.65);
>>subplot(2,2,3);imshow(k);title('图像与常数0.65相乘效果');
>>k=immultiply(i,3);
>>subplot(2,2,4);imshow(k);title('图像与常数3相乘效果');

5.图像的除法运算(校正成像设备的非线性影响,在医学图像处理常用)

>> i0=imread('street.jpg');
>>j0=imread('street1.jpg');
>>i=rgb2gray(i0);
>>j=rgb2gray(j0);
>>subplot(2,3,1);imshow(i0);title('原始彩色图像');
>>subplot(2,3,2);imshow(j0);title('反色彩色图像');
>>subplot(2,3,3);imshow(i);title('原始灰度图像');
>>k=imdivide(j,i);
>>k1=imdivie(i,0.3);
>>k2=imdivide(i,1.2);
>>subplot(2,3,4);imshow(k);title('图像相除的效果');
>>subplot(2,3,5);imshow(k1);title('图像与常数0.65相除的效果');
>>subplot(2,3,6);imshow(k2);title('图像与常数3相除的效果');

二、图像的邻域运算(图像滤波、形态学运算)

对图像的像素进行处理时,不仅需要输入该像素本身的灰度,还要输入以该像素为中心某局部区域的一些像素的灰度进行运算的方式,称为图像邻域运算

1、滑动邻域处理

  • 滑动邻域操作每次在一个像素上进行。
  • 输出图像的每个像素值都是输入图在这个像素邻域内进行指定的运算得到的像素值。
    一般算法:
  1. 选择一个像素
  2. 确定这个像素的邻域
  3. 对邻域的像素值应用指定的函数进行计算
  4. 返回输出图像的像素值,其位置位于输入图像邻域的中心位置
  5. 对图像中的每个像素重复上面四个步骤。
>> A=imread('cameraman.tif');
>> A=im2double(A);
>> fun=@(x)median(x(:));
>> B=nlfilter(A,[3,3],fun);
>> subplot(1,2,1);imshow(A);title('原始图像');
>> subplot(1,2,2);imshow(B);title('邻域操作');

数字图像处理&&图像运算_第6张图片

2、快速邻域操作

当进行滑动邻域操作的时候,可以使用列处理来加快处理的速度。
在matlab中,进行列处理的函数为colfilt,可以实现:

  1. 将图像的一个滑动块转化为一个临时矩阵的列
  2. 使用指定的函数对临时矩阵进行操作
  3. 把结果矩阵变为原来的形状
    调用格式:
    快速邻域
    图像块的大小为m*n,block_type为快速移动方式,'distinct’表示图像不重叠,'sliding’表示图像滑动,函数fun为作用于图像邻域上的处理函数。
>> A=imread('cameraman.tif');
>>A=im2double(A);
>> fun=@(x)ones(9,1)*median(x);
>> B=colfilt(A,[3 3],'distinct',fun);
>> subplot(1,2,1);imshow(A);title('原始图像');
>>subplot(1,2,2);imshow(B);title('快速邻域操作');

数字图像处理&&图像运算_第7张图片

三、图像的几何运算(图像配准、校正)

通过把输入图像的像素的位置映射到一个新位置达到改变原图像显示效果的目的,称为图像的几何运算。

1、 图像的旋转

1
2
矩阵变换表示:
3
编程实现图像的旋转:

>>i=imread('football.jpg');
>> subplot(3,2,1);imshow(i);title('原始图像');
>> i1=imrotate(i,60);
>> i2=imrotate(i,-30);
>> i3=imrotate(i,60,'bicubic','crop');
>> i4=imrotate(i,-30,'bicubic','loose');
>> subplot(3,2,3);imshow(i1);title('逆时针旋转60度');
>> subplot(3,2,4);imshow(i2);title('顺时针旋转30度');
>> subplot(3,2,5);imshow(i3);title('裁剪逆时针旋转60度');
>> subplot(3,2,6);imshow(i4);title('裁剪顺时针旋转30度');

结果显示:
数字图像处理&&图像运算_第8张图片

2、图像的缩放

  1. 比例缩小变换
    基于等间隔采样的图像缩小方法
    编程实现图像的缩放:
>>  i=imread('football.jpg');
>> figure:imshow(i);title('原始图像');

数字图像处理&&图像运算_第9张图片

>> j=imresize(i,0.125);
>> figure:imshow(j);title('缩小的图像');

数字图像处理&&图像运算_第10张图片
2. 比例放大变换
一般采用灰度插值法对图像进行放大
Matlab提供三种插值法:
- [ ] 最近邻插值
- [ ] 双线性插值法
- [ ] 双三次插值法

Matlab提供interp2函数用于图像的插值,格式为:

>> i=imread('football.jpg');
>> j=imresize(i,0.125);
>> j=rgb2gray(j);
>> j1=interp2(j,8,'nearest');%最近邻插值
>> j1=uint8(j1);
>> subplot(2,2,1);imshow(j1);title('最近邻插值');
>> j2=interp2(double(j),8,'linear');
>> j2=uint8(j2);subplot(2,2,2);imshow(j2);title('线性插值');
>> j3=interp2(double(j),8,'spline');
>> j3=uint8(j3);subplot(2,2,4);imshow(j3);title('三次样条插值');
>> j4=interp2(double(j),8,'cubic');
>> j4=uint8(j4);subplot(2,2,3);imshow(j4);title('立方插值');

数字图像处理&&图像运算_第11张图片
Z:需要插值的图像
Ntimes:放大的倍数
Method:可选的参数,插值的方法

  • Nearest:最近邻插值
  • Linear:双线性插值法
  • Spline:三次样条插值法
  • Cubic:双三次插值法

3、图像的裁剪

  1. 自动截图
    I2=imcrop(I,rect);
    X2=imcrop(X,MAP,rect);
    RGB2=imcrop(RGB,rect);
  2. 鼠标手动截图
    [Img0,rect]=imcrop(Img);

4、图像的镜像变换(水平、垂直和对角镜像)

  1. 水平镜像
    水平
    矩阵变换表示:
    水平
  2. 垂直镜像
    垂直
    矩阵变换表示:
    垂直
  3. 对角镜像
    对角
    矩阵变换表示:
    对角
>> i=imread('football.jpg');
>> i1=double(i);
>> subplot(2,2,1);imshow(uint8(i1));title('原始图像');
>> H=size(i1);
>> i2(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,1:H(2),1:H(3));
>> subplot(2,2,2);imshow(uint8(i2));title('垂直图像');
>> i3(1:H(1),1:H(2),1:H(3))=i1(1:H(1),H(2):-1:1,1:H(3));
>> subplot(2,2,3);imshow(uint8(i3));title('水平图像');
>> i4(1:H(1),1:H(2),1:H(3))=i1(H(1):-1:1,H(2):-1:1,1:H(3));
>> subplot(2,2,4);imshow(uint8(i4));title('对角图像');

数字图像处理&&图像运算_第12张图片

5、图像的平移

平移
矩阵变换表示:
平移
Matlab没有提供专门的函数实现图像的平移,需要自定义平移函数。
不考虑溢出函数:

function J = translation(I,a,b)
%I为输入图像,a,b描述I沿着X轴、Y轴移动距离
%不考虑溢出情况
[M,N,G]=size(I);
I=im2double(I);%将图像数据类型转换为双精度
J=ones(M,N,G);%初始化新的图像矩阵为全1矩阵
for i=1:M;
    for j=1:N
        %判断平移后行列坐标是否超出范围
        if((i+a)>=1&&(i+a)<=M&&(j+b)>=1&&(j+b)<=N)
            J(i+a,j+b,:)=I(i,j,:);%图像平移
        end
    end
end


主程序:

>> i=imread('football.jpg');
>> a=90;b=90;
>> j1=translation(i,a,b);subplot(2,2,1);imshow(j1);axis on;title('右下平移图像');
>> a=-90;b=-90;
>> j2=translation(i,a,b);subplot(2,2,2);imshow(j2);axis on;title('左上平移图像');
>> a=-90;b=90;
>> j3=translation(i,a,b);subplot(2,2,3);imshow(j3);axis on;title('右上平移图像');
>> a=90;b=-90;
>> j4=translation(i,a,b);subplot(2,2,4);imshow(j4);axis on;title('左下平移图像');

数字图像处理&&图像运算_第13张图片
考虑溢出函数:

function J = translation(I,a,b)
%I为输入图像,a,b描述I沿着X轴、Y轴移动距离
%考虑溢出情况,采用扩大显示区域的方法
[M,N,G]=size(I);
I=im2double(I);%将图像数据类型转换为双精度
J=ones(M+abs(a),N+abs(b),G);%初始化新的图像矩阵为全1矩阵,大小根据xy平移的范围确定
for i=1:M;
    for j=1:N;
    if(a<0&&b<0)
        J(i,j,:)=I(i,j,:);%如果进行左上移动,对新图像矩阵进行赋值
    elseif(a>0&&b>0)
        J(i+a,j+b,:)=I(i,j,:);%如果进行右下移动,对新图像矩阵进行赋值
    elseif(a>0&&b<0)
        J(i+a,j,:)=I(i,j,:);%如果进行右上移动,对新图像矩阵进行赋值
    else
        J(i,j+b,:)=I(i,j,:);%如果进行左下移动,对新图像矩阵进行赋值
        end
    end
end

数字图像处理&&图像运算_第14张图片

你可能感兴趣的:(学习笔记,数字图像处理,Matlab)