zoukankan      html  css  js  c++  java
  • 数字图像处理_图像基本运算

    图像基本运算

    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': 使输出图像足够大, 以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。 一般这种格式产生的图像的尺寸都要大于源图像的尺寸。
  • 相关阅读:
    Merge Intervals
    Insert Interval
    Combination Sum
    Trapping Rain Water II
    Kth Largest in N Arrays
    Spiral Matrix
    Search a 2D Matrix
    Binary Postorder Traversal
    Search in Rotated Sorted Array II
    S3C2440移植uboot之启动过程概述
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10537867.html
Copyright © 2011-2022 走看看