数字图像基础
- 参考资料
- 一、人眼视觉特性
- 二、图像基本知识
- 1.图像类别
- 2.图像输入
- 3.图像输出
- 三、图像处理
- 1.图像类型转化
- 2.图像变换
- 点变换
- 代数运算
- 几何运算
参考资料
一、人眼视觉特性
-
韦伯率:50%概率感觉到亮度变化时的 ΔII\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),线性映射显示图像
- imagesc(A) 将矩阵A中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色
- 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 :
- imshow(I):直接调用,因为当图像为double型时imshow函数会把显示范围设置成[0 , 1],这样小于0的就变成黑色了,大于1的就变成白色了,所以处理不当就会出现全白的情况。
- imshow( I/(max(I(:))):针对直接调用imshow函数出现的问题,用max(I(:) ) 对图像矩阵进行归一化再显示,这样负数部分会变黑,正数部分还可以正常显示,但有一部分信息丢失了。
- imshow(I,[low,high]):用指定的灰度范围 [low high]显示灰度图像I。显示结果,图像中灰度值等于或低于low的都将用黑色显示,而灰度值大于等于high的都显示为白色,介于low和high之间的用其灰度级的默认值的中间色调显示。如果你用了一个空矩阵([]) 来代替 [low high], imshow 函数将使用 [min(I(:))max(I(:))]作为第二个参数。imshow(gray)不等于imshow(gray,[]),后者对比度变高。
三、图像处理
1.图像类型转化
-
cat :合成图像序列
-
dither :图像抖动 印刷、视觉效果有提升,但是图像会损失一部分清晰度
-
im2bw
-
mat2gray :实现图像矩阵的归一化操作
I = mat2gray(A, [amin amax])
将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。 -
im2double
-
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作为总长度
-
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.图像变换
点变换
- 线性点运算
2. 分段线性点运算
3.非线性变换:
- 对数变换 s=c⋅log(1+r)s=c\cdot log(1+r)s=c⋅log(1+r)
- 幂次变换 s=c⋅rγs=c\cdot r ^\gammas=c⋅rγ
代数运算
1.加法运算:去除“叠加性” 噪声
gˉ(x,y)=1M∑i=1M[fi(x,y)+ei(x,y)]=f(x,y)+1M∑i=1Mei(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=1∑M[fi(x,y)+ei(x,y)]=f(x,y)+M1i=1∑Mei(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) 这种坐标变换关系称作几何变换
-
平移变换
[x1y11]=[10Δx01Δy001][x0y01]\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Δy1⎦⎤⎣⎡x0y01⎦⎤ -
水平镜像
[x1y11]=[−10w010001][x0y01]\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⎦⎤=⎣⎡−100010w01⎦⎤⎣⎡x0y01⎦⎤
w为宽 -
垂直镜像
[x1y11]=[1000−1h00−1][x0y01]\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⎦⎤=⎣⎡1000−100h−1⎦⎤⎣⎡x0y01⎦⎤
h为高 -
仿射变换
平移、比例缩放和旋转变换都是仿射变换的特殊情况
[uv]=[a2a1a0b2b1b0][xy1]\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:chfor i=1:hfor j=1:wp=[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);endendend
endfigure;
imshow(im2);
旋转30°效果
旋转超过90°会开始丢失图像。