数字图像处理 图像变换

参考资料

一、人眼视觉特性

  • 韦伯率:50%概率感觉到亮度变化时的 Δ I I \frac{\Delta I}{I} IΔI为韦伯率。
    韦伯-费希纳定律:心理量和物理量之间关系的定律,即感觉量的大小与刺激强度的对数成正比。
    人眼视觉感知韦伯率曲线

  • 马赫带
    在这里插入图片描述

  • 对比度(人眼相对亮度感觉):: 灰度值之差比基础值。

  • 频谱混叠 :采样频率小于2fmax时候出现(不满足采样定理)

二、图像基本知识

1.图像类别

rgb图像 :R,G,B通道各有自己的灰度值,合成得到彩色图像。 例如 lena.jpg [512,512,3] 是一个3维数组
索引色图像:调色板和数据矩阵 调色板若干行3列
灰度图像:只有一个数据矩阵,灰度值越大越白
二值图像:只有两个灰度值

2.图像输入

  • imread
    A = imread(filename,fmt)
  • imwrite
    imwrite(A,filename,fmt)
  • imfinfo

3.图像输出

  • image :直接映射显示图像
  • imagesc :图像缩放函数(imagescale),线性映射显示图像
  1. imagesc(A) 将矩阵A中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色
  2. imagesc(x,y,A) x,y决定坐标范围,x,y应是两个二维向量,即x=[x1 x2],y=[y1 y2],matlab会在[x1,x2]*[y1,y2]的范围内染色。 如果x或y超过两维,则坐标范围为[x(1),x(end)]*[y(1),y(end)]
  • imshow
  1. imshow(I):直接调用,因为当图像为double型时imshow函数会把显示范围设置成[0 , 1],这样小于0的就变成黑色了,大于1的就变成白色了,所以处理不当就会出现全白的情况。
  2. imshow( I/(max(I(:))):针对直接调用imshow函数出现的问题,用max(I(:) ) 对图像矩阵进行归一化再显示,这样负数部分会变黑,正数部分还可以正常显示,但有一部分信息丢失了。
  3. imshow(I,[low,high]):用指定的灰度范围 [low high]显示灰度图像I。显示结果,图像中灰度值等于或低于low的都将用黑色显示,而灰度值大于等于high的都显示为白色,介于low和high之间的用其灰度级的默认值的中间色调显示。如果你用了一个空矩阵([]) 来代替 [low high], imshow 函数将使用 [min(I(:))max(I(:))]作为第二个参数。imshow(gray)不等于imshow(gray,[]),后者对比度变高。
    在这里插入图片描述

三、图像处理

1.图像类型转化

  1. cat :合成图像序列

  2. dither :图像抖动 印刷、视觉效果有提升,但是图像会损失一部分清晰度

  3. im2bw

  4. mat2gray :实现图像矩阵的归一化操作
    I = mat2gray(A, [amin amax])
    将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。

  5. im2double

  6. mat2gray()和im2double()区别:这两个如果都是对uint8数据操作,区别就在于前者是归一化操作,归一化后也在0~1之间,自然结果也是double类型,后者是将数据从0~255映射到0~1。例如:

      I  = uint8([1,1,2,3]);
      I1 = mat2gray(I);  % 归一化,I1结果是double型[0,0,0.5,1] 	
      I2 = im2double(I); % 映射化,I2结果是double型[0.0039,0.0039,0.0078,0.0118]	0-255作为总长度
    
  7. uint8和im2uint8
    在数据类型转换时候uint8和im2uint8的区别,uint8的操作仅仅是将一个double类型的小数点后面的部
    分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所
    有其他值乘以255。
    图像数据在计算前需要转换为double,以保证精度;很多矩阵数据也都是double的。要想显示其,必须先
    转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间)
    ,那么可以直接使用im2uint8。如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255(
    超过255的按255)。最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double)

2.图像变换

点变换
  1. 线性点运算

在这里插入图片描述
 2. 分段线性点运算
在这里插入图片描述
  3.非线性变换:

   - 对数变换 s = c ⋅ l o g ( 1 + r ) s=c\cdot log(1+r) s=clog(1+r)
在这里插入图片描述
在这里插入图片描述
  - 幂次变换 s = c ⋅ r γ s=c\cdot r ^\gamma s=crγ

在这里插入图片描述

代数运算

1.加法运算:去除“叠加性” 噪声
g ˉ ( x , y ) = 1 M ∑ i = 1 M [ f i ( x , y ) + e i ( x , y ) ] = f ( x , y ) + 1 M ∑ i = 1 M e i ( x , y ) \begin{aligned} \bar{g}(x, y) &=\frac{1}{M} \sum_{i=1}^{M}\left[f_{i}(x, y)+e_{i}(x, y)\right] \\ &=f(x, y)+\frac{1}{M} \sum_{i=1}^{M} e_{i}(x, y) \end{aligned} gˉ(x,y)=M1i=1M[fi(x,y)+ei(x,y)]=f(x,y)+M1i=1Mei(x,y)
2.减法运算:
C ( x , y ) = A ( x , y ) − B ( x , y ) C(x, y)=A(x, y)-B(x, y) C(x,y)=A(x,y)B(x,y)

  • 差影法检测变化;
  • 混合图像分离;
几何运算

g ( x , y ) = f ( u , v ) = f ( p ( x , y ) , q ( x , y ) ) g(x, y)=f(u, v)=f(p(x, y), q(x, y)) g(x,y)=f(u,v)=f(p(x,y),q(x,y))

其中 u = p ( x , y ) , v = q ( x , y ) u=p(x,y),v=q(x,y) u=p(x,y),v=q(x,y) 这种坐标变换关系称作几何变换

  • 平移变换
    [ x 1 y 1 1 ] = [ 1 0 Δ x 0 1 Δ y 0 0 1 ] [ x 0 y 0 1 ] \left[\begin{array}{l} x_{1} \\ y_{1} \\ 1 \end{array}\right]=\left[\begin{array}{lll} 1 & 0 & \Delta x \\ 0 & 1 & \Delta y \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x_{0} \\ y_{0} \\ 1 \end{array}\right] x1y11=100010ΔxΔy1x0y01

  • 水平镜像
    [ x 1 y 1 1 ] = [ − 1 0 w 0 1 0 0 0 1 ] [ x 0 y 0 1 ] \left[\begin{array}{c} x_{1} \\ y_{1} \\ 1 \end{array}\right]=\left[\begin{array}{ccc} -1 & 0 & w \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} x_{0} \\ y_{0} \\ 1 \end{array}\right] x1y11=100010w01x0y01
    w为宽

  • 垂直镜像
    [ x 1 y 1 1 ] = [ 1 0 0 0 − 1 h 0 0 − 1 ] [ x 0 y 0 1 ] \left[\begin{array}{c} x_{1} \\ y_{1} \\ 1 \end{array}\right]=\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & -1 & h \\ 0 & 0 & -1 \end{array}\right]\left[\begin{array}{l} x_{0} \\ y_{0} \\ 1 \end{array}\right] x1y11=1000100h1x0y01
    h为高

  • 仿射变换
    平移、比例缩放和旋转变换都是仿射变换的特殊情况
    [ u v ] = [ a 2 a 1 a 0 b 2 b 1 b 0 ] [ x y 1 ] \left[\begin{array}{l} u \\ v \end{array}\right]=\left[\begin{array}{lll} a_{2} & a_{1} & a_{0} \\ b_{2} & b_{1} & b_{0} \end{array}\right]\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right] [uv]=[a2b2a1b1a0b0]xy1

在这里插入图片描述

  • 旋转变换(角度 β \beta β )

正余余正符号同

  通过极坐标的关系可求得旋转矩阵 这里 β>0 为顺时针旋转
在这里插入图片描述

旋转后图像可能出现空洞点,可以将 [x y] 同时赋值给 [x+1,y] [x,y+1] 以消除空洞,这也称为插值处理。

未插值
插值处理后

拓展画布公式:
hh=floor(h*cos(a)+w*sin(a))+1;
ww=floor(h*sin(a)+w*cos(a))+1;

c2=[hh;ww]/2;
推导:
在这里插入图片描述

clear all;clc;
% close all;
im=imread('1.jpg');

%计算旋转矩阵
a=30*pi/180;
R=[cos(a) sin(a);-sin(a) cos(a)];%变换矩阵别记错了

sz=size(im);
h=sz(1);
w=sz(2);
ch=sz(3);
%旋转中心
c1=[h;w]/2;

%画布拓展
hh=floor(h*cos(a)+w*sin(a))+1;
ww=floor(h*sin(a)+w*cos(a))+1;
%新旋转中心,注意这是新画布的补偿
c2=[hh;ww]/2;

im2=uint8(zeros(h,w,3));
for k=1:ch
    for i=1:h
        for j=1:w
            p=[i;j];
            pp=round(R*(p-c1)+c2);%旋转变换
            if(1<=pp(1)&&pp(1)<=hh&&1<=pp(2)&&pp(2)<=ww)
                     im2(pp(1)+1,pp(2),k)=im(i,j,k);%插值去除空洞点
                      im2(pp(1),pp(2)+1,k)=im(i,j,k);%插值去除空洞点
                      im2(pp(1),pp(2),k)=im(i,j,k);
            end
        end
    end
end

figure;
imshow(im2);     

旋转30°效果
在这里插入图片描述
旋转超过90°会开始丢失图像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值