数字图像处理_图像基本运算

图像基本运算

1点运算

 线性点运算是指输入图像的灰度级与输出图像呈线性关系。
s=ar+b
  (r为输入灰度值,s为相应点的输出灰度值)。
  当a=1,b=0时,新图像与原图像相同;
  当a=1,b≠0时,新图像是原图像所有像素的灰度值上移或下移,是整个图像在显示时更亮或更暗;
  当a>1时,新图像对比度增加;
  当a<1时,新图像对比度降低;
  当a<0时,暗区域将变亮,亮区域将变暗,点运算完成了图像求补;

  非线性点运算是指输入与输出为非线性关系,常见的非线性灰度变换为对数变换和幂次变换,对数变换一般形式为:

s=clog(1+r)
其中c为一常数,并假设r≥0.此变换使窄带低灰度输入图像映射为宽带输出值,相对的是输出灰度的高调整。

 

 1 x=imread('D:/picture/DiaoChan.jpg');
 2 subplot(2,2,1)
 3 imshow(x);
 4 title('原图');
 5 J=0.3*x+50/255;
 6 subplot(2,2,2);
 7 imshow(J);
 8 title('线性点变换');
 9 subplot(2,2,3);
10 x1=im2double(x);
11 H=2*log(1+x1);
12 imshow(H)
13 title('非线性点运算');%对数运算

幂次变换一般形式:s=cr^γ

幂级数γ部分值把窄带暗值映射到宽带输出值

下面是非线性点运算的幂运算

 

1 I=imread('D:/picture/DiaoChan.jpg');
2 subplot(2,2,1);
3 imshow(I);title('原始图像','fontsize',9);
4 subplot(2,2,2);
5 imshow(imadjust(I,[],[],0.5));title('Gamma=0.5');
6 subplot(2,2,3);
7 imshow(imadjust(I,[],[],1));title('Gamma=1');
8 subplot(2,2,4);
9 imshow(imadjust(I,[],[],1.5));title('Gamma=1.5');

 



2代数运算和逻辑运算

加法运算去噪处理

 

 1 clear all
 2 i=imread('lenagray.jpg');
 3 imshow(i)
 4 j=imnoise(i,'gaussian',0,0.05);
 5 [m,n]=size(i);
 6 k=zeros(m,n);
 7 for l=1:100
 8     j=imnoise(i,'gaussian',0,0.05);
 9     j1=im2double(j);
10     k=k+j1;
11 End
12 k=k/100;
13 subplot(1,3,1),imshow(i),title('原始图像')
14 subplot(1,3,2),imshow(j),title('加噪图像')
15 subplot(1,3,3),imshow(k),title(‘求平均后的

 

 

 减法运算提取噪声

1 I=imread(‘lena.jpg’);
2 J=imnoise (I,‘lena.jpg’,0,0.02);
3 K=imsubtract(J,I);
4 K1=255-K;
5 figure;imshow(I);
6 figure;imshow(J);
7 figure;imshow(K1);

乘法运算改变图像灰度级

1 I=imread('D:/picture/SunShangXiang.jpg')
2 I=im2double(I);
3 J=immultiply(I,1.2);
4 K=immultiply(I,2);
5 subplot(1,3,1),imshow(I);subplot(1,3,2),imshow(J);
6 subplot(1,3,3);imshow(K);

 逻辑运算

 1 A=zeros(128);
 2 A(40:67,60:100)=1;
 3 figure(1)
 4 imshow(A);
 5 B=zeros(128);
 6 B(50:80,40:70)=1;
 7 figure(2)
 8 imshow(2);
 9 C=and(A,B);%10 figure(3);
11 imshow(3);
12 D=or(A,B);%13 figure(4);
14 imshow(4);
15 E=not(A);%16 figure(5);
17 imshow(E);

 

3几何运算

平移运算实现图像的平移

 

 1 I=imread('lenagray.jpg');
 2 subplot(1,2,1);
 3 imshow(I);
 4 [M,N]=size(I);g=zeros(M,N);
 5 a=20;b=20;
 6 for i=1:M
 7     for j=1:N
 8         if((i-a>0)&(i-a<M)&(j-b>0)&(j-b<N))
 9             g(i,j)=I(i-a,j-b);
10         else
11             g(i,j)=0;
12         end
13     end
14 end
15 subplot(1,2,2);imshow(uint8(g));

 

水平镜像变换

1 I=imread('lena.jpg');
2 subplot(121);imshow(I);
3 [M,N]=size(I);g=zeros(M,N);
4 for i=1:M
5     for j=1:N
6         g(i,j)=I(i,N-j+1);
7     end
8 end
9 subplot(122);imshow(uint8(g));

 垂直镜像变换

1 I=imread('lena.jpg');
2 subplot(121);imshow(I);
3 [M,N]=size(I);g=zeros(M,N);
4 for i=1:M
5     for j=1:N
6         g(i,j)=I(M-i+1,j);
7     end
8 end
9 subplot(122);imshow(uint8(g));

 

 图像的旋转

 1 x=imread('D:/picture/DiaoChan.jpg');
 2 imshow(x);
 3 j=imrotate(x,45,'bilinear');
 4 k=imrotate(x,45,'bilinear','crop');
 5 subplot(1,3,1),imshow(x);
 6 title(‘原图')
 7 subplot(1,3,2),imshow(j);
 8 title(‘旋转图(显示全部)')
 9 subplot(1,3,3),imshow(k);
10 title(‘旋转图(截取局部)')

几种插值法比较

1 i=imread('lena.jpg');
2 j1=imresize(i,10,'nearest');
3 j2=imresize(i,10,'bilinear');
4 j3=imresize(i,10,'bicubic');
5 subplot(1,4,1),imshow(i);title(‘原始图像')
6 subplot(1,4,2),imshow(j1);title(‘最近邻法')
7 subplot(1,4,3),imshow(j2);title(‘双线性插值法')
8 subplot(1,4,4),imshow(j3);title(‘三次内插法')

 放缩变换

 1 x=imread('D:/picture/ZiXia.jpg')
 2 subplot(2,3,1)
 3 imshow(x);
 4 title('原图');
 5 Large=imresize(x,1.5);
 6 subplot(2,3,2)
 7 imshow(Large);
 8 title('扩大为1.5');
 9 Small=imresize(x,0.1);
10 subplot(2,3,3)
11 imshow(Small);
12 title('缩小为0.3');
13 subplot(2,3,4)
14 df=imresize(x,[600 700],'nearest');
15 imshow(df)
16 title('600*700');
17 df1=imresize(x,[300 400],'nearest');
18 subplot(2,3,5)
19 imshow(df1)
20 title('300*400');

 








 


 后记:

(1)MATLAB基础知识回顾

1:crtl+R是对选中的区域注释,ctrl+T是取消注释

2:有的代码中点运算如O=a.*I+b/255 ,其中b除以255原因是:灰度数据有两种表式方法:一种是用unit8类型,取值0~255;另一种是double类型,取值0~1。两者之间相差255倍。就这段代码而言,I刚读入时是unit8类型,在第2句转换为double,所以后面涉及到与它进行运算的时候,为了统一,都要转换到0~1的范围,所以要除255。

3:imresize的用法

  1、B = imresize(A,m)  将图片A放大m倍
  2、B = imresize(A,m,method)
    将图片A由参数method指定的插值运算方法来改变图像的大小到m倍,
    method的几种可选值:
    'nearest'最近邻插值(默认)
    'bilinear'双线性插值
    'bicubic'双三次插值
  3、B = imresize(A,[mrows
   ncols],method) 将图片A由参数method指定的插值运算方法,来改变图像的大小到长宽为[mrows
   ncols]
  4、B= imresize(...,method,n) 
  5、B= imresize(...,method,h) 
   其中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。

4:uint16的用法

  matlab中uint16函数的用法;
  1.函数用法:将输入参数映射到无符号16位范围之内,即将参数限定在0-65535之间;
  2.实例:当输入为一个实数a时:
  if a<0 输出ans=0;
  if 0<=a<=65535 输出ans=a;
  if a>65535 输出ans=65535;
  当输入为一个矩阵a时:对于矩阵中的每一个元素进行上述标量操作;
  if a=[-1 2 65539] 输出ans=[0 2 65535];
  注意:uint8的用法同理

5  mat2gray   把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组
    im2double 将输入转换为double类.若输入是uint8类 uint16 类 logical类则函数将其转换为范围[0,1]之间的类.

6imadjust

    函数imadjust是对灰度图像进行亮度转换的基本IPT工具
    g=imadjust(f,[low-in   high-in],[low_out  high_out],gmma)

    此函数将图像f中的亮度值映像到g中的新值,即将low_in至high_in之间的值的映射到low_out和high_out之间的值.low_in以下high_in以                 上的值被剪切了.   参数gamma给出曲线的形状.该曲线用来映射f的亮度值,以便生成图像g.若gamma小于

        1,则映射被加权至更高的输出值.

7imnoise的用法

imnoise 函数说明
  在MATLAB中,可以使用imnoise函数给一幅图像添加噪声。
  g = imnoise(f, type, parameters)
  参数说明:
  输出:g是添加噪声之后的图像。
  输入:f是原图像,type是加入的噪声类型,parameters是噪声的一些参数。
  概括地说,imnoise的函数原型为:g = imnoise(f, type, parameters),注意这个只是一个概括性的函数原型,因为parameters根据噪声种  类的不同可以指定多个值,也可以指定一个值。所以真正可以直接调用的函数原型是下面的这些函数接口。
具体形式的imnoise接口
    g=imnoise(f,‘gaussian’,m,var)是将均值为m,方差为var的高斯噪声加到图像f上。m的默认值是0,var默认值是0.01。
    g=imnoise(f,‘salt & pepper’,d)给图像f添加椒盐噪声,其中d是噪声密度(即包含噪声值的图像区域的百分比)。因此,大约有    d*numel(f)个像素受到污染,默认的噪声密度为0.05。
    g=imnoise(f,‘speckle’,var)用方程g=f + n*f将乘性噪声添加到图像f上,其中n是均值为0、方差为var的均匀分布的随机噪声。var的默认值为0.04。
imrotate函数说明

调用格式

编辑
B = imrotate(A,angle)
B = imrotate(A,angle,method)
B = imrotate(A,angle,method,bbox)

调用格式说明

B = imrotate(A,angle)
将图像A(图像的数据矩阵)绕图像的中心点旋转angle度, 正数表示逆时针旋转, 负数表示顺时针旋转。返回旋转后的图像矩阵。
B = imrotate(A,angle,method)
使用method参数可以改变插值算法,method参数可以为下面这三个值:
'nearest':最邻近线性插值(Nearest-neighbor interpolation)
'bilinear': 双线性插值(Bilinear interpolation)
'bicubic': 双三次插值(或叫做双立方插值)(Bicubic interpolation)
B = imrotate(A,angle,method,bbox)
bbox参数用于指定输出图像属性:
'crop': 通过对旋转后的图像B进行裁剪, 保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
'loose': 使输出图像足够大, 以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。 一般这种格式产生的图像的尺寸都要大于源图像的尺寸。
posted @ 2019-03-15 22:51  你的雷哥  阅读(6367)  评论(0编辑  收藏  举报