投影与仿射 数字图像处理

2019-04-23 22:24:29 Dujing2019 阅读数 3033

数字图像处理—彩色图像处理

(一) 在 MATLAB 中彩色图像的表示

1.1 RGB图像

一幅 RGB图像就是 M×N×3 大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB 图像也可以看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。 按照惯例,形成一幅 RGB 彩色图像的三幅图像通常被称作红、绿、蓝分量图像

分量图像的数据类决定了它们的取值范围。如果一幅 RGB 图像的数据类是 double,那么取值范围就是 [0,1]。类似的,对于uint8类uint16类的 RGB图像,取值范围分别是[0,255]或[0,65535]。

用来表示这些分量图像像素值的比特数决定了一幅 RGB 图像的比特深度。例如,如果每个分量图像都是 8 比特的图像,那么对应的 RGB图像的深度就是 24 比特。通常,所有分量图像的比特数都是相同的。在这种情况下,一幅 RGB图像可能有的色彩数就是(2b2^b)的三次方,其中的 b 就是每个分量图像的比特数。对于 8 比特图像,颜色数为 16 777 216。

令 fR 、 fG 和 fB 分别表示三幅 RGB 分量图像。RGB 图像就是利用 cat(连接)操作将这些分量图像组合而成的彩色图像:

rab_image = cat(3, fR,  fG , fB) 

在运算中,图像按顺序放置。通常,cat(dim,A1,A2…)沿着由dim指定的方式连接数组 (它们必须是相同尺寸)。例如,如果dim=1,数组就垂直安排;如果dim=2,数组就水平安排; 如果dim=3,数组就按照三维方式堆叠

如果所有的分量图像都是一样的,那么结果是一幅灰度图像

令rgb_image表示一幅RGB图像,下面这些命令可以提取出三个分量图像:

fR = rgb_image(: , : , 1); 
fG = rgb_image(: , : , 2); 
FB = rgb_image(: , : , 3); 

在这里插入图片描述
编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(fR);title('(b)红色分量图');
subplot(2, 2, 3), imshow(fG);title('(c)绿色分量图');
subplot(2, 2, 4), imshow(fB) ;title('(d)蓝色分量图');  

代码运行效果如下:

编写代码:


rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
rgb_red=cat(3,fR,zeros(size(fR)),zeros(size(fR)));
rgb_green=cat(3,zeros(size(fR)),fG,zeros(size(fR)));
rgb_blue=cat(3,zeros(size(fR)),zeros(size(fR)),fB);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(rgb_red);title('(b)红色分量');
subplot(2, 2, 3), imshow(rgb_green);title('(c)绿色分量');
subplot(2, 2, 4), imshow(rgb_blue) ;title('(d)蓝色分量'); 

代码运行效果如下:

三分量组合成RGB彩色图像

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\food2.jpg');
fR = rgb_image(:, :, 1);
fG = rgb_image(:, :, 2);
fB = rgb_image(:, :, 3);
rgb_1=cat(3,fR,fB,fB);
rgb_2=cat(3,fR,fR,fG);
rgb_3=cat(3,fB,fG,fG);
subplot(2, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(2, 2, 2), imshow(rgb_1);title('(b)红绿绿分量组成的彩色图');
subplot(2, 2, 3), imshow(rgb_2);title('(c)红红绿分量组成的彩色图');
subplot(2, 2, 4), imshow(rgb_3);title('(d)绿蓝蓝分量组成的彩色图');  

代码运行效果如下:

RGB 彩色空间常常用 RGB 彩色立方体加以显示,这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)。

在这里插入图片描述
为了能从任何透视方向观测这个彩色立方体,可使用自定义函数rgbcube

rgbcube(vx,vy,vz) 

编写代码:

rgbcube(0,0,10);       %3个参数表示观看图像视角的点坐标
%rgbcube(10,10,10);    %3个参数表示观看图像视角的点坐标
axis on;grid on;
title('RGB立方体1');

代码运行效果如下:

实验总结

自然界中任何一种色光都可由R、G、B三基色按不同的比例相加混合而成,当三基色分量都为0(最弱)时混合为黑色光;当三基色分量都为k(最强)时混合为白色光。任一颜色F是这个立方体坐标中的一点,调整三色系数r、g、b中的任一系数都会改变F的坐标值,也即改变了F的色值。可以从RGB图像中提取出红、绿、蓝三个颜色的分量图像,也可由三个分量图像自由组合成彩色图,如果所有的分量图像都是一样的,那么组合结果是一幅灰度图像。从不同透视方向观测RGB彩色立方体,看到的图像是不一样的,RGB彩色空间采用物理三基色表示,因而物理意义很清楚,适合彩色显像管工作。然而这一体制并不适应人的视觉特点。因而,产生了其他不同的颜色空间表示法。

1.2 索引图像

索引图像有两个分量:整数数据矩阵 X 和彩色映射矩阵 map。矩阵 map 是 m×3 大小、由 double 类型且范围在[0,1]之间的浮点数构成的数组。map 的长度 m 等于定义的颜色数。map 的每一行都定义有单色的红、绿、蓝分量。索引图像将像素的亮度值“直接映射”到彩色值。 每个像素的颜色由对应的整数矩阵 X的值作为指向 map的索引决定。如果 X是double类型, 那么值 1 指向 map 的第一行,值 2 指向第二行,等等。如果 X是uint8或uint16类型,那么值 0 指向 map 的第一行。

有时候,用较少的颜色去近似表达索引图像是有必要的。为此,使用函数imapprox, 语法如下:

[Y, newmap] = imapprox (X, map,n) 

这个函数利用彩色映射newmap来返回数组Y,最多有n种颜色。输入数组X的类型可以 是uint8、uint16或double。如果n小于等于256,那么输出Y是uint8类;如果n大于 256,那么Y是double类。

编写代码:

RGB=imread('D:\数字图像处理\第六章学习\flower3.jpg');
[X map]=rgb2ind(RGB,256);
subplot(3, 3, 1),imshow(X,map);           %max(X(:))=255;
title('原始索引彩色图像(256色)');
[Y,newmap]=imapprox(X,map,128);%用较少的128颜色来近似一幅索引图像
subplot(3, 3, 2),imshow(Y,newmap);
title('索引图像(128色)');
[Y,newmap]=imapprox(X,map,64);%用较少的64颜色来近似一幅索引图像
subplot(3, 3, 3),imshow(Y,newmap);
title('索引图像(64色)');
[Y,newmap]=imapprox(X,map,32);%用较少的32颜色来近似一幅索引图像
subplot(3, 3, 4),imshow(Y,newmap);
title('索引图像(32色)');
[Y,newmap]=imapprox(X,map,16);%用较少的16颜色来近似一幅索引图像
subplot(3, 3, 5),imshow(Y,newmap);
title('索引图像(16色)');
[Y,newmap]=imapprox(X,map,8);%用较少的8颜色来近似一幅索引图像
subplot(3, 3, 6),imshow(Y,newmap);
title('索引图像(8色)');
[Y,newmap]=imapprox(X,map,4);%用较少的4颜色来近似一幅索引图像
subplot(3, 3, 7),imshow(Y,newmap);
title('索引图像(4色)');
[Y,newmap]=imapprox(X,map,2);%用较少的2颜色来近似一幅索引图像
subplot(3, 3, 8),imshow(Y,newmap);
title('索引图像(2色)');
[Y,newmap]=imapprox(X,map,0);%用较少的0颜色来近似一幅索引图像
subplot(3, 3, 9),imshow(Y,newmap);
title('索引图像(0色)');

代码运行效果如下:
在这里插入图片描述
在这里插入图片描述
指定彩色映射的办法有很多,一种方法就是利用如下语句:

map(k, :) = [r(k) g(k) b(k)];

其中,[r(k) g(k) b(k)]是RGB值,指定彩色映射的一行。变化的k值可将map填满。

用下面语句中的任何一条都可以把图像的背景色改成想要的颜色:

whitebg('c');   %蓝色
whitebg('y');   %黄色
whitebg('Cyan'); 
whitebg('yellow'); 
whitebg([0 1 1]);  %蓝色
whitebg([1 1 0]); %黄色

代码运行效果如下:


MATLAB提供了一些预定义的彩色映射,可用下面的指令来访问:

colormap(map_name)    %将彩色映射设定为矩阵map_name

编写代码:

colormap([spring;summer;autumn;winter])%相当于自定义了一个256*3维的colormap ,实际上spring,summer,autumn,winter,都是64*3维的colormap
x=[0 1 1 0];
y=[0 0 1 1];                           %定义四个点 [0 0] [1 0] [1 1] [0 1]
fill(x,y,[0 0.1 0.2 0.3]);             %定义四个点的C值 ,则Cmin=0,Cmax=0.3
colorbar;
map=colormap;                          %map为256*3矩阵

代码运行效果如下:

函数 描述
spring 由深红和黄色色调组成
summer 由绿色和黄色色调组成
autumn 从红色到橙色、再到黄色平缓变化
winter 由蓝色和绿色色调组成

实验总结

索引模式和灰度模式比较类似,它的每个像素点也可以有256种颜色容量,但它可以负载彩色。索引模式的图像就像是一块块由彩色的小瓷砖所拼成的,由于它最多只能有256种彩色,所以它所形成的文件相对其它彩色要小得多。索引模式的另一个好处是它所形成的每一个颜色都有其独立的索引标识。当这种图像在网上发布时,只要根据其索引标识将图像重新识别,它的颜色就完全还原了。索引模式主要用于网络上的图片传输和一些对图像像素、大小等有严格要求的地方。

1.3 处理 RGB图像和索引

下表列出了在 RGB图像、索引图像和灰度图像之间进行转换的工具箱函数。

函数 描述
Dither 采用“抖动”方法从 RGB 图像创建索引图像
grayslice 从灰度图像通过阈值处理创建索引图像
gray2ind 从灰度图像创建索引图像
ind2gray 从索引图像创建灰度图像
rgb2ind 从 RGB 图像创建索引图像
ind2rgb 从索引图像创建 RGB 图像
rgb2gray 从 RGB 图像创建灰度图像

1.函数 dither 可以用于灰度图像和彩色图像。将灰度图像转换为二值图像,将彩色图像抖动为索引图像。用于灰度图像的函数dither的语法是:

bw = dither(gray_image) 

rgb_image来表示 RGB图像,用gray_image来表示灰度图像, 用 bw 来表示黑白(二值)图像。

将灰度图像抖动为二值图像

编写代码:

f=rgb2gray(imread('D:\数字图像处理\第六章学习\cat2.jpg'));
subplot(1,2,1);
imshow(f);
title('原图');
bw=dither(f);
subplot(1,2,2);
imshow(bw);
title('将灰度图像抖动为二值图像');

代码运行效果如下:

将彩色图像抖动为索引图像

编写代码:

f=imread('D:\数字图像处理\第六章学习\sun.jpg');
subplot(1,2,1);
imshow(f);
title('原图');
x=dither(f,parula);     %colormap中自带的颜色映射-森莺
subplot(1,2,2);
imshow(x,parula);
title('将彩色图像抖动为索引图像');

代码运行效果:

2.函数grayslice使用阈值对灰度图像进行阈值处理以产生索引图像,有如下语法:

X = grayslice(gray_image, n) 

索引图像可以看做用指令 imshow(X,map)通过长度适当的映射得到的。另一种语法是:

X = grayslice(gray_image, v) 

其中,v 是矢量(值的范围为[0,1]),用来给gray_image 赋阈值。函数 grayslice 是伪彩色图像处理的基本工具,伪彩色为指定的灰度区域赋予不同的颜色。输入图像的类型可以是 uint8、uint16或double。即使输入图像的类型是uint8或uint16,v的阈值也必须在 [0,1]之间。函数执行了必要的缩放操作。

编写代码:

f=rgb2gray(imread('D:\数字图像处理\第五章学习\building.jpg'));
x=grayslice(f,16);
subplot(1,2,1);
imshow(f);
title('灰度图像'); 
subplot(1,2,2);
imshow(x,jet(16));
title('索引图像');

代码运行效果如下:

3.函数gray2ind将灰度图像I转换为索引图像,I 为原灰度图像,n 为灰度等级,默认为64,map中对应的颜色值为颜色图gray(n)中的颜色值。采用如下语法:

[X, map] = gray2ind(I ,n) 

该函数也可将二值图像BW转换为灰度图像,BW只二值图像,n 为灰度等级,默认值为2,二值图像实际上也是灰度图像,只不过灰度级为2。采用如下语法:

[X,map]=gray2ind(BW,n);

编写代码:

I=imread('D:\数字图像处理\第六章学习\face.jpg');
[Y1,map1]=rgb2ind(I,128);                  %提取原始图像的颜色映射表
X=rgb2gray(I);                              %灰度转换
[Y,map]=gray2ind(X,64);                     %灰度图像转化为索引图像
subplot(1,2,1);imshow(X);title('灰度图像');
subplot(1,2,2);imshow(Y,map);title('索引图像');

代码运行效果如下:

4.函数ind2rgb将矩阵 X 和对应的彩色映射map转换成 RGB 格式。X 可以是uint8、uint16 或double类。输出的 RGB图像是大小为 M×N×3 的double类的数组。语法为:

rgb_image = ind2rgb(X, map) 

编写代码:

I=imread('D:\数字图像处理\第六章学习\flower2.jpg');
[Y1,map1]=rgb2ind(I,128);             %提取原始图像的颜色映射表
X=rgb2gray(I);                        %灰度转换
[Y,map]=gray2ind(X,64);               %灰度图像转化为索引图像
subplot(2,2,1);imshow(I);title('原图像');
subplot(2,2,2);imshow(Y,map);title('灰度图像索引图像');
RGB=ind2rgb(Y,map1);                   %还原转化为索引图像以后的RGB
subplot(2,2,3);imshow(RGB);title('转换后的索引转RGB图像');
RGB1=ind2rgb(X,map1);                  %还原转化为索引图像以后的RGB
subplot(2,2,4);imshow(RGB1);title('原灰度矩阵索引转RGB图像');

代码运行效果如下:

(二)彩色空间之间的转换

在一幅 RGB图像中,工具箱直接把颜色描述成 RGB值,或者在索引图像中间接地用 RGB格式来存储彩色映射。 然而,还有其他的彩色空间(又被称作彩色模型),它们在应用中的使用可能比 RGB更方便或更恰当。这些模型是 RGB 模型的变换,包括 NTSC、YCbCr、HSV、CMY、CMYK 和 HSI 彩色空间。工具箱提供了从 RGB 向 NTSC、YCbCr、HSV、CMY 彩色空间转换或转换回来的函数。

2.1 NTSC彩色空间

NTSC 彩色空间用于模拟电视。这种格式的主要优势是灰度信息和彩色数据是分离开来的, 所以同一信号可以用于彩色电视机和黑白电视机。在 NTSC 格式中,图像数据由三部分组成: 亮度(Y)、色调(I)和饱和度(Q)。YIQ分量都是用线性变换从一幅图像的 RGB分量得到的:
在这里插入图片描述
注意: 第一行的各元素之和为 1,而下两行元素的和为 0。这和预想的一样,因为对于一 幅灰度图像,所有的 RGB分量都是相等的;所以对于这样的图像来说,I 和 Q分量应该是 0

获取图像的亮度,色度,饱和度

编写代码:

yiq_image=imread('D:\数字图像处理\第六章学习\flower3.jpg');
fY = yiq_image(:,:,1);
fI = yiq_image(:,:,2);
fQ = yiq_image(:,:,3);
subplot(2, 2, 1), imshow(yiq_image);title('(a)原图像');
subplot(2, 2, 2), imshow(fY);title('(b)亮度');
subplot(2, 2, 3), imshow(fI);title('(c)色度');
subplot(2, 2, 4), imshow(fQ) ;title('(d)饱和度'); 

代码运行效果如下:

函数rgb2ntsc可执行前边的变换:

yiq_image = rgb2ntsc(rgb_image) 

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\baby.jpg');
yiq_image = rgb2ntsc(rgb_image);
imshow(yiq_image);
subplot(1, 2, 1), imshow(rgb_image);title('(a)原图像');
subplot(1, 2, 2), imshow(yiq_image);title('(b)输出图像');

代码运行效果如下:


其中,输入的 RGB图像可以是uint8、uint16或double类。输出图像是大小为 M×N×3 的 double 类数组。类似的,RGB分量可以利用下面的线性变换从 YIQ分量得到:
在这里插入图片描述
工具箱函数ntsc2rgb执行这个变换,语法是:

rgb_image = ntsc2rgb(yiq_image) 

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\flower3.jpg');
rgb_image = rgb2ntsc(rgb_image);
f = ntsc2rgb(rgb_image);
imshow(yiq_image);
subplot(1, 2, 1), imshow(rgb_image);title('(a)NTSC空间图像');
subplot(1, 2, 2), imshow(f);title('(b)RGB空间图像');

代码运行情况如下:


输入和输出图像都是double类。

2.2 YCbCr 彩色空间

YCbCr 彩色空间广泛用于数字视频。在这种格式中,亮度信息用单独的分量 Y来表示,彩色信息是用两个色差分量 Cb 和 Cr来存储的。分量 Cb蓝色分量与参考值的差,分量 Cr红色分量与参考值的差。工具箱采用的从 RGB转换为 YcbCr 的变换是:

在这里插入图片描述
转换函数是:

ycbcr_image = rgb2ycbcr(rgb_image)

输入的 RGB 图像可以是 uint8、uint16 或 double类。输出图像和输入图像的类型相同。使用类似的变换可以从 YCbCr 转换回 RGB:

rgb_image = ycbcr2rgb(ycbcr_image) 

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\Pig2.jpg');
ycbcr_image = rgb2ycbcr(rgb_image)
f = ycbcr2rgb(ycbcr_image) 
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(ycbcr_image);title('(b)RGB空间图像转换为 YCbCr 图像');
subplot(1, 3, 3), imshow(f);title('(c)YCbCr 图像转换为RGB空间图像');

代码运行情况如下:
在这里插入图片描述
在这里插入图片描述
输入的 YCbCr 图像可以是 uint8、uint16 或 double 类。输出图像和输入图像的类型相同。

2.3 HSV彩色空间

HSV(色调、饱和度、值)是人们用来从颜色轮或调色板中挑选颜色(例如颜料或墨水)时使用的彩色系统之一,值得考虑的是,这个颜色系统比 RGB 系统更接近人们的经验和对彩色的感知。HSV颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1。它包含RGB模型中的R=1,G=1,B=1三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于角度0°,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180°。饱和度S取值从0到1,所以圆锥顶面的半径为1。
在这里插入图片描述

从 RGB 到HSV 的转换

数学公式推算

设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,计算为:

max=max(R,G,B)
min=min(R,G,B)
if R = max, H = (G-B)/(max-min)
if G = max, H = 2 + (B-R)/(max-min)
if B = max, H = 4 + (R-G)/(max-min)

H = H * 60
if H < 0, H = H + 360

S=(max-min)/max
V=max(R,G,B)

注意:h 的值通常规范化到位于 0 到 360°之间。而 h = 0 用于 max = min 的(就是灰色)时候而不是留下 h 未定义。

从 HSV 到 RGB 的转换

数学公式推算

类似的,给定在 HSV 中 (h, s, v) 值定义的一个颜色,带有如上的 h,和分别表示饱和度和明度的 s 和 v 变化于 0 到 1 之间,在 RGB 空间中对应的 (r, g, b) 三原色可以计算为:
在这里插入图片描述在这里插入图片描述
将 RGB转换为 HSV的 MATLAB函数是rgb2hsv,语法如下:

hsv_image = rgb2hsv(rgb_image) 

输入的 RGB图像可以是uint8、uint16或double类,输出图像是double类。将 HSV 转换回 RGB的函数为hsv2rgb,语法如下:

rgb_image = hsv2rgb (hsv_image) 

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\flower5.jpg');
hsv_image = rgb2hsv(rgb_image)
f = hsv2rgb(hsv_image) 
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(hsv_image);title('(b)RGB空间图像转换为HSV图像');
subplot(1, 3, 3), imshow(f);title('(c)HSV图像转换为RGB空间图像');

代码运行效果如下:

在这里插入图片描述在这里插入图片描述
上面图片只是简单的转换,看不出来HSV图像的优势,下面进行图像颜色调整

编写代码

h = input('Adjust hue by: ');        % 输入色度调整参数h
s = input('Adjust saturation by: ');        % 输入饱和度调整参数s
v = input('Adjust intensity by: ');        % 输入明度调整参数v

I = imread('D:\数字图像处理\第六章学习\flower4.jpg');    % 读取源图像并显示
figure(1);
imshow(I);title('(a)原图像');
% HSV颜色空间处理
hsv_image = rgb2hsv(I);        % 将rgb颜色空间转换为hsv颜色空间
hue = hsv_image(:,:,1);        % 提取色度通道
sat = hsv_image(:,:,2);        % 提取饱和度通道
int = hsv_image(:,:,3);        % 提取明度通道

hue = hue + 1 / 360 * h;    % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * v;

%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;

hsv_image(:,:,1) = hue;        % 运算后的各通道返回原图
hsv_image(:,:,2) = sat;
hsv_image(:,:,3) = int;

% matlab 无法直接显示hsv和hsi图像,还要先转换为rgb
rgb = hsv2rgb(hsv_image);    % 将hsv颜色空间转换为rgb颜色空间,并显示
figure(2);
imshow(rgb);title('(b)HSV颜色空间处理后的图像');

代码运行效果如下:

实验总结

HSV(Hue Saturation Value)颜色模型是面向用户的。在图像处理中,通常情况下不会直接对RGB图像做处理,这主要是因为RGB与人类的视觉感知相差较远,而HSV就是常用的色彩空间。比如,某些由于光照不同造成的视觉感知不同的场景下,通常用Value这个通道进行计算,通过计算梯度,可以较好的提取物体边缘。再比如某些场景下,前景饱和度较高,背景采用饱和度较低的颜色来衬托前景,这时Saturation这个通道的信息就非常有用了。再比如,在某些室内场景下,风格较为单一,一般一个物体只有一种颜色,这时候Hue这个通道就显得尤为重要了。总之,HSV色彩空间在图像处理领域应用非常广泛,一般通过采用合适的通道就能完成大多数图像预处理工作。从上图(西湖荷花)也可以看出进行了色度,明度,饱和度的调整,图像变得更加鲜艳,接近物体本来的色彩,更符合人的视觉。

2.4 CMY和 CMYK

CMY(青,深红,黄)通过颜色相减来产生其他颜色的。大多数将颜料堆积于纸上的设备,比如彩色打印机和复印机,都需要 CMY 数据输入,或在内部将 RGB转换为 CMY,近似的转换可用下面的公式实现:
在这里插入图片描述
其中,假想所有的颜色值都已经归一化在[0,1]之间。这个公式证明从涂满纯青色的表面反射的光不包含红色(公式中的 C = 1–R )。同样,纯净的紫红色不反射绿色纯净的黄色不反射蓝色。上述公式还证明,从 1 减去个别的 CMY 值,可以从一组 CMY 值很容易地获得 RGB值。

imcomplement函数可近似地把 RGB模型转换为 CMY模型:

cmy_image = imcompliment(rgb_image) 

也可以用这个函数将 CMY图像转换为 RGB图像:

rgb_image = imcompliment(cmy_image) 
rgb_image=imread('D:\数字图像处理\第六章学习\flower5.jpg');
hsi_image = imcomplement(rgb_image);
j=imcomplement(hsi_image);
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(hsi_image);title('(b)RGB空间图像转换为CMY图像');
subplot(1, 3, 3), imshow(j);title('(c)CMY图像转换为RGB空间图像');

在这里插入图片描述
在理论上,等量的颜料原色,将青色、紫红色和黄色混合会产生黑色。在实践中,将这些颜色混合印刷会生成模糊不清的黑色。所以,为了生成纯正的黑色(打印中主要的颜色),第 4 种颜色——黑色便添加进来了,从而给出提升的 CMYK彩色模型。这种模式的文件大,占用的磁盘和内存大,一般在印刷时使用。

2.5 HSI彩色空间

HSI(色彩、饱和度、强度),该模型将强度分量与从一幅彩色图像中承载的彩色信息分开。正如结果那样,HSI 模型是开发基于彩色描述的图像处理算法的理想工具

1.将颜色从 RGB 转换为 HSI

每个 RGB像素的 H分量可用下面的公式得到:
在这里插入图片描述
其中:
在这里插入图片描述
饱和度由下面的式子给出:
在这里插入图片描述
最后,亮度由下面的式子给出:
在这里插入图片描述
将从 H 的公式中得出的所有结果除以 360°,即可将色调归一化在[0,1]之间。 如果给出的 RGB值在[0,1]之间,那么其他的两个 HSI 分量就已经在[0,1]之间了。

下面是惯用的函数:

hsi = rgb2hsi(rgb) 

编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\sun.jpg');
hsi_image = rgb2hsi(rgb_image)
subplot(1, 2, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 2, 2), imshow(hsi_image);title('(b)RGB空间图像转换为HIS图像');

代码运行效果如下:

2.将颜色从HSI 转换为RGB

有三个感兴趣的部分,正如早些时候提到的那样,分别对应原色之间相隔 120° 的范围。用 360°乘以 H,这样就将色调的值还原成了原来的范围——[000^0,36000^0]。

RG区域(000^0≤H≤36000^0)如果 H在这个区域内,那么 RGB分量由下式给出:

在这里插入图片描述

在这里插入图片描述
GB区域 (12000^0≤H<24000^0)如果给出的H值在这个区域内,我们就先从中减去120°:
在这里插入图片描述
那么,这时 RGB分量是:
在这里插入图片描述
并且
在这里插入图片描述
BR 区域(240°≤H≤360°) 最后,如果 H在这个区域内,我们就从中减去 240°:
在这里插入图片描述
RGB分量分别是:
在这里插入图片描述
其中:
在这里插入图片描述

在这里插入图片描述
编写代码:

rgb_image=imread('D:\数字图像处理\第六章学习\building.jpg');
hsi_image = rgb2hsi(rgb_image);
j = hsi2rgb(hsi_image);
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的RGB图像');
subplot(1, 3, 2), imshow(hsi_image);title('(b)RGB空间图像转换为HIS图像');
subplot(1, 3, 3), imshow(j);title('(c)HIS图像转换为RGB空间图像');

代码运行效果如下:
在这里插入图片描述
在这里插入图片描述
上面图片只是简单转换,看不出来HSI图像的优势,下面进行图像颜色调整:

编写代码:

h = input('Adjust hue by: ');        % 输入色度调整参数h
s = input('Adjust saturation by: ');        % 输入饱和度调整参数s
i = input('Adjust intensity by: ');        % 输入强度调整参数i

I = imread('D:\数字图像处理\第六章学习\flower4.jpg');    % 读取源图像并显示
figure(1);
imshow(I);title('(a)原图像');
% HSI颜色空间处理
hsi_image = rgb2hsi(I);        % 将rgb颜色空间转换为hsi颜色空间
hue = hsi_image(:,:,1);        % 提取色度通道
sat = hsi_image(:,:,2);        % 提取饱和度通道
int = hsi_image(:,:,3);        % 提取明度通道

hue = hue + 1 / 360 * h;       % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * i;

%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;

hsi_image(:,:,1) = hue;        % 运算后的各通道返回原图
hsi_image(:,:,2) = sat;
hsi_image(:,:,3) = int;

rgb = hsi2rgb(hsi_image);    % 将hsi颜色空间转换为rgb颜色空间,并显示
figure(3);
imshow(rgb);title('(b)hsi颜色空间转换后的图像');

代码运行效果如下:

实验总结

由图可以明显看出HSI模型相对于RGB模型更适宜用于彩色图像的增强,完全反映了人感知颜色的基本属性,与人感知颜色的结果一一对应,因此,HSI模型被广泛应用于人的视觉系统感知演的的图像表示和处理系统中。并且在处理彩色图像时,可仅对I分量进行处理,结果不改变原图像中的彩色种类,所以HSI 模型是开发基于彩色描述的图像处理算法的理想工具

2.6 独立于设备的彩色空间

彩色空间以使计算更方便的方法描述了彩色信息,或以对特殊应用更直观或更合适的方法描述彩色。迄今为止讨论的所有空间都与设备相关。下面集中讨论独立于设备的彩色空间。

2.6.1 背景

通常,在辨别不同颜色时使用的特征是亮度、色调和饱和度。亮度具体表达无色的强度的概念,色调是在光波混合中与主要波长相关的属性,色调描述了观察者感知的主要彩色,饱和度指的是相对纯度或与色调相混合的白光数量。

色调和饱和度合起来称为颜色,因此,彩色是由颜色和亮度表现的特性。为形成一种特殊颜色而需要的红、绿、蓝颜色叫做三色值,分别用 X、Y、Z 来表示。颜色是由颜色自身的三色系数来指定的,定义为:
在这里插入图片描述
并且:
在这里插入图片描述
其中,x、y 和 z 分别表示红、绿、蓝分量。在可见光谱中,光的任何波长均可产生与那个波长相对应的三色值。以 x 和 y 为参数的函数显示人能感觉到的颜色范围的图被称为色度图。在色度图中,连接任意两个点的直线段说明了所有不同的颜色变化,可以由相加的两种颜色混合得到。由任何三个固定颜色处的顶点形成的三角形不能包括图中的全部颜色区域,所以任何颜色都可从确定的三原色产生是误解

2.6.2 sRGB 彩色空间

RGB彩色模型依赖于设备。这意味着对于给定的一组 R、 G、B 值,不存在单一、明确的彩色解释。另外,图像文件常常不包含获取图像时所用设备的彩色特性信息。就像结果那样,相同的图像文件可能(经常就是)在不同的计算机系统中看上去明显不同。

解决这个问题,微软和惠普提出了新的默认彩色空间标准,称作 sRGB。sRGB 彩色空间被设计为与计算机的CRT监视器标准特性相一致,并且与PC机在家庭和办公室观察环境相一致。 sRGB彩色空间独立于设备。因此,sRGB颜色值很容易被改变为另一个独立于设备的彩色空间。

sRGB 标准已变成计算机界广泛接受的标准,特别是面向消费者的设备。数字摄像机、扫 描仪、计算机显示器和打印机等,都例行地被设计为假定图像的 RGB值与 sRGB的彩色空间是一致的,除非图像文件包含更多的指定设备的彩色信息。

2.6.3 CIE 和 sRGB 彩色空间之间的转换

工具箱函数 makecform 和 applycform 可用于独立于设备的彩色空间之间的转换。

以Lab彩色空间为基础创建在感觉上的一致彩色空间

构建一个彩色标尺,可用于彩色和黑色出版物,设计在40和80之间的间隔相等的估值为1024的斜坡;

编写代码:

L=linspace(40,80,1024);
radius=70;
theta=linspace(0,pi,1024);
a=radius*cos(theta);
b=radius*sin(theta);
%我们制作一幅 L*a*b* 彩色标尺的 100×104×3 大小的图像: 
L=repmat(L,100,1);  
a=repmat(a,100,1);
b=repmat(b,100,1);
lab_scale=cat(3,L,a,b);
cform =makecform('lab2srgb');
rgb_scale= applycform(lab_scale,cform);
imshow(rgb_scale);

代码运行效果如下:
在这里插入图片描述
图为 基于 Lab*彩色空间的在感觉上一致的标尺 。

2.6.4 ICC彩色剖面

每一个设备正好有两个与之关联的变换,而不管在系统中可能存在的其他设备的数量。其中的一个变换把设备彩色转换为标准,独立于设备的彩色空间叫做剖面连接空间(Profile Connection Space, PCS)。另一个变换是第一个变换的反变换,用来把 PCS彩色转换回设备彩色(PCS不是 XYZ, 就是 Lab*)。这两个变换合起来构成设备的 ICC 彩色剖面

ICC 的主要目的之一是创建标准化的、维护和提升 ICC彩色剖面的标准。图像处理工具箱 函数iccread读取剖面文件,语法是:

p = iccread(filename) 

输出p是包含文件头信息和数字参数,以及计算设备和PCS间彩色空间转换所必需的表格。 使用 ICC 剖面转换彩色是通过使用makecform和applycform实现的。 makecform的语法是:

cform = makecform('icc', src_profile, dest_profile) 

其中,src_profile是源设备剖面的文件名,dest_profile是目的设备剖面的文件名。

ICC 彩色剖面的软实验

编写代码:

f=imread('D:\数字图像处理\第六章学习\girl.png');
fp = padarray(f, [40 40], 255, 'both'); 
fp = padarray(fp, [4 4], 230, 'both'); 
p_srgb = iccread('E:\Code\sRGB.icm');           %描述sRGB彩色空间的剖面
p_snap = iccread('E:\Code\SNAP2007.icc');       %新闻纸剖面
cform1 = makecform('icc', p_srgb, p_snap); 
fp_newsprint = applycform(fp, cform1); 
cform2 = makecform('icc', p_snap, p_srgb,  'SourceRenderingIntent', 'AbsoluteColorimetric', 'DestRenderingIntent', 'AbsoluteColorimetric'); 
fp_proof = applycform(fp_newsprint, cform2);   %指定渲染意图
subplot(1, 2, 1), imshow(fp);title('(a)具有白边的原始图像');
subplot(1, 2, 2), imshow(fp_proof);title('(b)当在新闻纸上打印时对图像外观的模拟 ');

代码运行效果如下:

实验总结

实验中首先用环绕图像的拥有粗白边和细灰边的边界对图像做预处理。这些边界将使得更容易观察对新闻用纸“白”度的模拟,图(a)显示了填充的图像,然后读进两个剖面并用它们把虹膜图像从 sRGB转换为新闻纸颜色,最后用绝对色度的渲染意图创建cform结构,以便为了显示而将之转换回 sRGB,图 (b)显示了结果。这幅图像本身仅是在计算机监视器上看到的实际结果的近似,因为印刷书籍的彩色全域与监视器的彩色全域不同。

(三)彩色图像处理的基础知识

彩色图像处理细分成 3 个主要领域:

  1. 颜色变换(也叫彩色映射)
  2. 单独彩色平面的空间处理
  3. 颜色向量的处理

第 1 类处理每个彩色平面的像素,这类处理严格地以像素值为基础,而不是它们的空间坐标,类似于灰度变换处理。第 2 类处理涉及各个彩色平面的空间(邻域)滤波, 类似于空间滤波。第 3 类处理涉及以同时处理彩色图像的所有分量为基础的处理技术。因为全彩图像至少有三个分量,彩色像素可以用向量来处理。

令 c 代表 RGB彩色空间中的任意向量:
在这里插入图片描述
这个公式指出,c 分量是一副彩色图像在某个点上的 RGB分量。考虑彩色分量是坐标的函数这样的事实,用下边的符号表示:
在这里插入图片描述
对于一幅大小为 M×N 的图像,有 MN 个这样的向量 c(x,y),其中,x=0,1,2…,M–1 且 y=0,1,2…,N–1。

在某些情况下,无论彩色图像每次处理一个平面,还是作为向量处理,都会得到相等的结果。然而,不会总是这样的情况。为了使两种方法都相同, 两个条件必须满足:首先,处理必须对向量和标量都可用。其次,针对向量的每个分量的操作必须与其他分量无关

(四)彩色变换

这里描述的是单一彩色模型情况下的技术,以处理彩色图像的彩色分量或单色图像的亮度分量为基础。对于彩色图像,限定如下形式的变换:

si = Ti(ri) i = 1,2,…,n

这里,ri 和 si 是输入和输出图像的彩色分量,n 是 ri是彩色空间的维数(或是彩色分量的数量),并且 Ti 是全彩色变换(或叫映射)函数。如果输入图像是单色的,公式将如下所示:

si = Ti( r ) i = 1,2,…,n

r表示灰度级的值,n 是在 Si中彩色分量的数量。这个公式描述了灰度级对任意颜色的映射,这一处理在伪彩色变换或伪彩色映射中经常提到。 注意,如果我们让 r1=r2=r3=r,第一个公式可用来处理 RGB中的单色图像。

三次样条内插用spline函数来实现:

Z = spline(x,y,xi) 

编写代码:

x=0:10;
y=sin(x);
subplot(121),plot(x,y,'+',x,y,'r');%画xy图像,并标出x和y点
xx=0:.25:10;
yy=spline(x,y,xx);
subplot(122),plot(x,y,'o',xx,yy,'b');%也是画xy图像,标出x和y点,但是这中间插值了隔.25的数,只是没被标出来

代码运行效果如下:

变换函数的说明可以用图形法操作控制点的方式交互地产生,那些控制点输入到 interpiq和spline函数并实时地显示将被处理的图像的结果。语法是:

g = ice('property name', 'property value',…) 

最后的结果是带有句柄的图像g(通常是图形目标)。

编写代码:

f=imread('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f);

代码运行效果如下:

编写代码:

f=imread('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f,'space','CMY');%修改CMY彩色空间

代码运行效果如下:

编写代码:

f=imread('D:\数字图像处理\第六章学习\cat5.jpg');
g=ice('image',f,'space','hsi');

代码运行效果如下:

‘space’是被修改的分量彩色空间。可能的值是’rgb’、‘cmy’、‘hsi’、‘hsv’、‘ntsc’(或’yiq’)和’ycbcr’,默认值是’rgb’ 。

2019-06-08 12:59:38 weixin_37545024 阅读数 785

本文在撰写过程中参考了由何东健教授主编、西安电子科技大学出版社出版的《数字图像处理》(第三版),一切著作权归原书作者和出版社所有。特别感谢长安大学软件系老师的认真负责的教导。

第1章 概论

1.1 数字图像处理及其特点

1、数字图像与图像处理
区分模拟图像与数字图像。
数字图像处理:利用计算机对图像进行去噪、增强、复原、分割、特征提取、识别等的理论、方法和技术。
2、数字图像处理的特点:
处理精度高、易于控制处理效果、处理的多样性、图像数据量大、处理费时、综合性强

1.2 图像处理的目的及主要内容

1、数字图像处理的目的
提高图像的视感质量、特征信息的提取、图像数据变换、编码和压缩
2、数字图像处理的主要内容
图像获取、表示和表现,复原,增强,分割,分析,重建、压缩编码

1.3 数字图像处理的应用(略)

第2章 数字图像处理基础

2.1 图像数字化技术

数字图像处理的先决条件:连续图像离散化。
图像的数字化包括采样和量化两个过程。
连续图像数字化的结果是图像矩阵,每一个元素称为像素、像元或图像元素。
采样方法:正方形采样、三角形采样、正六角形采样
1、采样
采样:图像在空间上的离散化,即用采样点的灰度值代替图像。
采样方法:先垂直采样,在水平采样。对于视频,先对时间采样,再沿垂直方向采样,最后沿水平方向采样。
一维采样定理:若一维信号的g(t)的最大频率为ω,则采样周期小于等于1/(2ω),则能够根据采样频结果完全恢复图像。
2、量化
量化:把采样得到的各像素点的灰度值从模拟量到离散量的转换称为图像灰度的量化,转换前的灰度值称为连续灰度值,转换后的灰度值称为量化灰度值,量化灰度值与连续灰度值的差的绝对值称为量化误差。
量化方法:等间隔量化(均匀量化、线性量化)、非等间隔量化。
非等间隔量化是根据图像灰度值分布的概率密度函数,按总量化误差最小的原则来进行量化的。具体做法是“高概率细分,低概率粗分”。
3、采样与量化参数的选择
图像存储大小=采样数×量化灰度值位数(bit)
低采样数导致马赛克,低量化级数导致假轮廓。
采样原则:
缓变——细量化、粗采样
细节丰富——粗量化、细采样
4、图像数字化设备
组成:采样孔、图像扫描机构、光传感器、量化器、输出储存装置
性能指标:像素大小、量化位数(颜色元数)、图像尺寸、线性度、噪声

2.2 色度学基础与颜色模型

1、色度学基础
视杆细胞辨亮度,视锥细胞辨颜色,RGB光的三原色
颜色属性:色调、饱和度、亮度
2、颜色模型
计算颜色模型:RGB、CIE XYZ、Lab
视觉颜色模型:HSI、HSV、HSL
工业颜色模型:CMYK、YUV、YCbCr
(1)RGB模型
在这里插入图片描述
(2)CIE XYZ模型
F=x•X+y•Y+z•Z, x=X/(X+Y+Z), y=Y/(X+Y+Z), z=Z/(X+Y+Z)
(3)Lab颜色模型
具有设备无关性,L表示亮度分量,a、b为色度分量,其中a正向绝对值越大表示越红,负向绝对值越大表示越绿;b正向绝对值越大表示越黄,负向绝对值越大表示越蓝。
(4)HSI颜色模型
色调H:反应颜色的种类(波长)
饱和度S:表示颜色的深浅
强度I:亮度/灰度
(5)CMY与CMYK颜色模型
(C,M,Y)=(1,1,1)-(R,G,B)
在这里插入图片描述
(6)YUV电视信号彩色坐标系统
Y表示亮度信号,U、V表示色差
(7)YCbCr模型
由亮度Y,色差Cb、Cr组成,但充分考虑RGB分量在视觉感受中的不同重要性。
3、颜色变换
颜色变换模型:g(x, y) = T[ f(x, y) ]
颜色变换关系:si = Ti [r1, r2, r3, … ,rn], i = 1, 2, … , n
彩色切片:识别目标颜色分离出来

2.3 数字图像类型

矢量图:数学公式描绘图像,存储量小,图像清晰度与分辨率无关,缺点是单调且不真实
位图:像素点阵表示图像,每个像素点具有颜色和位置属性,分为线画稿、灰度图像、索引颜色图像、真彩色图像
1、位图
线画稿:二值图像
灰度图像:介于黑色与白色之间的多级灰度
索引颜色:选择一些颜色,然后编号,用编号作为颜色的索引
真彩色图像:RGB颜色
2、位图有关术语
像素:显示器显示图像的基本单位
样点:将原图像网格化,用样点代替网格中所有点
分辨率:单位长度像素数,按照像素的来源分为图像分辨率屏幕分辨率、打印机分辨率、扫描仪分辨率

2.4 图像文件格式

BMP图像文件格式:
(1)四部分组成:位图文件头、位图信息头、调色板、图像数据
(2)字节对齐,4byte整数倍
(3)上下倒置存放
其他文件格式略

2.5 OpenCV编程简介

OpenCV = Open Source Computer Vision Library
1、OpenCV简介 不考
2、OpenCV的安装与配置 不考
3、OpenCV的数据结构 不太可能考
二维点、三维点、Size_、Rect_、RotatedRect、Matx、Vec、Scalar_、Range、Mat
4、读入、显示和存储图像

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(){
	Mat image, result;
	cout << "size: " << image.size().height() << " , " << image.size().width << endl;
	image = imread("tiger.jpg");
	if(!image.data){
		cout << "read image file failed!" << endl;
	}
	namedWindow("Original Image");
	imshow("Original Image", image);
	flip(image, result,1);
	namedWindow("Output Image");
	imshow("Output Image", result);
	imwrite("output.bmp", result);
	waitKey(0);
	return 0
}

5、操作图像像素
(1)at方法

void colorReduce(Mat& inputImage, Mat& outputImage, int div){
	outputImage = inputImage.clone();
	int rows = outputImage.rows;
	int cols = outputImage.cols;
	for(int i=0;i<rows;i++){
		for(int j=0;j<cols;j++){
			outputImage.at<Vec3b>(i,j)[0] = outputImage.at<Vec3b>(i,j)[0]/div*div+div/2;
			outputImage.at<Vec3b>(i,j)[1] = outputImage.at<Vec3b>(i,j)[1]/div*div+div/2;
			outputImage.at<Vec3b>(i,j)[2] = outputImage.at<Vec3b>(i,j)[2]/div*div+div/2;
		}
	}
}

(2)使用迭代器

void colorReduce(Mat& inputImage, Mat& outputImage, int div){
	outputImage = inputImage.clone();
	Mat_<Vec3b>::iterator it = inputImage.begin<Vec3b>();
	Mat_<Vec3b>::iterator it = inputImage.end<Vec3b>();
	Mat_<Vec3b> cimage = outputImage;
	Mat_<Vec3b>::iterator itout = cimage.begin();
	Mat_<Vec3b>::iterator itoutend = cimage.end();
	for(; it != itend; it++,itout++){
		(*itout)[0]=(*it)[0]/div*div+div/2;
		(*itout)[1]=(*it)[1]/div*div+div/2;
		(*itout)[2]=(*it)[2]/div*div+div/2;
	}
}

(3)使用指针

void colorReduce(Mat& inputImage, Mat& outputImage, int div){
	outputImage = inputImage.clone();
	int rows = outputImage.rows;
	int cols = outputImage.cols;
	if(outputImage.isContinuous()){
		cols = cols * rows;
		rows = 1;
	}
	for(int i=0;i<rows;i++){
		uchar * dataout = outputImage.ptr<uchar>(i);
		for(int j=0;j<cols;j++){
			dataout[j] = dataout[j]/div*div+div/2;
		}
	}
}

注意:OpenCV中的彩色图像不是以RGB顺序存放的,而是以BGR顺序存放的。
4、整行整列像素值的赋值

img.row(i).setTo(Scalar(255));
img.col(i).setTo(Scalar(255));

6、图形交互和媒体接口HighGui 不太可能考

第3章 图像增强

图像增强的目的:改善图像的视觉效果,或使图像更适合于人或机器的分析处理。减少图像噪声,提高目标与背景的对比度,强调或抑制图像中的某些细节。
图像增强的方法:空域法、频域法,空域法又可以分为点处理和区处理,频域增强可以分为低通滤波、高通滤波、带通滤波、带阻滤波和同态滤波。

3.1 灰度变换

灰度变化模型:g(x, y) = T[ f(x, y) ]
区处理:灰度变换操作在像素的邻域内进行,区处理一般基于模板卷积实现,因此又称为模板操作或空域滤波。
常见的灰度变换方法:直接灰度变换法、直方图修正法。直接灰度变换法包括线性、分段线性以及非线性变换;直方图修正法可以分为直方图均衡化和直方图规定化。
1、灰度线性变换
在这里插入图片描述
2、分段线性变换
在这里插入图片描述
3、非线性变换
在这里插入图片描述
在这里插入图片描述

3.2 直方图修正

1、直方图的基本概念
灰度直方图是图像量化灰度值的频数分布直方图或频率分布直方图。
2、直方图的性质
(1)丢失位置信息,保留统计信息
(2)图像与灰度直方图是一对多的关系
(3)灰度直方图具有可加性
3、直方图的计算
(1)初始化:数组零值初始化
(2)统计:将量化灰度值映射为数组下标,遍历图像将对应数组元素的值++
(3)归一化:数组所有元素除以像素总数
也可以像素值沿水平轴划分为若干子区间称为箱格,从而简化计算。
4、直方图均衡化
(1)基本思想:把原始图像的直方图变换为均匀分布的形式,从而增加图像灰度的动态范围,以达到增强图像对比度的效果。经过均衡化处理的图像,其灰度级出现的概率相同,此时图像的熵最大,图像包含的信息量最大。
(2)推导
s=T(r)s=T(r)
s和r分别为灰度变换前后的灰度级,T(r)T(r)单调递增且有界[0,1]
η=T(ξ)η=T(ξ),则有
Fη(s)=P(η&lt;s)=P(ξ&lt;r)=rPr(x)dxF_{η}(s) = P(η&lt;s) = P(ξ&lt;r) = \int_{-\infty}^{r}P_{r}(x)dx
对两边同时求导得
ps(s)=[pr(r)drds]r=T1(s)p_{s}(s)=[p_{r}(r)•\frac{\mathrm{d} r}{\mathrm{d} s}]_{r=T^{-1}(s)}
若要使变换后的图像灰度s为均匀分布,即有
ps(s)=1p_s(s)=1
代入上式有
ds=pr(r)dr\mathrm{d} s=p_r(r)\mathrm{d}r
两边同时积分有
T(r)=s=0rpr(ω)dωT(r)=s=\int_0^rp_r(ω)\mathrm{d}ω
其中0rpr(ω)dω\int_0^rp_r(ω)\mathrm{d}ω是r的累计分布函数。
容易证明,以CDF为灰度变换函数,可得到灰度分布均匀的图像。
(3)数字图像的直方图均衡化

k rk nk pr=T(rk) sk=int[(L-1)sk+0.5] s rk->sk ps(sk)
0 0 790 0.19 0.19 0.19→1 0→1 -
1 1 1023 0.25 0.44 0.144→3 1→3 0.19
2 2 850 0.21 0.65 0.65→5 2→5 -
3 3 656 0.16 0.81 0.81→6 3→6 0.25
4 4 329 0.08 0.89 0.89→6 4→6 -
5 5 245 0.06 0.95 0.95→7 5→7 0.21
6 6 122 0.03 0.98 0.98→7 6→7 0.24
7 7 81 0.02 1 1→7 7→7 0.11

简并:频数较低的灰度级被归并为一个新的灰度级上,使得变换过后的灰度级的数量减少了,这种现象称为简并。简并现象增大了灰度级的间隔,增加了图像对比度,可以看清更多的细节。
理论上,直方图均衡化的结果应该是平坦的,但由于不能将同一灰度级的像素映射到不同的灰度级,因而实际结果只是近似均衡。
5、直方图规定化
直方图规定化:实际应用中希望将直方图变换为某个特定的形状,从而有选择地增强某个灰度范围内的对比度,这种方法就称为直方图规定化。
直方图规定化的步骤:
第一步,对原始直方图进行均衡化,得到映射关系1;
第二步,对规定直方图进行均衡化,得到映射关系2;
第三步,按照单映射规则或组映射规则,根据映射关系1和映射关系2得到最终的映射关系。

rk,zl pr(rk) pz(zl) sk=T(rk) vl=G(zl) 单映射rk→zl 单映射ps(sk) 组映射rk→zl 组映射ps(sk)
0 0.19 - 0.19 - r0→r3 0 r0→r3 0
1 0.25 - 0.44 - r1→r3 0 r1→r5 0
2 0.21 - 0.65 - r2→r5 0 r2→r5 0
3 0.16 0.2 0.81 0.2 r3→r5 0.44 r3→r7 0.19
4 0.08 - 0.89 - r4→r7 0 r4→r7 0
5 0.06 0.5 0.95 0.7 r5→r7 0.37 r5→r7 0.46
6 0.03 - 0.98 - r6→r7 0 r6→r7 0
7 0.02 0.3 1 1 r7→r7 0.19 r7→r7 0.35

单映射:对于每一个sk找距离它最近的vl
组映射:对于每一个vl找距离它最近的sk,作为分组依据(分界值归到左侧区间),再进行组映射。

3.3 图像平滑

目的:消噪或模糊图像,去除小的细节或弥合目标间的缝隙。
低频代表信号缓慢变化的部分,高频代表迅速变化的部分;图像边缘、跳跃以及噪声等灰度变化剧烈的部分代表图像的高频分量,灰度变化缓慢的部分代表图像的低频分量。
1、图像噪声
(1)噪声分类
外部噪声和内部噪声
平稳噪声和非平稳噪声
高斯噪声和椒盐噪声
白噪声和粉红噪声(1/f噪声)
加性噪声和乘性噪声
(2)特点
随机性、图像相关性、叠加性
2、模板卷积
模板操作的种类:卷积、相关
功能:图像平滑、锐化、边缘检测
线性滤波,其输出像素是输入邻域像素的加权核。
卷积和相关运算的主要区别在于卷积运算需要将模板绕模板中心旋转180°,因其余运算过程一致而统称为模板卷积。模板卷积中的模板称为卷积核,其元素称为卷积系数、模板系数或加权系数,其大小和排列顺序决定了对图像邻域处理的类型。
模板卷积的运算过程:移动模板、对应相乘再相加、赋值
3、邻域平均
Box模板:
19[111111111] \frac{1}{9}\begin{bmatrix} 1 &amp; 1 &amp; 1 \\ 1 &amp; 1* &amp; 1 \\ 1 &amp; 1 &amp; 1 \end{bmatrix}
高斯模板:
116[121242121] \frac{1}{16}\begin{bmatrix} 1 &amp; 2 &amp; 1 \\ 2 &amp; 4* &amp; 2 \\ 1 &amp; 2 &amp; 1 \end{bmatrix}
领域平均法的主要优点是算法简单,缺点是降噪时会模糊图像,尤其是在边缘和细节处,尺寸越大模糊程度越大。适合处理高斯噪声,不适合处理椒盐噪声。
4、中值滤波
非线性滤波,滤除噪声的同时很好地保持图像边缘。
基本原理:窗口内元素灰度值求中位数并赋给中心元素
统计排序滤波器:模板内元素排序,选取某个值作为中心元素的值。中值滤波是统计排序滤波器的一种。最值滤波器用于检测亮点或暗点。
中值滤波的性质:
(1)不影响阶跃信号、斜坡信号、连续个数少于窗口长度一半的脉冲受到抑制,三角函数顶部变平。
(2)中值滤波的输出与输入噪声的密度分布有关
(3)中值滤波频谱特性起伏不大,可以认为中值滤波之后,信号频谱基本不变
中值滤波窗口形状和尺寸决定了滤波效果,就一般经验而言,对于有缓变的较长轮廓线物体的图像,采用方形或圆形窗口为宜;对于包含有尖顶角物体的图像,用十字形窗口。窗口大小不宜超过图像中最小有效物体的尺寸。如果图像中包含的点、线、尖角较多,则不宜采用中值滤波。
复合型中值滤波器:中值滤波的线性组合、高阶中值滤波组合、加权中值滤波、迭代中值滤波
5、图像平均
基本原理:同一景物的多幅图像取平均值来消噪。
缺点:难以操作

3.4 图像锐化

目的:使模糊的图像变清晰,增强图像的边缘等细节,但同时也会增强噪声,一般先做消噪处理。
图像锐化的方法:空域法、频域法
1、微分法
微分运算通常通过一阶向前差分运算或二阶中心差分来实现。
(1)梯度算子
梯度算子的定义
f(x,y)=[fxfy]T \mathrm{▽}\mathbf{f}(x,y)=\begin{bmatrix}\frac{\partial f}{\partial x} &amp; \frac{\partial f}{\partial y}\end{bmatrix}^T
梯度幅度
f(x,y)=f(x,y)=(Gx2+Gy2)12 \mathrm{▽} f(x,y)=|\mathrm{▽}\mathbf{f}(x,y)|=(G_x^2+G_y^2)^{\frac 1 2}
梯度方向角
φ(x,y)=arctan(GyGx) φ(x,y)=arctan(\frac {G_y} {G_x})
水平梯度差分法
f(x,y)f(x+1,y)f(x,y)+f(x,y+1)f(x,y) \mathrm{▽} f(x,y) \approx |f(x+1,y)-f(x,y)|+|f(x,y+1)-f(x,y)|
Robert交叉算子
f(x,y)f(x+1,y+1)f(x,y)+f(x,y+1)f(x+1,y) \mathrm{▽} f(x,y) \approx |f(x+1,y+1)-f(x,y)|+|f(x,y+1)-f(x+1,y)|
中心差分算子
{Gx=f(x+1,y)f(x1,y)2Gy=f(x,y+1)f(x,y1)2 \left \{\begin{matrix} G_x=\frac{f(x+1,y)-f(x-1,y)}{2} \\ \\ G_y=\frac{f(x,y+1)-f(x,y-1)}{2} \end{matrix}\right.
常见的梯度算子:

算子名称 模板H1 模板H2 特点
Roberts [0110]\begin{bmatrix}0* &amp; -1 \\ 1 &amp; 0\end{bmatrix} [1001]\begin{bmatrix}-1* &amp; 0 \\ 0 &amp; 1\end{bmatrix} 各向同性;对噪声敏感;模板尺寸为偶数,中心位置不明显
Prewitt [101101101]\begin{bmatrix}-1 &amp; 0 &amp; 1 \\ -1 &amp; 0* &amp; 1 \\ -1 &amp; 0 &amp; 1 \end{bmatrix} [111000111]\begin{bmatrix}-1 &amp; -1 &amp; -1 \\ 0 &amp; 0* &amp; 0 \\ 1 &amp; 1 &amp; 1\end{bmatrix} 引入了平均因素,对噪声有抑制作用;操作简便
Sobel [101202101]\begin{bmatrix}-1 &amp; 0 &amp; 1 \\ -2 &amp; 0* &amp; 2 \\ -1 &amp; 0 &amp; 1 \end{bmatrix} [121000121]\begin{bmatrix}-1 &amp; -2 &amp; -1 \\ 0 &amp; 0* &amp; 0 \\ 1 &amp; 2 &amp; 1\end{bmatrix} 引入了平均因素,增强了最近像素的影响,噪声抑制效果比Prewitt要好
Krisch [335305335]\begin{bmatrix}-3 &amp; -3 &amp; 5 \\ -3 &amp; 0* &amp; 5 \\ -3 &amp; -3 &amp; 5 \end{bmatrix} [333303555]\begin{bmatrix}-3 &amp; -3 &amp; -3 \\ -3 &amp; 0* &amp; -3 \\ 5 &amp; 5 &amp; 5\end{bmatrix} 噪声抑制效果要好;需求出8个方向的响应(这里只给出两个方向的模板)
Isotropic Sobel [101202101]\begin{bmatrix}-1 &amp; 0 &amp; 1 \\ -\sqrt 2 &amp; 0* &amp; \sqrt 2 \\ -1 &amp; 0 &amp; 1 \end{bmatrix} [121000121]\begin{bmatrix}-1 &amp; -\sqrt 2 &amp; -1 \\ 0 &amp; 0* &amp; 0 \\ 1 &amp; \sqrt 2 &amp; 1\end{bmatrix} 权值反比于邻点与中心点的距离,检沿不同方向边缘时梯度幅度一致,即具有各向同性

(2)拉普拉斯算子
拉普拉斯算子:
Δf=2f=2f2x+2f2y \Delta f=\nabla ^2f=\frac{\partial ^2f}{\partial ^2x}+\frac{\partial ^2f}{\partial ^2y}
差分表示:
2ff(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y) \nabla ^2f \approx f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
常用拉普拉斯模板:
[010141010][111181111][121242121] \begin{bmatrix} 0 &amp; -1 &amp; 0 \\ -1 &amp; 4* &amp; -1 \\ 0 &amp; -1 &amp; 0 \end{bmatrix} \begin{bmatrix} -1 &amp; -1 &amp; -1 \\ -1 &amp; 8* &amp; -1 \\ -1 &amp; -1 &amp; -1 \end{bmatrix} \begin{bmatrix} 1 &amp; -2 &amp; 1 \\ -2 &amp; 4* &amp; -2 \\ 1 &amp; -2 &amp; 1 \end{bmatrix}
平滑模板和微分模板的对比:
(1)微分模板的权系数之和为0,使得灰度平坦区的响应为0。平滑模板的权系数都为正,和为1,这使得灰度平坦区的输出与输入相同。
(2)一阶微分模板在对比度较大的点产生较高的响应,二阶微分模板在对比度大的点产生零交叉。一阶微分一般产生更粗的边缘,二阶微分则产生更细的边缘。相对一阶微分而言,二阶微分对细线、孤立的点等小细节有更强的响应。
(3)平滑模板的平滑或去噪程度与模板的大小成正比,跳变边缘的模糊程度与模板的大小成正比。
2、非锐化滤波
非锐化滤波:从原始图像中减去原始图像的一个非锐化的或者说是平滑的图像,从而达到增强边缘等细节的目的,用公式表示为:
g(x,y)=f(x,y)fs(x,y) g(x,y)=f(x,y)-f_s(x,y)
式中f表示输入图像,fs表示由输入图像得到的平滑图像,g为输出图像。
图像平滑的实质是一种低通滤波,从原始图像中减去平滑图像就相当于除去低频成分保留了高频成分。
3、高频增强滤波
高频增强滤波:如果原始图像与高通图像相加,则可以在保持原始图像概貌的同时突出边缘等细节。将原始图像乘以一个比例系数A,高通图像也乘以一个比例系数K,两者相加得到一个增强图像,称该过程为高频增强滤波。
fhb(x,y)=Af(x,y)+Kg(x,y) f_{hb}(x,y)=Af(x,y)+Kg(x,y)
fhb(x,y)f_{hb}(x,y)表示输出图像,g(x,y)g(x,y)f(x,y)f(x,y)的一个高通图像,A>=0,0<=K<=1。K在0.2~0.7之间取值时,高频增强滤波的效果最好;A足够大时,图像锐化作用削弱,输出图像接近原始图像整数倍;特别地,当A=1,K=1时为常用的拉普拉斯高频增强模板。
常见的拉普拉斯高频增强模板:
[010151010][111191111][121252121] \begin{bmatrix} 0 &amp; -1 &amp; 0 \\ -1 &amp; 5* &amp; -1 \\ 0 &amp; -1 &amp; 0 \end{bmatrix} \begin{bmatrix} -1 &amp; -1 &amp; -1 \\ -1 &amp; 9* &amp; -1 \\ -1 &amp; -1 &amp; -1 \end{bmatrix} \begin{bmatrix} 1 &amp; -2 &amp; 1 \\ -2 &amp; 5* &amp; -2 \\ 1 &amp; -2 &amp; 1 \end{bmatrix}

3.5 伪彩色处理

原理:不同灰度级赋予不同彩色。
1、灰度分层法:类似于等高线、卫星云图、天气预报图等
2、灰度变换法:红外热成像仪等
3、频域滤波法:在频率域进行伪彩色处理

3.6 同态滤波

同态滤波:在压缩动态范围的同时增强图像对比度,既增强暗区的图像细节又不损失亮区的图像细节。同态滤波用于消除图像中的非均匀光照,对乘性噪声的滤波效果也比较好。
通常认为,像素的灰度值为光照的入射分量与物体的反射分量的乘积决定。
f(x,y)=i(x,y)r(x,y) f(x,y)=i(x,y)r(x,y)
入射分量描述景物的照明,与景物无关,在空间均匀或缓慢变化,频谱特性集中在低频部分。由于景物具有较多细节内容,因而反射分量随空间变化较大,其频谱特性主要集中在高频部分。通过消除场景关照的不均匀性可以增强图像细节。
对上式两边取对数
lnf(x,y)=lni(x,y)+lnr(x,y) \mathrm{ln}f(x,y)=\mathrm{ln}i(x,y)+\mathrm{ln}r(x,y)
两边做傅里叶变换,得
Ff(u,v)=Fi(u,v)+Fr(u,v) F_f(u,v)=F_i(u,v)+F_r(u,v)
高斯高通同态滤波器:
H(u,v)=(γHγL)[1ecD2(u,v)D02]+γL H(u,v)=(\gamma _H-\gamma _L)[1- e^{-c\frac{D^2(u,v)}{D_0^2}}]+\gamma _L
γH\gamma _HγL\gamma _L用于控制滤波强度,c用于控制滤波器斜面的锐化程度,D2(u,v)D^2(u,v)为频谱上点(u,v)到频谱中心的距离,D02D_0^2为截止半径。
同态滤波结果:
g(x,y)=exp{F1[Ff(u,v)H(u,v)]} g(x,y)=exp\{F^{-1}[F_f(u,v)H(u,v)]\}

第4章 图像的几何变换

4.1 几何变换基础

1、概述
2、齐次坐标
标准化齐次坐标是几何变换的基础。
3、二维图像几何变换矩阵
P=TP0P0=[x1x2...xny1y2...yn11...1]P=[Hx1Hx2...HxnHy1Hy2...HynHH...H]T=[abpcdq001] P=TP_0 \\ P_0=\begin{bmatrix}x_1 &amp; x_2 &amp; ... &amp; x_n \\ y_1 &amp; y_2 &amp; ... &amp; y_n \\ 1 &amp; 1 &amp; ... &amp; 1\end{bmatrix} \\ \\ P_=\begin{bmatrix}Hx_1&#x27; &amp; Hx_2&#x27; &amp; ... &amp; Hx_n&#x27; \\ Hy_1&#x27; &amp; Hy_2&#x27; &amp; ... &amp; Hy_n&#x27; \\ H &amp; H &amp; ... &amp; H\end{bmatrix} \\ T=\begin{bmatrix}a &amp; b &amp; p \\ c &amp; d &amp; q \\ 0 &amp; 0 &amp; 1\end{bmatrix}

4.2 图像比例缩放

1、图像比例放缩变换
全比例放缩:x轴方向和y轴方向缩放比例相同
几何畸变:x轴方向和y轴方向缩放比例不相同,会改变像素间的相对位置,产生几何畸变
插值处理:比例缩放可能导致出现空穴,必须进行插值。插值方法有最邻近插值法和插值算法(如双线性内插值法)
(1)图像的比例缩小
I(x,y)=F(int(cx),int(cy)),c=1k I(x,y)=F(int(cx),int(cy)), c=\frac 1 k
(2)图像的非比例缩小
I(x,y)=F(int(c1x),int(c2y)),c1=1k1,c2=1k2 I(x,y)=F(int(c_1x),int(c_2y)), c_1=\frac 1 {k_1}, c_2=\frac 1 {k_2}
(3)图像的比例放大
最邻近插值法:原图像对应元素如果不存在就取邻近的元素。
线性插值法:
g(x,y)=(1q)[(1p)f([x],[y]+1)+pf([x]+1,[y])]+q[(1p)f([x],[y]+1)+pf([x]+1,[y]+1)] g(x,y)=(1-q)[(1-p)f([x],[y]+1)+pf([x]+1,[y])]+q[(1-p)f([x],[y]+1)+pf([x]+1,[y]+1)]
在这里插入图片描述
2、比例缩放的实现 (略)

4.3 图像平移

没啥说的

4.4 图像镜像

没啥说的

4.5 图像旋转

1、图像的旋转变换
变换矩阵没啥说的
插值方法:行插值、列插值、双线性插值
2、图像旋转的实现(略)

4.6 图像复合变换

复合平移、复合比例、复合旋转、图像转置、任意点比例缩放、任意点旋转
插值方法:
在这里插入图片描述
插值算法:双线性插值、最邻近插值

4.7 透视变换

1、透视变换
投影变换:把空间坐标系中的三维物体或对象转变为二维图像表示的过程称为投影变换。根据视点和投影平面之间的距离的不同,投影可分为平行投影(距离∞)和透视投影(有限距离)。
平行投影:投影线互相平行的投影称为平行投影,分为正投影和斜投影。正投影要求投影线垂直于投影面,分为正交投影和正轴测投影,正交投影要求坐标轴必须正交,正轴测投影要求坐标轴夹角都相等即为120°,根据坐标轴单位长度是否都相等分为正等轴测图、正二轴测图、正三轴测图。斜投影不要求投影线与投影面垂直,根据坐标轴单位长度是否相等分为斜等测投影和斜二测投影。
透视投影:投影线不相互平行的投影,根据灭点的数量分为一点透视、两点透视和三点透视。
2、其他变换
几何畸变:成像与目标之间不相似的情况称为几何畸变。
(1)非矩形像素坐标的转换
极坐标、柱坐标、球坐标→笛卡尔坐标系
(2)图像错切
平面景物在投影平面上的非垂直投影。
水平错切、垂直错切
(3)图像卷绕
通过指定一系列控制点的位移来定义空间变换的图像变形的处理技术,非控制点的位移则通过控制点进行插值。

4.8 几何畸变的矫正

在这里插入图片描述
几何畸变两个关键步骤:图像空间像素坐标的几何变换——空间变换;变换后的标准图像空间的各像素灰度值的计算——灰度值计算。
校正函数的建立步骤:
(1)利用控制点对图像数据建立一个模拟几何畸变的数学模型,以建立畸变图像空间与标准空间的对应关系
(2)用这种对应关系把畸变空间中的全部元素变换到标准空间中去。
重采样的方法:
(1)直接成图法
畸变图像元素→标准图像空间正确的位置
(x,y)=f(u,v)(x,y)=\boldsymbol f(u,v)
(2)间接成图法(重采样成图法)
标准图像空间某个位置→对应畸变图像位置
(u,v)=f1(x,y)(u,v)=\boldsymbol f^{-1}(x,y)
两种方法的区别:校正函数不同,直接成图法通过亮度重配置获得亮度值,间接成图法通过亮度重采样获得亮度值。
多项式校正法:将几何畸变看成各种类型仿射变换复合作用的结果。
{u=gu(x,y)=i=0nj=0niaijxiyjv=gv(x,y)=i=0nj=0nibijxiyj \left \{ \begin{matrix} u=g_u(x,y)=\sum_{i=0}^{n}\sum_{j=0}^{n-i}a_{ij}x^iy^j \\ \\ v=g_v(x,y)=\sum_{i=0}^{n}\sum_{j=0}^{n-i}b_{ij}x^iy^j \end{matrix} \right.
拟合误差平方和:
{εu=k=1K(uki=0nj=0niaijxkiykj)2εv=k=1K(vki=0nj=0nibijxkiykj)2 \left \{ \begin{matrix} \varepsilon_u=\sum_{k=1}^K(u_k-\sum_{i=0}^{n}\sum_{j=0}^{n-i}a_{ij}x_k^iy_k^j)^2 \\ \\ \varepsilon_v=\sum_{k=1}^K(v_k-\sum_{i=0}^{n}\sum_{j=0}^{n-i}b_{ij}x_k^iy_k^j)^2 \end{matrix} \right.
使用最小二乘法计算系数时,控制点的数目不能小于n。

第5章 频域处理

数字图像处理的两类方法:空域法、频域法
频域法:把图像信号从空域转换为频域进行图像分析
频域处理的应用:图像特征的提取、图像压缩编码、减小计算维数

5.1 频域与频域变换

频域变换的理论基础:任意波形都可以表示为一系列正弦波的加和
幅频特性——振幅与频率之间的关系
相频特性——初相与频率之间的关系
时域和频域的变换:
f(x)A(ω),Φ(ω)F(ω)f(x)\begin{matrix}正变换 \\ \Leftrightarrow \\ 逆变换\end{matrix}A(\omega),\Phi(\omega) \rightarrow F(\omega)
5.2 傅里叶变换
1、连续函数的傅里叶变换
关键词:狄利克雷条件、二维傅里叶变换
2、离散傅里叶变换
定义:
F[f(x)]=F(u)=x=0N1f(x)ej2πuxNF1[F(u)]=f(x)=1Nu=0N1F(u)ej2πuxNF[f(x)]=F(u)=x=0N1f(x)[cos(2πNux)jsin(2πNux)]F1[F(u)]=f(x)=1Nu=0N1F(u)[cos(2πNux)+jsin(2πNux)] \mathscr{F}[f(x)]=F(u)=\sum_{x=0}^{N-1}f(x)e^{-j\frac {2\pi ux}{N}} \\ \mathscr{F}^{-1}[F(u)]=f(x)=\frac 1 N \sum_{u=0}^{N-1}F(u)e^{j\frac {2\pi ux}{N}} \\ \mathscr{F}[f(x)]=F(u)=\sum_{x=0}^{N-1}f(x)[cos(\frac {2\pi} Nux)-j\cdot sin(\frac {2\pi} Nux)] \\ \mathscr{F}^{-1}[F(u)]=f(x)=\frac 1 N \sum_{u=0}^{N-1}F(u)[cos(\frac {2\pi} Nux)+j\cdot sin(\frac {2\pi} Nux)] \\
离散傅里叶变换的结果仍然是一个离散的序列,对每一个u对应的傅里叶变换结是所有输入序列f(x)的加权和,u决定了每个傅里叶变换结果的频率
如果F(u)可以表示为F(u)=R(u)+jI(u)F(u)=R(u)+jI(u),且R(u)和I(u)是实函数,则称F(u)=R2(u)+I2(u)|F(u)|=\sqrt {R^2(u)+I^2(u)}为f(x)的频谱,φ(u)=arctan(I(u)R(u))\varphi(u)=arctan(\frac {I(u)}{R(u)})为f(x)的相位谱。频谱的平方称为能量谱。
二维离散傅里叶变换:
F[f(x,y)]=F(u,v)=x=0M1y=0N1f(x,y)ej2π(uxM+vyN)F1[f(x,y)]=F(u,v)=1MNu=0M1v=0N1F(u,v)ej2π(uxM+vyN) \mathscr{F}[f(x,y)]=F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-j2\pi (\frac {ux} M+\frac {vy} N)} \\ \mathscr{F}^{-1}[f(x,y)]=F(u,v)=\frac 1 {MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)e^{j2\pi (\frac {ux} M+\frac {vy} N)}
3、离散傅里叶变换的性质
在这里插入图片描述
在这里插入图片描述
4、离散傅里叶变换的openCV 不考

5.3 频域变换的一般表达式

1、可分离变换
二维傅里叶变换通用表达式:
F(u,v)=x=0M1y=0N1f(x,y)g(x,y,u,v)f(x,y)=u=0M1v=0N1F(u,v)h(x,y,u,v) F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)\cdot g(x,y,u,v) \\ f(x,y)=\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)\cdot h(x,y,u,v)
其中g和h分别被称为正向变换核与负向变换核。
可分离的:
如果
g(x,y,u,v)=g1(x,u)g2(y,v)h(x,y,u,v)=h1(x,u)h2(y,v) g(x,y,u,v)=g_1(x,u)\cdot g_2(y,v) \\ h(x,y,u,v)=h_1(x,u)\cdot h_2(y,v)
则称正反变换核是可分离的。进一步地,如果g1和g2,h1和h2在函数形式上一致,则称该变换核是对称的。
2、图像变换的矩阵表示
F=PfQf=P1FQ1P(u,x)=g1(x,u)=ej2πuxMQ(y,v)=g2(y,v)=ej2πvyN \boldsymbol {F=PfQ} \\ \boldsymbol {f=P^{-1}FQ^{-1}} \\ P(u,x)=g_1(x,u)=e^{-j\frac {2\pi ux} M} \\ Q(y,v)=g_2(y,v)=e^{-j\frac {2\pi vy} N}

5.4 离散余弦变换(DCT)

1、一维离散余弦变换
DCT变换核定义:
g(x,u)=C(u)2Ncos(2x+1)uπ2NC(u)={12,u=01,else \begin{matrix} g(x,u)=C(u)\sqrt {\frac 2 N cos \frac {(2x+1)u\pi} {2N}} \\ \\ C(u)=\left \{ \begin{matrix} \frac 1 {\sqrt 2}, u=0 \\ \\ 1,else\end{matrix}\right. \end{matrix}
一维DCT定义:
F(u)=x=0N1f(x)g(x,u)F=Gf(G(u,x)=g(x,u) F(u)=\sum_{x=0}^{N-1}f(x)g(x,u) \\ \boldsymbol {F=Gf}(矩阵形式,G(u,x)=g(x,u))
在这里插入图片描述
DCT逆变换IDCT:
h(x,u)=g(x,u)=C(u)2Ncos(2x+1)uπ2Nf(x)=u=0N1F(u)h(x,u) h(x,u)=g(x,u)=C(u)\sqrt {\frac 2 N cos \frac {(2x+1)u\pi} {2N}} \\ f(x)=\sum_{u=0}^{N-1}F(u)h(x,u)
2、二维离散余弦变换
2D-DCT:
g1(x,u)=2MC(u)cos(2x+1)uπ2Mg2(y,v)=2NC(v)cos(2x+1)vπ2Ng(x,y,u,v)=g1(x,u)g2(y,v)F(u,v)=x=0M1y=0N1f(x,y)g(x,y,u,v) g_1(x,u)= \sqrt {\frac 2 M} C(u) cos \frac {(2x+1)u\pi} {2M} \\ g_2(y,v)= \sqrt {\frac 2 N} C(v) cos \frac {(2x+1)v\pi} {2N} \\ g(x,y,u,v)=g_1(x,u)g_2(y,v) \\ F(u,v)=\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)g(x,y,u,v)
2D-IDCT:
h1(x,u)=g1(x,u)h2(y,v)=g2(y,v)h(x,y,u,v)=h1(x,u)h2(y,v)f(x,y)u=0M1v=0N1F(u,v)h(x,y,u,v) h_1(x,u)=g_1(x,u) \\ h_2(y,v)=g_2(y,v) \\ h(x,y,u,v)=h_1(x,u)\cdot h_2(y,v) \\ f(x,y)\sum_{u=0}^{M-1}\sum_{v=0}^{N-1}F(u,v)h(x,y,u,v)

5.5 频域中图像处理的实现

1、理解数字图像的频谱图
数字图像平移后的频谱中,图像的能量将集中到频谱中心(低频成分),细节信息分散在图像频谱的边缘。频谱中的低频成分代表了图像的概貌,高频成分代表了图像中的细节。
2、频域图像处理步骤
在这里插入图片描述
3、频域滤波
低通滤波器、高通滤波器、带通滤波器、带阻滤波器
高通巴特沃斯滤波器:H(u,v)=11+[D0D(u,v)]2nH(u,v)=\frac 1 {1+[\frac {D_0} {D(u,v)}]^{2n}}
低通巴特沃斯滤波器:H(u,v)=11+[D(u,v)D0]2nH(u,v)=\frac 1 {1+[\frac {D(u,v)} {D_0}]^{2n}}

5.6 小波变换简介(暂略)

第6章 数学形态学处理

数学形态学四种基本运算:腐蚀、膨胀、开运算、闭运算

6.1 引言

1、数学形态学
数学形态学的基本思想:用具有一定形态的结构元素去量度和提取图像中的对应形状,已以达到图像分析和识别的目的。
2、基本符号和术语
元素和集合、交并补差、平移反射、目标图像与结构元素
击中与击不中:交集为空击不中,交集不为空击中

6.2 二值形态学

1、腐蚀
XS={xXS+xX}X\ominus S=\{x\in X |S+x\subseteq X\}
理解:把结构体元素放在目标图像中移动,则结构体元素的原点的集合构成腐蚀的结果。
2、膨胀
XS={X+ssS}={S+xxX}={x(Sv+x)X}X\oplus S=\bigcup\{X+s|s\in S\}=\bigcup\{S+x|x\in X\}=\{x|(S^v+x) \cap X\neq \varnothing\}
理解:第二种定义比较好理解,即吧结构体元素原点放在目标图像中移动,所有结构体元素的并。
运算律:
X(YZ)=(XY)(XZ)X(YZ)=(XY)(XZ)(XY)Z(XZ)(YZ)(XY)Z=(XZ)(YZ)(XY)Z=(XZ)(YZ)(XY)Z(XZ)(YZ) X\ominus(Y\cap Z)=(X\ominus Y)\cap(X\ominus Z) \\ X\oplus(Y\cap Z)=(X\oplus Y)\cap(X\oplus Z) \\ (X\cap Y)\ominus Z\supset(X\ominus Z)\cap (Y\ominus Z) \\ (X\cap Y)\oplus Z=(X\oplus Z)\cap (Y\oplus Z) \\ (X\cup Y)\ominus Z=(X\ominus Z)\cup (Y\ominus Z) \\ (X\cup Y)\oplus Z\subseteq(X\oplus Z)\cup (Y\oplus Z)
3、开闭运算
开运算:XS=(XS)SX○S=(X\ominus S)\oplus S
闭运算:XS=(XS)SX\cdot S=(X\oplus S)\ominus S
开闭运算的代数性质:
(1)对偶性:(XCS)C=XS;(XCS)=XS(X^C○S)^C=X\cdot S; (X^C\cdot S)=X○S
(2)扩展性:XSXXSX○S\subseteq X \subseteq X\cdot S
开运算恒使图像缩小,闭运算恒使图像扩展。
(3)单调性:XYXSYS,XSYSX\subseteq Y \Rightarrow X\cdot S\subseteq Y\cdot S, X○ S\subseteq Y○ S
YZZY=ZXYXZY\subseteq Z\wedge Z\cdot Y=Z \Rightarrow X\cdot Y\subseteq X \cdot Z
(4)平移不变性:(X+h)S=(XS)+h(X+h)\cdot S=(X\cdot S)+h
(X+h)S=(XS)+h(X+h)○ S=(X○ S)+h
X(S+h)=XSX\cdot (S+h)=X\cdot S
X(S+h)=XSX○ (S+h)=X○ S
(5)等幂性:(XS)S=XS,(XS)S=XS(X\cdot S)\cdot S = X\cdot S,(X○ S)○ S = X○ S
(6)开闭运算与集合的关系:
(i=0nXi)Si=0n(XiS)(\bigcup_{i=0}^{n}X_i)○S\supseteq \bigcup_{i=0}^{n}(X_i○S)
(i=0nXi)Si=0n(XiS)(\bigcap_{i=0}^{n}X_i)○S\subseteq \bigcap_{i=0}^{n}(X_i○S)
(i=0nXi)Si=0n(XiS)(\bigcup_{i=0}^{n}X_i)\cdot S\supseteq \bigcup_{i=0}^{n}(X_i\cdot S)
(i=0nXi)Si=0n(XiS)(\bigcap_{i=0}^{n}X_i)\cdot S\subseteq \bigcap_{i=0}^{n}(X_i\cdot S)
4、击中击不中变换
XS={xS1+xXS2+xXC}=(XS1)(XCS2)X\odot S=\{x|S_1+x\subseteq X \wedge S_2+x\subseteq X^C\}=(X\ominus S_1)\cap(X^C\ominus S_2)

6.3 灰值形态学

1、灰值腐蚀
(fb)(s,t)=min{f(s+x,t+y)b(x,y)s+x,t+yDfx,yDb}(f\ominus b)(s,t)=min\{f(s+x,t+y)-b(x,y)|s+x,t+y\in D_f \wedge x,y \in D_b\}
腐蚀的计算是在由结构元素确定的领域中选取fbf\ominus b的最小值,所以灰值图像的腐蚀操作会有两类效果:如果结构体元素的值都为正,则输出图像会比原图像暗;如果输入图像中亮细节的尺寸比结构元素小,则其影响会被减弱。
2、灰值膨胀
(fb)(s,t)=max{f(sx,ty)+b(x,y)sx,tyDfx,yDb}(f\oplus b)(s,t)=max\{f(s-x,t-y)+b(x,y)|s-x,t-y\in D_f \wedge x,y \in D_b\}
膨胀的计算是在由结构元素确定的领域中选取fbf\oplus b的最大值,所以对灰值图像的膨胀有两类效果:如果结构体元素的值都为正,则输出图像会比原图像亮;如果输入图像中暗细节的灰度值及形状相对于结构体元素的大小,则其被消减或消除。
膨胀或腐蚀满足以下对偶关系:
(fb)C=fCbV(f\oplus b)^C=f^C \ominus b^V
(fb)C=fCbV(f\ominus b)^C=f^C \oplus b^V
3、灰值开闭运算
定义与二值形态学定义类似,亦满足类似的对偶关系。
灰值开运算削平山峰。灰值闭运算填平深谷。
实际中常用开运算操作消除与结构元素相比尺寸较小的亮细节,而保持整体灰度值和大的亮区域;实际应用中常使用闭运算操作消除与结构元素相比尺寸较小的暗细节,而保持图像整体灰值和大的暗区域。

6.4 形态学的应用

灰值形态学的主要算法有:灰值形态学梯度、形态学平滑、纹理分割、顶帽变换等
二值形态学的主要算法有:二值形态学滤波、骨架抽取等
1、形态学滤波
将开运算与闭运算相结合可以构成形态学噪声滤除器,开运算滤除黑色背景上的白色噪声,闭运算滤除白色前景中的黑色噪声。
2、骨架提取
骨架定义方法:火种法、最大圆盘法
(1)基于腐蚀和开运算的细化
定义骨架子集Sk(X)S_k(X)为图像X内所有最大圆盘kB(至少与两条边相切的内切圆)的圆心x构成的集合。从骨架的定义可知,骨架是所有骨架子集的并,即
Sk(X)={Sk(X)k=0,1,...,n} S_k(X)=\bigcup\{S_k(X)|k=0,1,...,n\}
可以证明骨架子集可以表示为:
Sk(X)=(XkB)[(XkB)B]XkB=(X(k1)B)B S_k(X)=(X\ominus kB)-[(X\ominus kB)○ B] \\ 递推公式:X\ominus kB=(X\ominus (k-1)B)\ominus B
所以:
S(X)={(XkB)[(XkB)B]k=0,1,2,...,n} S(X)=\bigcup\{(X\ominus kB)-[(X\ominus kB)○B]|k=0,1,2,...,n\}
停止迭代的时机:XkBX\ominus kB\varnothing
(2)快速形态学细化算法

在这里插入图片描述
(1)(2)(4)(6)都不能删除,(2)(4)可以删除
可以删除的情况:内部点不可删除、孤立点不可删除、直线端点不可删除、去掉后连通分量不增加。

第7章 图像分割

图像分割就是把图象分成一系列有意义的、各具特征的目标或区域的技术和过程。这里的特征包括图像的统计特征和视觉特征。统计特征包括图像的直方图、矩和频谱等,图像的视觉特征主要包括区域的亮度、纹理或轮廓等。
图像分割一般基于像素灰度值的两个性质:不连续性和相似性。区域之间的边界往往具有有灰度不连续性,而区域内部一般具有灰度相似性。
图像分割算法一般分为两类:利用灰度不连续性——基于边界的分割;利用灰度相似性——基于区域的分割
常用算法:阈值分割、区域生长、区域分裂与合并、边缘检测与边界连接、区域标记与轮廓跟踪、分水岭分割、Mean Shift和Graph Cuts算法

7.1 阈值分割

1、概述
基本假设:目标与背景相邻像素间灰度值高度相关;目标与边界两侧像素灰度值差别很大;目标与背景的灰度分布都是单峰的。
阈值分割过程:阶跃函数
阈值分割的关键——阈值的确定:
(1)种类:全局阈值、局部阈值、动态阈值(自适应阈值)
(2)阈值分割的要素:T=T[x,y,f(x,y),p(x,y)]T=T[x,y,f(x,y),p(x,y)], f(x,y)表示灰度值,p(x,y)表示某种局部性质。
2、全局阈值
适用条件:“双峰”性质
确定全局阈值的方法:
(1)极小点阈值法:取直方图谷底位置作为阈值
(2)迭代阈值法:初始阈值T1T_1→像素划分为G1G_1G2G_2→计算平均灰度μ1\mu_1μ2\mu_2→计算新的阈值T2=μ1+μ22T_2=\frac {\mu_1+\mu_2} 2→迭代→终止条件T2T1&lt;T0|T_2-T_1| &lt;T_0
(3)最优阈值法:选择一个阈值使得总的分类误差概率降到最低。
p(z)p(z)为灰度概率密度函数,p1(z)p_1(z)p2(z)p_2(z)分别为背景和目标灰度条件概率密度函数,P1P_1P2P_2为背景和目标像素出现的概率,那么由全概率公式得:
p(z)=P1p1(z)+P2p2(z) p(z)=P_1p_1(z)+P_2p_2(z)
把目标像素错分为背景像素的误差条件概率为:
E1(T)=Tp1(z)dz E_1(T)=\int_{-\infty}^Tp_1(z)\mathrm{d}z
把背景像素错分为背景像素的误差条件概率为:
E2(T)=T+p2(z)dz E_2(T)=\int_T^{+\infty}p_2(z)\mathrm{d}z
由全概率公式得总误差概率为:
E(T)=P2E1(T)+P1E2(T) E(T)=P_2E_1(T)+P_1E_2(T)
一般认为目标与背景的灰度服从高斯分布,利用概率论与数理统计中最大似然估计方法可以得到最优解
T=μ1+μ22+σ2μ1μ2ln(P2P1) T=\frac {\mu_1+\mu_2} 2+\frac {\sigma^2} {\mu_1-\mu_2}ln(\frac{P_2}{P_1})
(4)Otsu方法:使阈值分割后各个像素类的类间方差最大。
步骤:将像素按灰度值进行分级,计算从第0个灰度级到第k个灰度级的概率和均值(数学期望),M个阈值将灰度值分为M+1个像素类,计算每个像素类的概率、平均灰度、方差,所有像素类的概率之和为1,图像总的平均灰度是所有像素类灰度的数学期望,类内方差定义为像素类灰度方差的数学期望,类间方差定义为像素类灰度均值的方差。
(5)p参数法
选取一个阈值T使得目标面积与背景面积的比为p:(1-p)
3、局部阈值
(1)直方图变换法
对波谷进行切割或峰谷颠倒、根据像素的梯度值进行加权
(2)散射图
二维坐标图,横轴为灰度,纵轴为某种局部性质(如梯度值),亮度表示频数。根据亮色进行聚类。
4、动态阈值
网格划分,每个子图像定一个阈值。
一种动态阈值算法:
子图像分解→对于具备“双峰”采用最优阈值→插值得到其他阈值→分割

7.2 基于区域的分割

1、区域生长
实质是bfs,需要初始种子,相似性准则
2、区域分裂与合并
先进行迭代四分裂,满足一致性条件后停止迭代,然后进行合并

7.3 边缘检测

常见的边缘类型:阶跃型、斜坡型、线状型、屋顶型
1、微分算子
在这里插入图片描述
结论:一阶导数的幅度值可以用来检测边缘的存在,通过检测二阶导数的过零点可以确定边缘的中心位置,利用二阶导数在过零点附近的符号可以判断是在边缘的亮区还是暗区,处理之前要先消噪。
(1)梯度算子:
Krisch、Prewitt,均可沿8个方向
(2)高斯-拉普拉斯算子
结合了高斯平滑滤波器与拉普拉斯锐化滤波器。
在这里插入图片描述
在这里插入图片描述
(3)Canny边缘检测
Canny算子是一个非常有效的边界检测算子。
①首先对灰度图像进行高斯平滑。
②接着计算每个像素的梯度幅值和梯度方向。
③ 然后细化边缘。如果当前像素的梯度幅值不高于梯度方向上两个邻点的梯度幅值,则抑制该像素响应,这种方法称之为非最大抑制。
④ Canny算子使用两个幅值阈值,高阈值用于检测梯度幅值大的强边缘,低阈值用于检测梯度幅值较小的弱边缘。低阈值通常取为高阈值的一半。
⑤ 边缘细化后,就开始跟踪具有高幅值的轮廓。
⑥ 最后,从满足高阈值的边缘像素开始,顺序跟踪连续的轮廓段,把与强边缘相连的弱边缘连接起来。
2、边界连接
幅度阈值、角度阈值
3、哈夫变换
前提条件:已知区域形状
(1)直线检测
y=ax+b→b=-ax+y→{b=axi+yib=axj+yj\left \{\begin{matrix}b=-ax_i+y_i \\ b=-ax_j+y_j\end{matrix}\right.
在这里插入图片描述
如果多个点在同一条直线上,则在参数空间中对应直线必交于同一点。
步骤:参数a、b进行量化,对于目标空间的每一个点,让a取遍每一个值apa_p,代入b=-ax+y,得到bpb_p,给A(p,q)++,处理完所有像素查找峰值即可知道最可能的a与b。
斜截式方程有缺陷,一般可以换为法线式方程:ρ=xcosθ+ysinθ\rho=xcos\theta +ysin\theta
(2)圆的检测:
{a=xrcosθb=yrsinθ \left \{ \begin{matrix} a=x-rcos\theta \\ b=y-rsin\theta \end{matrix} \right.
(3)任意曲线的检测:类似做法

7.4 区域标记与轮廓追踪

1、区域标记
递归标记:BFS
序贯标记:左、左上、上、右上邻点,如果都是背景,当前点新建标记;如果有一个被标记,复制标记;如果有两个不同标记,赋值之一,并在等价表中记录,再次扫描把等价的标记改为最小标记。
2、轮廓提取
八面合围置为背景
3、轮廓追踪
步骤:扫描图像,选定左上角点,初始dir为左下方向(4方向中为向下),逆时针查找边界点,查找到的新边界点作为当前点,在顺时针转回一个方向,迭代直到回到起始点。

7.5 分水岭分割

1、基本分水岭算法
降雨法:降水,递归寻找低洼点,雨水流向>=2个低洼的是分水岭。
淹没法:提升水位,如果水流溢出地外就筑坝,最后堤坝就是分水岭。
2、Vincent-Soille算法
类似并查集,提升水位,水平面与一些点相交,对于这些点,如果邻接点没有标记,新建标记,如果有标记,复制标记(取最近的积水盆地)
使用分水岭分割之前先做距离变换,去除粘连。

7.6 现代分割方法(略)

7.7 图像分割实例

大米计数:
(1)高斯滤波、中值滤波或开闭运算消噪
(2)消除非均匀光照:背景照度估计、灰值形态学、同态滤波
(2)区域分割

第8章 图像特征与理解

图像特征:人视觉能够识别的自然特征,分为全局特征和局部特征。
,全局特征用于描述图像或目标的颜色或形状等整体特征,局部特征指一些能够稳定出现并具有良好可区分性的特征。

8.1 图像的基本特征

提取图像几何特征之前,分割和二值化处理。
1、几何特征
(1)位置和方向
位置:质心
方向:最小二阶矩轴(最小转动惯量)
(2)周长
隙码:把像素看成小方块后图形的绝对周长
链码:边界像素中心点连线的长度
边界点数之和:边界像素的个数
(3)面积
像素计数面积:统计边界内部像素的个数
由边界行程码计算面积:
①已知区域的行程编码,只需把值为1的行程长度相加,即为区域面积。
②若给定边界的某种表示,则相应连通区域的面积应为区域外边界包围的面积,减去它的内边界包围的面积(空的面积)
yk=y0+i=0kΔyiΔyi={1,εi=1,2,30,εi=0,41,εi=5,6,7Δxi={1,εi=0,1,70,εi=2,61,εi=3,4,5A=i=1n(yi1Δxi+a) y_k=y_0+\sum_{i=0}^k\Delta y_i \\ \Delta y_i=\left \{\begin{matrix}-1,\varepsilon _i = 1,2,3 \\ 0,\varepsilon _i = 0,4\\ 1,\varepsilon _i = 5,6,7 \\\end{matrix}\right. \\ \Delta x_i=\left \{\begin{matrix}-1,\varepsilon _i = 0,1,7 \\ 0,\varepsilon _i = 2,6\\ 1,\varepsilon _i = 3,4,5 \\\end{matrix}\right. \\ A=\sum_{i=1}^n(y_{i-1}\Delta x_i+a)
由边界坐标计算面积:利用格林公式,A=12i=1Nb(xiyi+1xi+1yi]A=\frac 1 2 \sum_{i=1}^{N_b}(x_iy_{i+1}-x_{i+1}y_i]
(4)长轴和短轴
最小外接矩形的长与宽
(5)距离
欧式距离、市区距离、棋盘距离
2、形状特征
(1)矩形度=物体面积/最小外接矩形面积
长宽比=最小外接矩形的宽与长的比值
(2)圆形度:
致密度=周长^2/面积
边界能量:物体的周长为P,p表示边界点到某一起始点的距离,该点处的曲率半径为r§,则曲率为K§=1/r§,边界能量为E=1P0pK(p)2dpE=\frac 1 P\int_{0}^{p}|K(p)|^2\mathrm{d}p,在面积相同的情况下,圆具有最小的边界能量E0=(2πP)2=(1R)2E_0=(\frac {2\pi} P)^2=(\frac 1 R)^2
原型性=区域质心到边界点的平均距离/区域质心到边界点的距离均方差,当区域R趋向圆形时,圆形性趋向无穷。
面积与平均距离平方的比值=面积/内部点到边界点的平均距离
3、球状性=内切圆半径/外接圆半径
4、偏心率=区域长轴/区域短轴
5、形状描述子
(1)边界链码
在这里插入图片描述
在这里插入图片描述
(2)一阶差分链码
为了改进边界链码在旋转过程中会改变的情况。
在这里插入图片描述
(3)傅里叶描述子
原理:将二维问题转化为一维问题进行处理,可以将边界曲线转化为一维函数,或者将边界曲线转化为复平面上点的序列。假定有一个复数序列,可以对其采用采用离散傅里叶变换,得到的结果就成为傅里叶变换子。

8.2 角点特征

角点:亮度变化最剧烈、图像边缘曲线上曲率最大,具有高信息密度和旋转不变的特性
角点检测算法的4个准则:检测性、定位性、稳定性、复杂性
角点检测方法的分类:基于边缘的检测算法、基于灰度变化的检测算法。前者做法是找曲率最大边界点或拐点或进行多边形拟合,但抗噪差且依赖边缘提取结果。后者做法为对局部结果进行分析,进行角点性质检测。
1、Moravec算法
灰度变化定义为沿各个方向移动窗口的灰度值与当前窗口灰度值差的平方和。
E(u,v)=(x,y)W(I(x+u,y+v)I(x,y))2 E(u,v)=\sum_{(x,y)\in W}(I(x+u,y+v)-I(x,y))^2
在这里插入图片描述
2、Harris算法
在Moravec算法基础上给不同方向的灰度变化方差加上权值,该权值为二维高斯窗口函数。
E(u,v)=(x,y)Ww(x,y)(I(x+u,y+v)I(x,y))2w(x,y)=e(xx0)2+(yy0)22σ2I(x+u,y+v)I(x+u,y+v)=I(x,y)+uIx+vIy:E(u,v)=[u,v]M[u,v]TM=(x,y)Ww(x,y)[Ix2IxIyIxIyIy2]=[abcd] E(u,v)=\sum_{(x,y)\in W}w(x,y)(I(x+u,y+v)-I(x,y))^2 \\ w(x,y)=e^{-\frac {(x-x_0)^2+(y-y_0)^2} {2\sigma^2}} \\ 对I(x+u,y+v)进行泰勒展开:I(x+u,y+v)=I(x,y)+uI_x+vI_y \\ 代入上面的式子得:E(u,v)=[u,v]\boldsymbol M[u,v]^T \\ \boldsymbol M=\sum_{(x,y)\in W}w(x,y)\begin{bmatrix}I_x^2 &amp; I_xI_y \\ I_xI_y &amp; I_y^2 \end{bmatrix}=\begin{bmatrix}a &amp; b \\ c &amp; d \end{bmatrix}
特征值λ1与λ2决定了矩阵M的性质:
在这里插入图片描述
3、SUSAN算法
角点处的SUSAN面积具有局部最小值
在这里插入图片描述

8.3~8.6 (略)

附加:图像匹配

方法:投影法与差影法
投影法:分为水平投影法和垂直投影法。基本原理是统计每行或每列目标像素的个数,得到一个直方图,根据直方图很容易就能找到目标图像的位置。
差影法:利用同一景物同一时刻或不同时刻的图像,进行加、减、乘、除代数运算,分析得出某一物体的位置和运动情况

第9章图像编码

9.1 图像编码概述

1、图像编码的基本原理和方法
(1)图像数据冗余:
空间冗余:内部相邻像素较强的相关性导致的冗余
时间冗余:相邻两帧图像之间的相关性导致的冗余
信息熵冗余:编码冗余,用于表示信源符号的平均比特数大于其信息熵时所产生的冗余。信息熵H=i=1Npilbpi=i=1Npilb1pilbNH=-\sum_{i=1}^{N}p_ilbp_i=\sum_{i=1}^{N}p_ilb\frac 1 {p_i}\le lbN
结构冗余:图像中存在较强的纹理结构和自相似性
知识冗余:图像中包含与某些先验知识有关的信息
视觉冗余:人眼不能感知的那部分信息
(2)图像编码方法
分类:有损编码和无损编码;熵编码、预测编码、变换编码、量化编码
熵编码:
①哈夫曼编码、香农-范诺编码、算术编码
②理论基础:平均码长等于信息熵时,总可设计出一种无损编码
③等长编码与变长编码
④变长编码定理:若一个离散无记忆信源的符号集具有r个码元,熵为H,则总可以找到一种无失真编码,构成单义可译码,使其平均码长L满足HlbrLHlbr+1\frac H {lbr}\le L \le \frac H {lbr}+1
预测编码:基于图像数据的空间或时间冗余性,利用相邻已知像素预测当前像素的值,再对预测误差进行量化和编码。
变换编码:空间域图像正交变换到另一变换域上,降低相关性。
量化编码:通过将动态范围较大的输入信号映射到有限个离散值上。
2、图像编码新技术(略)
3、图像编码评价
编码效率:平均码字长度L,压缩比CRC_R,编码效率η
L=i=1NpiLiCR=BLη=HL L=\sum_{i=1}^{N}p_iL_i \\ C_R=\frac B L \\ \eta = \frac H L
编码质量:均方误差MSE、峰值信噪比PSNR
算法复杂度和算法的适用范围

9.2 哈夫曼编码

不会的挨打

9.3 香农-范诺编码

1、基本方法:
信源符号出现概率降序排序;
计算符号对应码字长度:logDPiNilogDPi+1-log_DP_i\le N_i \le -log_DP_i+1
计算累加概率:Ai=k=0i1piA_i=\sum_{k=0}^{i-1}p_i
将累加概率转换为二进制,取前NiN_i位。
2、二分法香农-范诺编码方法
在这里插入图片描述

9.4 算术编码

两种模式:基于信源概率统计特性的固定编码模式、针对未知信源概率模型的自适应模式
在这里插入图片描述

9.5 行程编码

aabbbcddddd=2a3b1c5d

9.6 LZW编码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2019-04-21 20:27:44 Dujing2019 阅读数 1382

数字图像处理—几何变换与图像配准

几何变换改变了图像中像素间的空间关系。可以使图像放大和缩小,可以旋转、移动或用各种方法进行其他扩展。几何变换可用于创建小场景,使之适应从某个重放分辨率到另一个分辨率的数字视频,校正由观察几何变化导致的失真,以及排列有相同场景和目标的多幅图像。

(一)点变换

假设(w,z)和(x,y)是两个空间坐标系统,分别称为输入空间和输出空间。几何坐标变换可定义为输入空间点到输出空间点的映射:
在这里插入图片描述
这里, T{.}叫做正向变换或正向映射。如果 T{.}有逆,可逆映射输出空间点到输入空间点:
在这里插入图片描述
图像的几何变换被定义为按照几何坐标的变换。令f(w,z)表示输入空间的一幅图像,我们可以定义输出空间的变换图像g(x,y)。

图像处理工具箱采用tform 结构来描述几何坐标变换,tform 结构由函数 maketform 创建,语法是:

tform = maketform(transform—type, params, ...)

参量 transform_type 是下列字符串之一:’affine’、’projective’、’custom’、 ‘box’或’composite’。主要讨论‘custom’变换类型,这种变换可以用来创建基于用户定义的几何坐标变换的 tform 结构。'custom’类型的全部语法是:

tform = maketform('custom', ndims_in, ndims_out,... forward_fen, inv_function, tdata)

对于二维几何变换是 ndims_in 和 ndims_out,参数 forward_fen 和 inv_fen 是关于正向和反向空间坐标变换的函数句柄 。参数 tdata 包含 forward_fcn 和所需要的任何额外信息。

接下来实际操作,创建两个描述不同空间坐标变换的 tform 结构。第一个变换用因数3水平地放大,用因数2垂直地放大:
在这里插入图片描述在这里插入图片描述
首先,创建正向函数,语法:

xy = fwd_function (wz,tdata) 

wz是包含两列的矩阵,在 wz 平面中每一行包含一个点;xy是另一个包含两列的矩阵,其中的行是包含在 xy 平面中的点。

 forward_fcn=@(wz,tdata) [3*wz(:,1),2*wz(:,2)]

在这里插入图片描述
接下来,创建具有语法wz = inverse_fen(xy,tdata)的反函数:

inverse_fcn=@(xy,tdata) [xy(:,1)/3,xy(:,2)/2]

在这里插入图片描述
现在,可以构建第一个 tform 结构:

tform1=maketform('custom',2,2,forward_fcn,inverse_fcn,[])

在这里插入图片描述
计算某个点对的正向变换,接下来的反向变换核实了我们得到的原始数据:

WZ=[1 1;3 2];
XY=tformfwd(WZ,tform1)

在这里插入图片描述

WZ2=tforminv(XY,tform1)

在这里插入图片描述

第 2 个变换示例:以垂直坐标因子移动水平坐标,并保持垂直坐标不变。
在这里插入图片描述
在这里插入图片描述
编写代码:

forward_fcn=@(wz,tdata) [wz(:,1)+0.4*wz(:,2),wz(:,2)];
inverse_fcn=@(xy,tdata) [xy(:,1)-0.4*xy(:,2),xy(:,2)];
tform2=maketform('custom',2,2,forward_fcn,inverse_fcn,[]);
XY = tformfwd{WZ, tform2)

在这里插入图片描述

WZ2=tforminv(XY,tform2)

在这里插入图片描述
对应垂直坐标的 xy的第二列在变换中没有变。

为了能对特殊的空间变换的效果有一个较好的感觉,目测变换对在网格上安排一组点的影响是有帮助的。下面的两个自定义 M-函数 pointgrid 和 vistform 可帮助目测检验给定的变换。

vistform(tforml, pointgrid([0 0;100 100])) 
figure, vistform(tform2, pointgrid([0 0;100 100]))

运行效果如下:

如图所示,第一个变换以不同的缩放因子延伸了水平和垂直轴;第二个变换以随垂直坐标变化的数量水平移动点。

(二)仿射变换

对于 2D空间,仿射变换可写成下式:
在这里插入图片描述
为了数学和计算方便,仿射变换可用附加第三坐标的方法写成矩阵相乘形式:
在这里插入图片描述
这个公式还可以写成下式:
在这里插入图片描述
其中,T称为仿射矩阵。在[x y]和[w z]向量上加 1 的符号约定将产生齐次坐标。对应tforml 的仿射矩阵是:
在这里插入图片描述
对应tforml 的仿射矩阵是:
在这里插入图片描述
函数 maketform 语法 tform = maketform(‘affine’, T) 从仿射矩阵直接创建 tform 结构。
编写代码:

T = [1 0 0;0.4 1 0; 0 0 1];
tform3 = maketform('affine', T);
WZ = [1 1; 3 2];
XY = tformfwd(WZ, tform3);

在这里插入图片描述
在这里插入图片描述
重要的仿射变换包括缩放、旋转、平移、裁剪和反射。下面分别介绍这几类:

图像缩放

图像比例缩放是指将给定的图像在x轴方向按比例缩放xf倍,在y轴按比例缩放yf倍,从而获得一幅新的图像。如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,称这样的比例缩放为图像的全比例缩放。如果fx不等于fy,图像的比例缩放会改变原始图象的像素间的相对位置,产生几何畸变。

编写代码:

img1=imread('D:\数字图像处理\第五章学习\dog2.jpg');
se=translate(strel(1),[100 100]);
img2=imresize(img1,0.2,'nearest');
img3=imresize(img1,1.5,'nearest');
figure(1);
imshow(img1),title('(a)原图像');
figure(2);
imshow(img2),title('(b)缩小图');
figure(3);
imshow(img3),title('(c)放大图');

代码运行效果如下:

图像平移

图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。

数学理论原理
设图像的高度为H,宽度为W,如下所示:
在这里插入图片描述
图像是由像素组成的,而像素的集合就相当于一个二维的矩阵,每一个像素都有一个“位置”,也就是像素都有一个坐标。假设原来的像素的位置坐标为(x0,y0),经过平移量(△x,△y)后,坐标变为(x1,y1),如下所示:
在这里插入图片描述
用数学式子表示可以表示为:

x1 = x0 + △x,
y1 = y0 + △y;

用矩阵表示为:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\cat3.jpg');
se=translate(strel(1),[100 100]);
img2=imdilate(img1,translate(strel(1),[-100 -100]));
img3=imdilate(img1,translate(strel(1),[100 -100]));
img4=imdilate(img1,translate(strel(1),[100 100]));
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)左上方平移');
subplot(2, 2, 3),imshow(img3);title('(c)左下方平移');  
subplot(2, 2, 4),imshow(img4);title('(c)右下方平移');  

代码运行效果如下:
在这里插入图片描述
图片镜像变换

图像的镜像变换分为两种:一种是水平镜像,另外一种是垂直镜像。

数学理论原理

图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换,示意图如下:

水平镜像中,原图中的(x0,y0)经过水平镜像后,坐标变成了(x0,W-y0),用数学公式表达就是:

x1 = x0;
y1 = W-y0 ;

写成矩阵就是:
在这里插入图片描述
也就是说,水平镜像变幻的矩阵因子为:
在这里插入图片描述
图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。示意图如下:

垂直镜像中,原图中的(x0,y0)经过垂直镜像后,坐标变成了(H-x0,y0),用数学公式表达就是:

x1 = H-x0;
y1 = y0 ;

写成矩阵就是:
在这里插入图片描述
也就是说,垂直镜像变换的矩阵因子为:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\dog6.tif');
tform1=maketform('affine',[-1 0 0;0 1 0;1 0 1]);
img2=imtransform(img1,tform1,'nearest');
tform2=maketform('affine',[1 0 0;0 -1 0;0 1 1]);
img3=imtransform(img1,tform2,'nearest');
subplot(1, 3, 1),imshow(img1);title('(a)原图像');
subplot(1, 3, 2),imshow(img2);title('(b)水平镜像');
subplot(1, 3, 3),imshow(img3);title('(c)垂直镜像');  

代码运行效果如下:
在这里插入图片描述
图像旋转
一般图像的旋转是以图像的中心为原点,旋转一定的角度。

数学理论原理

图像像素原来的坐标为(x0,y0),(顺时针)选择Θ角度后得到(x1,y1),用数学公式表达如下所示:
在这里插入图片描述
在这里插入图片描述
用矩阵表示如下所示:
在这里插入图片描述
编写代码:

img1=imread('D:\数字图像处理\第五章学习\cat2.jpg');
img2=imrotate(img1,270);
img3=imrotate(img1,90);
img4=imrotate(img1,180);
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)旋转270度');
subplot(2, 2, 3),imshow(img3);title('(c)旋转90度');  
subplot(2, 2, 4),imshow(img4);title('(d)旋转180度');  

代码运行效果如下:
在这里插入图片描述
注意:这里主要是说明一下imrotate函数,这个函数就是对图像旋转的函数,输入是图像和旋转的角度,角度为正值时,逆时针旋转;角度为负值时,顺时针选择。

图像的裁剪

有时候我们为了减少图像所占存储空间,舍弃图像的无用部分,只保留感兴趣的部分,则需要用到图像的剪取。

编写代码:

img1=imread('D:\数字图像处理\第五章学习\face.jpg');
img2=imcrop(img1,[100 100 100 100]);  %从坐标(0,0)开始,从原图上剪取一个长度为50,宽度为50的矩形部分
img3=imcrop(img1,[170 200 80 70]);
img4=imcrop(img1,[160 273 100 70]);
subplot(2, 2, 1),imshow(img1);title('(a)原图像');
subplot(2, 2, 2),imshow(img2);title('(b)剪取眼睛部分');
subplot(2, 2, 3),imshow(img3);title('(c)剪取鼻子部分');  
subplot(2, 2, 4),imshow(img4);title('(d)剪取嘴巴部分');  

代码运行效果如下:
在这里插入图片描述
实验结论:图像的放大,缩小,旋转,裁剪等图像几个变换的理论和实验过程已经广泛应用在许多领域,在图像处理中的许多方法和技术,包括图像增强,图像恢复,压缩编码等都以此为基础。但同时MATLAB进行几何变换也存在一些技术局限,如当图像面积太大 ,利用MATLAB实现图像的放大效果不明显,而且运用MATLAB进行裁剪时,要注意裁剪范围坐标是否超出原图像范围。

(三)投影变换

另一种有用的几何变换类型是投影变换,包括在空间情况下的仿射变换的投影变换在一幅 图像的逆透视变换中是很有用的。正如仿射变换那样,这对使用辅助第三维定义二维投影变换很有用。然而,与仿射变换不同,辅助坐标(在下边的公式中用 h来表示)不是常量。
在这里插入图片描述
其中,a11和a23是非零值, 在投影变换中,线映射为线,但是平行线不再保持平行。为了创建投影的 tform 结构,采用带有 maketform 函数的’projective’ 类型,例如:

编写代码:

T = [-2.7390 0.2929 -0.6373 
    0.7426 -0.7500 0.8088 
    2.8750 0.7500 1.0000];
tform = maketform('projective', T);
vistform(tform, pointgrid([0 0; 1 1]));

代码运行效果如下:

左边图为输入空间的点网格,右图为输出空间中变换后的点网格。 输入空间网格中有两组平行线, 一组是水平的,一组是垂直的。
在这里插入图片描述
上图显示了这两组平行线变换到输出空间后的线,在称为尽头点的位置交叉。尽头点位于地平线上,当变换的时候,仅平行于水平线的输入空间的线保持水平,所有的其他平行线变换为在位于地平线上尽头点处交叉的线。

(四)应用于图像的几何变换

图像处理工具箱函数 imtransform 使用逆映射过程把几何变换应用于图像。imtransform 的基本调用语法是:

g = imtransform(f, tform)
T=maketform(transformtype,Matrix);

编写代码:

f = checkerboard(50);
sx = 0.75;
sy = 1.25;
T = [sx 0 0
    0 sy 0
    0 0 1];
t1 = maketform('affine',T);     %创建缩放参数结构体
g1 = imtransform(f, t1);        %实现图像的缩放
theta = pi/6;

T2 = [ cos(theta) sin(theta) 0 
    -sin(theta) cos(theta) 0 
     0 0 1];
 t2 = maketform('affine', T2);    %创建旋转参数结构体
 g2 = imtransform(f, t2);         %实现图像旋转
 
 T3 = [0.4788 0.0135 -0.0009 
     0.0135 0.4788 -0.0009 
     0.5059 0.5059 1.0000]
 tform3 = maketform('projective',T3);
 g3 = imtransform(f, tform3);
 
subplot(2, 2, 1),imshow(f);title('(a)原图像');
subplot(2, 2, 2),imshow(g1);title('(b)仿射缩放变换');
subplot(2, 2, 3),imshow(g2);title('(c)仿射旋转变换');  
subplot(2, 2, 4),imshow(g3);title('(d)投影变换');  

代码运行效果如下:

总的来说,仿射变换可以理解为经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标域中的值。更简洁的说:仿射变换=线性变换+平移。参数transformtype指定了变换的类型,如上面的‘affine’为二维仿射变换,包括平移、旋转、比例、拉伸、错切等;Matrix为相应的仿射变换矩阵。

(五)MATLAB 中的图像坐标系统

像前面显示的许多图没有轴标记,这是函数imshow的默认行为。但是几何图像变换的分析和解释是通过显示这些形象的排列来辅助的。开启标记的一种方法是在调用imshow之后调用axis。例如:

f=imread('D:\数字图像处理\第五章学习\face.jpg');
imshow(f)
axis on
xlabel x
ylabel y

代码运行效果如下:

原点在左上角; X 轴是水平的,并向右延伸; 轴是垂直的, 并向下延伸。用于设置一定的用户参数选择的工具箱函数 iptsetpref 可用于始终产生 imshow 以显示记号标志。为转向带有记号和标记的显示,可调用:

iptsetpref imshowAxesVisible on

XData特性是两元素向量,其中,第一个元素指定像素的第一列中心的 x 坐标,第二个元素指定像素最后一列中心的 x 坐标。类似地,YData 的两个元素指定 了第一行和最后一行中心的y坐标。对于包含M行、 N列的图像来说,默认的XData向量是[1, N], 默认的 YData 向量是[1, M]。

编写代码:

f=imread('D:\数字图像处理\第五章学习\face.jpg');
imshow(f,'XData',[-20,20],'YData',[-10,10])
axis on
xlabel x
ylabel y

代码运行效果如下:

放大图像左上角

axis([8 8.5 0.8 1.1])

用上面命令放大图像左上角之后,发现已不再是方形。

5.1 输出图像位置

函数 imtransform 可以通过使用附加参数来提供输出空间中图像的位置信息。调用语法是:

[g, xdata, ydata] = imtransform(f, tform)

当使用 imshow 显示图像时,第 2个和第 3 个参数可以像XData和 YData 参数那样来使用。

用旋转和平移来研究如何在相同的坐标系统中与输入图像一起显示和定位输出图像,以使用标以记号的轴和标记显示原始图像开始。

编写代码:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
imshow(f)
hold on                              %调用hold on,以便后续的绘图或显示命令不清除该图
theta=3*pi/4;  
T=[cos(theta) sin(theta) 0
   -sin(theta) cos(theta) 0
   0           0          1];
tform=maketform('affine',T);
[g,xdata,ydata]=imtransform(f,tform,'FillValue',255);    %imtransform使图像旋转3*pi/4弧度
imshow(g,'XData',xdata,'YData',ydata)
axis auto                            %使用axis函数自动扩展轴的限制,以便两幅图像同时可见
axis on                              %打开标有记号的轴和标记

代码运行效果如下:

在结果中可以看到,仿射变换关于系统坐标原(0,0)旋转图像。 接下来,检验平移,这是比旋转简单的仿射变换。

编写代码:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
T=[1 0 0;0 1 0;500 200 1];    %以构成仿射变换tform结构开始,向右移动500,向下移动200
tform=maketform('affine',T);
g=imtransform(f,tform);
imshow(g)

代码运行效果如下:

5.2 控制输出网格

前面说明了如何用 xdata 和 ydata 参数形象化平移的效果,从输出 imtransform 到输 入 imshow。另一个方法是在输出空间中用imtransform 直接控制像素网格。通常,imtransform 在输出空间中用下列步骤定位和计算输出图像:
(1) 决定输入图像的边界矩形。
(2) 在边界矩形上把点变换到输出空间中。
(3) 计算变换后输出空间中点的边界矩形。
(4) 计算位于输出空间中、边界矩形内的网格上的输出图像像素。

如下自定义函数说明了 xdata 和 ydata 参数的使用。这是 imtransform 的另一个变异, 总使用像输出空间矩形那样的输入空间矩形。这样一来,输入和输出图像的位置便可更直接地 进行比较:

function g=imtransform2(f,varargin)
% IMTRANSFORM2 2-D image transformation with fixed output location
% G=IMTRANSFORM2(F,TFORM,...)applies a 2-D geometric
% transformation to an image.IMTRANSFORM2 fixes the output image
% location to cover the same region as the input image.
% IMTRANSFORM2 takes the same set of optional parameter/value
% pairs as IMTRANSFORM.
[M,N]=size(f);
xdata=[1 N];
ydata=[1 M];
g=imtransform(f,varargin{:},'XData',xdata,'YData',ydata);

函数 imtransform2 是封装函数的典型示例。封装函数接受输入,有可能改进它们或把它们相加,然后把它们传递给另一个函数。

针对几个几何变换,比较imtransform 和imtransform2 的输出。

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
tform1=maketform('affine',[1 0 0;0 1 0;300 500 1]);
g1=imtransform2(f,tform1,'FillValue',200);
h1=imtransform(f,tform1,'FillValue',200);
tform2=maketform('affine',[0.25 0 0;0 0.25 0;0 0 1]);
g2=imtransform2(f,tform2,'FillValues',200);
h2=imtransform(f,tform2,'FillValues',200);
subplot(2, 3, 1),imshow(f);title('(a)原图像');
subplot(2, 3, 2),imshow(g1);title('(b)用函数 imtransform2 平移图像');
subplot(2, 3, 3),imshow(h1);title('(c)用 imtransform 和默认参数平移图像');  
figure;imshow(g2),title('(d)用imtransform2 缩放图像');  
figure;imshow(h2),title('(e)用imtransform和默认参数缩放图像');  

代码运行效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验结论:从图可以看出(b)显示了使用imtransform2 的结果,与(a)进行比较,可以很容易地 看出平移的效果。注意图 (b),输出图像的一部分已被切掉,而在图( c )中,显示了使用imtransform的结果,全部输出图像是可见的,但是失去了平移效果。两个输出(图 (d)和(e))显示了全部输出图像。从 imtransform2 的输出可以看到,虽然比变换后的图像大,但填充的像素灰度很协调,而来自函数 imtransform 的输出刚好包含变换后的图像。

(六)图像内插

对于数字图像,f的值仅在整数值位置是知道的。使用这些已知的值去估计在非整数值位 置的/是内插的典型示例— —用离散数据构建连续定义的函数。内插具有很长的历史,很多年 来,已经提出了众多的内插方法。在信号处理文献中,内插常常被解释为拥有两个设计步骤的重取样过程:
(1) 把连续变换离散化,把拥有连续域定义的函数尸转换为在离散域定义的函数f。
(2) 在离散位置估计f’的值。
当知道f的取样是有规律的间隔时,这个解释最有用。从离散到连续的变换步骤,可以用缩放和移动过的函数的求和来明确地表达,该函数叫做内插核。

一些常用的内插核:盒状核hgh_g(x)、三角核hT(x)h_T(x)

盒装核由下式定义:
在这里插入图片描述
三角核由下式定义:
在这里插入图片描述

6.1 二维内插

在图像处理中,最常用的二维内插方法是把问题分成一系列的多个一维内插任务。
在这里插入图片描述
上图说明了使用几个特定值的过程。在这个过程中,f’(2.6,1.4)是由围绕着f(x,y)的样本用一维序列的线性内插得到的:
(1) 用f(2,1)和f(3,1)之间的线性内插决定f’(2.6,1.0)。
(2) 用f(2, 2)和f(3, 2)之间的线性内插决定f’(2.6,2.0)。
(3) 用f’(2.6,1.0)和f’(2.6,2.0)之间的线性内插决定f’(2.6,1.4)。
用一系列的一维线性内插实现二维内插的处理方法被称为双线性内插。类似地,双三次内插是用一系列的一维三次内插完成的。

6.2 内插方法的比较

不同内插方法在计算速度和输出质量方面是不同的。用于说明赞成和反对不同内插方法的经典测试是重复旋转。

针对最近邻、双线性和双三次内插,用 reprotate 比较计算速度和图像质量。 函数连续旋转输入12次,由调用者指定要使用的内插方法。首先,用 timeit 记录每一种方法的时间:

timeit(@() reprotate(f, 'nearest'));

在这里插入图片描述

timeit(@() reprotate(f,'bilinear'));

在这里插入图片描述

timeit(@() reprotate(f,'bicubic'));

在这里插入图片描述
正如预期的那样,最近邻内插最快,双三次内插最慢。

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
f=rgb2gray(f);
subplot(2, 2, 1), imshow(f);title('(a)原图像');
subplot(2, 2, 2), imshow(reprotate(f,'nearest'));title('(b)最近邻内插');
subplot(2, 2, 3), imshow(reprotate(f,'bilinear'));title('(c)双线性内插');
subplot(2, 2, 4), imshow(reprotate(f,'bicubic'));title('(d)双三次内插');   %必须是灰度图像

实验结论:由图可以看出(b)中的最近邻结果显示出存在很大的“锯齿”边缘失真。( c ) 中的双线性内插结果有较平滑的边缘,但整个外观有点模糊。(d)中的双三次内插看起来最好,比起双线性内插有更平滑的边缘和更少的模糊。注意,对于重复的 12 次旋转,只有图像中心处的像素仍属于非边界像素。保留的像素是黑色的。

(七) 图像配准

几何变换最重要的图像处理应用之一是图像配准。图像配准方法寻求对准两幅或多幅相同场景的图像。例如,可能是对准不同时间获取的图像,计量的时差可能是一个月或一年。在同时获取多幅图像时,会有不同的情节发生,但采用不同的手段。例如,为了测量场景 深度,在不同位置的两台摄像机可能同时获取相同场景同时发生的图像。有时,图像来自不同的设备。两幅卫星图像可能在分辨率和空间特性上都不同。 在这种情况下,目标常常是把个别的图像融合为单一图像以增强图像的可视性。

7.1 配准处理

图像配准方法通常由下列基本步骤组成:
(1) 检测特征
(2) 匹配相应的特征
(3) 推断几何变换
(4) 通过几何变换用另一幅图像对准一幅图像
一幅图像的特征可以是图像的任何部分,可以是两幅图像中潜在的、可识别和可定位的部 分。例如,特征可以是点、线或角。一旦选择了特征,就要匹配特征。图像配准方法可以是手工的或自动 的,这取决于特征检测和配准是由人辅助的还是用自动算法执行。

7.2 使用 cpselect 的手工特征选择和匹配

图像处理工具箱为图像特征使用“控制点”这一术语。工具箱为手工选择和匹配被配准的 一对图像的相应控制点提供了名为控制点选择工具(cpselect)的GUI (图形用户界面)。把被对 准图像的文件名作为输入参量发送到 cpselect, 例如:

cpselect('D:\数字图像处理\第五章学习\cat5.jpg’ , 'D:\数字图像处理\第五章学习\cat.jpg') 

作为另一选择,也可以首先把图像读进 MATLAB变量,然后再传送给 cpselect:

f=imread('D:\数字图像处理\第五章学习\cat5.jpg');
g = imread('D:\数字图像处理\第五章学习\cat.jpg');
cpselect(f, g)

cpselect工具可帮助在大图像中导航(放大、摇镜头和滚动),可以选择特征(控制点),并用鼠标在图像上点击以与其他控制点配对。

代码运行效果如下:
在这里插入图片描述

7.3 使用 cp2tform 推断变换参数

一旦特征对被识别和匹配,图像配准处理的下一步就是确定几何变换函数。通常是首先选 择某个特定的变换模型,然后估计必需的参数。例如,可能决定某个仿射变换是合适的,并且 用相应的特征对推导仿射变换矩阵。图像处理工具箱为从特征对推断几何变换参数提供了函数 cp2tforrrio cp2tform 的语法是:

tform = cp2tform (input—points, base_points, transformtype)

参数 input_points 和 base_points 是两个PX2大小的包含相应特征位置的矩阵。

7.4 基于区域的配准

对于外在特征选择和匹配的可供选择的方法是基于区域的配准。在基于区域的配准中,称作模板图像的一幅图像被移动以覆盖第二幅图像的每个位置。在每个位置,计算基于区域的相似性度量。如果在相似性度量中,在某个特定位置找到明显的峰值,就可以说模板图像在第二幅图像的某个特定位置匹配。 使用函数 normxcorr2 在图像中定位模板,调用语法是:

g = normxcorr2(template, f)
f=rgb2gray(imread('D:\数字图像处理\第五章学习\cat5.jpg'));
w = rgb2gray(imread('D:\数字图像处理\第五章学习\cat.jpg'));
g = normxcorr2(w, f);
subplot(1, 3, 1), imshow(f);title('(a)原图像');
subplot(1, 3, 2), imshow(w);title('(b)模板');
subplot(1, 3, 3), imshow(abs(g));title('(c)归一化相关的绝对值');

在这里插入图片描述
实验结论:这个例子使用 normxcorr2 在模板和图像之间寻找最好匹配的位置。首先,读入模板和图像,然后使用 normxcorr2 计算和显示归一化互相关,图( c )显示了归一化互相关图像,最亮的点,该点指出了图像和模板之间的匹配。 除了归一化互相关外,近几年来,在图像处理文献中还提出了许多其他基于区域的相似性 度量。例如平方差的和、绝对差的和。不同的度量,因素也不同。在简单的情况下,用归一化互相关或其他相似性度量的模板匹配也可用于匹配两幅重叠的图像。

2016-05-15 17:55:36 a352611 阅读数 5556

该系列文章为 OpenCV+Python Tutorials的学习笔记
代码托管在Github
转载请注明: http://blog.csdn.net/a352611/article/details/51417779 [三记的博客]

写在文章开始之前:
关于几何变换,常见的资料都没有把数学原理部分讲透彻,基本都是照着课本说,导致我很多地方无法彻底理解.思前想后还是把这一块分成两个部分,一部分专门讲数学原理,一部分专门讲应用.本文为数学原理部分。


1. 几何变换的数学本质 Geometry Transformation

对图像的几何变换本质上是一种线性变换,其数学本质为

Inew=TIoldI_{new}= TI_{old}

即通过变换矩阵TT将原图上的点的位置IoldI_{old}变换到新的位置,从而得到新的图像InewI_{new}

2DTransformation

2D平面变换示意图(“Computer Vision: Algorithms and Applications”, Richard Szeliski)

  • Translation 平移
  • Euclidean(rigid, rotation) 旋转
  • Scale 缩放;图中没有画出
  • Similarity 相似变换;结合旋转,平移和缩放
  • Affine 仿射变换;想象在similarity的基础上用两只手对图像进行按压拉伸
  • Projective 投影变换;想象投影仪做的事情,将一个面投影到另外一个面的情况

2. 齐次坐标 Homogeneous coordinates

简单的说法就是对于点P=[x;y]TP=[x;y]^T我们无从得知这是一个点还是向量,之所以纠结这个概念的原因在于:平移对于向量没有意义,但对点有意义。我们希望对线性变换有一个统一的描述,结果发现在Homogeneous coordinates齐次坐标下我们能够和谐统一地描述这些。怎么把一个点转换到齐次坐标下来描述呢?很简单的一个方法是

直接将点P=[x;y]TP=[x;y]^T变为P=[x;y;1]TP=[x;y;1]^T
而向量P=[x;y]TP=[x;y]^T变为P=[x;y;0]TP=[x;y;0]^T

由于我们的变换矩阵是一个3x3的矩阵,最后一列的意义就是平移,这样就实现平移对向量无效,也能让线性变换统一写为Pnew=TPoldP_{new}=TP_{old}TT为变换矩阵,最后还要从齐次坐标转换回我们的欧几里得坐标。
完整的Homogeneous coordinates概念请翻阅"Multiple View Geometry in computer vision", Richard Hartley and Andrew Zisserman
平行线相交于一点

3. 缩放、旋转、平移 Scaling,Rotation,Translation

3.1. 缩放 Scaling

T=[fx00fy]T=[fx000fy0001]T= \left[ \begin{array}{ccc} f_x&0\\ 0&f_y\\ \end{array} \right] 其次坐标下 T= \left[ \begin{array}{ccc} f_x&0&0\\ 0&f_y&0\\ 0&0&1\\ \end{array} \right]
fx,fyf_x,f_y分别为x方向和y方向的缩放系数

3.2. 旋转 Rotation

T=[cos(θ)sin(θ)sin(θ)cos(θ)]T=[cos(θ)sin(θ)0sin(θ)cos(θ)0001]T= \left[ \begin{array}{ccc} cos(\theta)&-sin(\theta)\\ sin(\theta)&cos(\theta)\\ \end{array} \right] 其次坐标下 T= \left[ \begin{array}{ccc} cos(\theta)&-sin(\theta)&0\\ sin(\theta)&cos(\theta)&0\\ 0&0&1\\ \end{array} \right]

3.3. 平移 Translation

只有齐次坐标系下的表示
T=[10tx01ty001] T= \left[ \begin{array}{ccc} 1&0&t_x\\ 0&1&t_y\\ 0&0&1\\ \end{array} \right]
tx,tyt_x,t_y分别为x方向和y方向的平移距离

4. 仿射变换 Affine

T=[a0a1a2a3a4a5001] T= \left[ \begin{array}{ccc} a_0&a_1&a_2\\ a_3&a_4&a_5\\ 0&0&1\\ \end{array} \right]

5. 投影变换 Perspective

T=[H0H1H2H3H4H5H6H7H8] T= \left[ \begin{array}{ccc} H_0&H_1&H_2\\ H_3&H_4&H_5\\ H_6&H_7&H_8\\ \end{array} \right]

2019-03-20 09:16:40 Eastmount 阅读数 5953

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
[Python图像处理] 七.图像阈值化处理及算法对比
[Python图像处理] 八.图像腐蚀与图像膨胀
[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算
[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图

前面的第六篇文章讲解了图像缩放、图像旋转、图像翻转和图像平移的几何变换,本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实。基础性知识希望对您有所帮助。
1.图像仿射变换
2.图像透视变换
3.基于图像透视变换的图像校正
4.图像几何变换总结

PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

参考文献:
Python下opencv使用笔记(三)(图像的几何变换)
数字图像处理——图像的几何变换
图像校正-透视变换——t6_17


一.图像仿射变换

图像仿射变换又称为图像仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。通常图像的旋转加上拉升就是图像仿射变换,仿射变换需要一个M矩阵实现,但是由于仿射变换比较复杂,很难找到这个M矩阵.

OpenCV提供了根据变换前后三个点的对应关系来自动求解M的函数——cv2.getAffineTransform(pos1,pos2),其中pos1和pos2表示变换前后的对应位置关系,输出的结果为仿射矩阵M,接着使用函数cv2.warpAffine()实现图像仿射变换。图5-14是仿射变换的前后效果图。

图像仿射变换的函数原型如下:
M = cv2.getAffineTransform(pos1,pos2)

  • pos1表示变换前的位置
  • pos2表示变换后的位置

cv2.warpAffine(src, M, (cols, rows))

  • src表示原始图像
  • M表示仿射变换矩阵
  • (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数

实现代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src = cv2.imread('test.bmp')

#获取图像大小
rows, cols = src.shape[:2]

#设置图像仿射变换矩阵
pos1 = np.float32([[50,50], [200,50], [50,200]])
pos2 = np.float32([[10,100], [200,50], [100,250]])
M = cv2.getAffineTransform(pos1, pos2)

#图像仿射变换
result = cv2.warpAffine(src, M, (cols, rows))

#显示图像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出效果图如下所示:


二.图像透视变换

图像透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,同理OpenCV通过函数cv2.getPerspectiveTransform(pos1,pos2)构造矩阵M,其中pos1和pos2分别表示变换前后的4个点对应位置。得到M后在通过函数cv2.warpPerspective(src,M,(cols,rows))进行透视变换。

图像透视变换的函数原型如下:

M = cv2.getPerspectiveTransform(pos1, pos2)

  • pos1表示透视变换前的4个点对应位置
  • pos2表示透视变换后的4个点对应位置

cv2.warpPerspective(src,M,(cols,rows))

  • src表示原始图像
  • M表示透视变换矩阵
  • (rows,cols)表示变换后的图像大小,rows表示行数,cols表示列数

代码如下:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src = cv2.imread('test01.jpg')

#获取图像大小
rows, cols = src.shape[:2]

#设置图像透视变换矩阵
pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])
pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])
M = cv2.getPerspectiveTransform(pos1, pos2)

#图像透视变换
result = cv2.warpPerspective(src, M, (190, 272))

#显示图像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:


三.基于图像透视变换的图像校正

下面参考 t6_17大神 的文章,通过图像透视变换实现图像校正功能。

假设现在存在一张A4纸图像,现在需要通过调用图像透视变换校正图像。

代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src = cv2.imread('test01.jpg')

#获取图像大小
rows, cols = src.shape[:2]

#将源图像高斯模糊
img = cv2.GaussianBlur(src, (3,3), 0)
#进行灰度化处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#边缘检测(检测出图像的边缘信息)
edges = cv2.Canny(gray,50,250,apertureSize = 3)
cv2.imwrite("canny.jpg", edges)

#通过霍夫变换得到A4纸边缘
lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)

#下面输出的四个点分别为四个顶点
for x1,y1,x2,y2 in lines[0]:
    print(x1,y1),(x2,y2)
for x1,y1,x2,y2 in lines[1]:
    print(x1,y1),(x2,y2)

#绘制边缘
for x1,y1,x2,y2 in lines[0]:
    cv2.line(gray, (x1,y1), (x2,y2), (0,0,255), 1)

#根据四个顶点设置图像透视变换矩阵
pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])
pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])
M = cv2.getPerspectiveTransform(pos1, pos2)

#图像透视变换
result = cv2.warpPerspective(src, M, (190, 272))

#显示图像
cv2.imshow("original", src)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下图所示:


四.图像几何变换总结

最后补充图像几何代码所有变换,希望读者能体会下相关的代码,并动手实践下。输出结果以女神为例:

完整代码如下:

#encoding:utf-8
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#读取图片
img = cv2.imread('test3.jpg')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#图像平移矩阵
M = np.float32([[1, 0, 80], [0, 1, 30]])
rows, cols = image.shape[:2]
img1 = cv2.warpAffine(image, M, (cols, rows))

#图像缩小
img2 = cv2.resize(image, (200,100))

#图像放大
img3 = cv2.resize(image, None, fx=1.1, fy=1.1)

#绕图像的中心旋转
#源图像的高、宽 以及通道数
rows, cols, channel = image.shape
#函数参数:旋转中心 旋转度数 scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) 
#函数参数:原始图像 旋转参数 元素图像宽高
img4 = cv2.warpAffine(image, M, (cols, rows))

#图像翻转
img5 = cv2.flip(image, 0)   #参数=0以X轴为对称轴翻转 
img6 = cv2.flip(image, 1)   #参数>0以Y轴为对称轴翻转

#图像的仿射
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
img7 = cv2.warpAffine(image, M, (rows,cols))

#图像的透射
pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]])
pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])
M = cv2.getPerspectiveTransform(pts1,pts2)
img8 = cv2.warpPerspective(image,M,(200,200))


#循环显示图形
titles = [ 'source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission']  
images = [image, img1, img2, img3, img4, img5, img6, img7, img8]  
for i in xrange(9):  
   plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。最近连续奔波考博,经历的事情太多,有喜有悲,需要改变自己好好对家人,也希望读者与我一起加油。
(By:Eastmount 2019-03-20 早上12点 https://blog.csdn.net/Eastmount/)