前天老师要作报告,报告来这的2周的学习成果。先是学长们,主要就是给我们理理关于图形图像的思路吧。然后,是新生。等轮到偶的时候,已经是午饭了,悲催的是我的报告果真是整理的所学的,列了那么多知识点~看着大家都饿了,偶怎么好意思还在那里念我的知识点呢,况且大家也都不屑吧。。。。当时好囧喔,因为关于图像,从来没接触过,都听不懂哪
。。。于是,昨天开始看图像了。整理下吧:
第一章 windows位图和调色板
关于图像的存储方法:
Ex:有一个长宽各位200个像素,颜色数为16色的彩色图,每一个像素都用RGB 3个分量表示。
① 最易想到,最原始的存储方法:
因为每个分量有256个级别,要用8bit,即1 byte 来表示,所以每个像素需要用 3 byte。So,整个图像要用 200 * 200 * 3,约 120k byte。
② 调色板 palette
我们用一个表,表中每一行记录一种颜色的 R G B 值,而列数等于颜色数。这样 一行需要 3 byte ( R G B 各占1 byte),16 个状态需要 16 行。所以,表占用的字节共 3 * 16 = 48 byte。
图像只有16个颜色,就是16种状态,只需要 4 bit = 0.5byte 用来给它们编号,以在表中查找到该颜色的具体 RGB 值。
这样,采用 调色板 存储该图像 共需要的存储空间是: 200 * 200 * 16 * 0.5 + 3 * 16 (byte)
这样所占用的字节数约为前面的1/6,节省了不少呢。
另,关于 真彩色图的存储:
所谓真彩色图,是指他的颜色数高达 256 * 256 * 256,也就是包含了RGB颜色表示方法中的所有颜色。但是并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力。即最多可以包含所有的颜色。
如果这时还要采用 调色板技术 :
调色板: 颜色数 * 3 = 256 * 256 * 256 * 3
颜色的索引:log (256 * 256 * 256)= 24 bit = 3 byte
而直接利用 R G B三个分量表示 一个像素只需要 3byte 而已。反而节省了存储调色板的空间。
所以:
对于2色位图,用1位就可以表示该像素的颜色,一个字节可以表示8个像素。
对于16色位图,用4位可以表示一个像素的颜色,一个字节可以表示2个像素。
对于256色位图,一个字节刚好可以表示1个像素。
Notice:
① 每一行的字节数必须是4的整数倍,如果不是需要补齐。
② 一般来说,.bmp文件的数据从下到上,从左到右。
Bmp文件格式:
大体可以分成4部分:
位图头文件 BITMAPFILEHEADER
位图信息头 BITMAPINFOHEADER
调色板 Palette
实际的位图数据 ImageDate
第二章:图像的几何变换
平移 旋转 镜像 转置 放缩
平移:
初始坐标(x0, y0)的点经过平移(tx, ty) (以向右,向下为正方向)后,坐标变为(x1, y1)。这两点之间的关系是x1 = x0 + tx y1 = y0 + ty
以矩阵的形式表示:
它的逆变换:
平移后的图像中每个像素的颜色,它的RGB值和它平移前那点是一样的。所以,通过逆变换,我们可以得到平移前的那点。
x1 - tx = x0 y1 - ty = y0
这样就可以得到平移后的点(x1 ,y1)的原始点(即平移前的点)了,也就知道了它的RGB值。
那么,如果新图中有一点,按照逆变换的公式得到的对应的平移之前的点不在原图中该怎么办呢?通常是把该点的RGB值统一设为(0,0,0) or (255, 255, 255)
还有一个问题,平移后的图像是否要放大 ?一种方法是不放大,移出的部分被截断。另一种做法是,将图像放大,使得能够显示下所有部分。这种处理,文件大小要改变。设原图的宽和高分别是 w1 h1 ,则新图的宽和高变为 w1+| tx| h1 + | ty | . | | 表示tx ty 可能为负,即向左向上移动。
灰度图grayscale
灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的。要表示灰度图,就需要把亮度值进行量化。
.bmp 文件中,没有灰度图这个概念,但是可以很easy的在bmp文件中表示灰度图:用256色的调色板。这个调色板的每一项RGB值都是相同的。
YUV表示方法:
Y分量的物理含义是亮度,U & V分量代表了色差信号。
Y代表了亮度,所以Y包含了灰度图的所有信息,只用Y分量就可以完全表示出一幅灰度图来。加上U V 分量,就可以表示彩色信息了。 这样,用一种方法就可以在灰度和色彩图之间切换,而RGB表示方法就做不到这一点了。
由于人眼对亮度信号非常敏感,对色差信号的敏感程度相对较弱。所以,图像的主要信息应该包含在Y分量中。So,对YUV信号进行量化时,可让Y的量化级别多些,让UV量化级别少些,就可以实现图像信息的压缩。
YUV 和 RGB之间存在对应关系。当RGB= (a, a, a) 时,YUV = (a , 0,0)
使用灰度图的好处:
① RGB的值都一样。
② 图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。
③ 因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。
所以,做图像处理时都采用灰度图。
Translation 思想:
首先,将所有区域填成白色
然后,找到平移后显示区域的左上角(x0, y0) 和右下角点(x1, y1)
① tx <= -width :图像完全移出了屏幕,不用做任何处理
② – width < tx <=0 : 图像向左平移,但是没有完全移除屏幕的情况。此时,图像区域的x范围是从 0 到 width - |tx|
③ 0< tx < width :图像向右平移,但是还没有完全移除屏幕。图像区域的x范围从 tx -> width 。对应原图的范围是从 0 到 width – tx。
④ tx >= width :图像完全移出了屏幕,不做任何处理。
Y方向类似。。。。。
这种做法是利用了位图存储的连续性,即同一行的像素在内存中是相邻的。Memcpy函数从 (x0, y0) 点开始,一次可以拷贝一整行(宽度为 x1 – x0 ),然后将内存指针移到 (x0, y0 + 1)处,拷贝下一行。这样拷贝(y1 – y0)行就完成了全部操作。
旋转:rotation
Ex:以图像的中心为圆心旋转:。。。。。
旋转后的图像变大了,转出的部分可以裁减掉。
思想:
① 将坐标系O’ 变成 O
② 将该点顺时针旋转 a角
③ 将坐标系O变回 O’
镜像 mirror
水平镜像: x坐标取反后加上图像的宽度
垂直镜像: y坐标取反后加上图像的高度
转置 transpose
是将x y 坐标对换。 Notice : 转置和旋转90°是有区别的。
转置后的宽高对换了。
缩放 zoom
假设放大因子为 ratio ,为了避免新图过大或过小,限制 0.25 <= ratio <= 4
第三章 图像的平滑(去噪声)、锐化
平滑 smoothing,是图像看起来柔和一些,模糊一些。
灰度突变,是指图像中出现了与相邻像素的灰度相差很大的点。在频域中代表了一种高频分量。低通滤波器可以滤掉高频分量,从而达到减少图像噪声的目的。
实现方法:将图中的每一点的灰度和它周围8个点的灰度相加,然后除以 9 ,作为新图中对应点的灰度。这种标识方法称为 模板 template 。
模板不允许移除边界,所以结果图像会比原图小。 对于边界上无法进行模板操作的点,通常是复制原图的灰度,不进行任何处理。
模板操作实现了一种邻域运算,即某个像素点的结果不仅和该像素灰度有关,而且和其邻域点的值有关。
平滑模板的思想是通过将一点和周围8个点做平均,从而去除突然变化的点,滤掉噪声,其代价是图像有一定程度的模糊。
Box模板:考虑了邻域点的作用,但并没有考虑各点位置的影响,对于9个点都一视同仁,所以平滑的效果并不理想。
高斯模板:实际上,离某点越近的点对该点的影响应该越大,所以考虑 加权系数。
中值滤波
是一种典型的低通滤波器,目的是保护图像边缘的同时去除噪声。所谓中值滤波,是指以某点(x,y)为中心的小窗口内的像素的灰度按从大到小的顺序排列,将中间值作为(x,y)处得灰度值。
应用中值滤波,能很好地保持原来的边界。所以说,中值滤波的特点就是 保护图像边缘 的同时 去除噪声。
高斯噪声:图中有很多噪声点,并且是杂乱无章的,随即分布的。
脉冲 impulse :图像中间的灰度要比两边的高许多
总结:
中值滤波容易去除 孤立点、线的噪声,同时保持图像的边缘,能很好的去除二值噪声,但对于高斯噪声无能为力。但是,当窗口内噪声点的个数大于窗口宽度的一半时,中值滤波的效果不好。
锐化:
与平滑相反,是通过增强高频分量来减少图像中的模糊,因此又称为 高通滤波 。
锐化处理 在增强图像边缘的同时增加了图像的噪声。
常用的锐化模板是 拉普拉斯 Laplacian 模板。
拉普拉斯模板的作法:先将自身与周围8个像素相减,表示自身与周围像素的差别,再将这个差别加上自身作为新像素的灰度。可见,如果一片暗区中出现了一个亮点,那么锐化处理的结果是这个亮点变得更亮,增加了图像的噪声。
因为图像中的边缘就是那些灰度发生跳变的区域,所以 锐化模板 在边缘检测中很有用。
第四章 图像的半影调和抖动技术
半影调技术(halftone):是指由二值图像显示出灰度效果的方法。主要用在 在只有二值输出的打印机上打印图像。 有两种方法可以实现:图案法和抖动法。
图案法 (patterning) 是指灰度可以用一定比例的黑白点组成的区域表示,从而达到整体图像的灰度感。黑白点的位置选择称为 图案化 。图案化使用图案来表示像素的灰度。
抖动法: 有时候即使采用了图案化技术,仍然得不到要求的灰度级别(比如,当一幅灰度图用一定分辨率的打印机将其打印到 一定尺寸的纸上上,每个像素可以用 x 个点大小的图案来表示,但是最多能表示 x + 1 级灰度,无法满足图像的灰度级。)这时可以采用两种方法来解决: ① 减小图像尺寸 ② 降低图像灰度级 ③ 抖动法 dithering
方法③可以更好的解决这个问题。
抖动法。 有规则抖动(regular dithering) ,它的算法简单,但是图案化有时很明显。这时因为取模运算虽然引入了随机成分,但还是有规律的。另外,点之间进行比较时,只要比标准图案上点的值大就打白点,这样并不理想,因为,如果标准图案点的灰度值本身就很小,而图像中点的灰度只比它大一点时,图像中的点更接近黑色而不是白色。一种更好的方法是将这个误差传播到邻近的像素。
将bmp文件转换为txt文件
Bmp2txt 应用程序能把位图文件转成和图案很相似的字符文本。用到了图案化类似的思想: 首先,将位图分成同样大小的小块,求出每一块灰度的平均值,然后和每个字符的灰度做比较,找出最接近的那个字符,来代表这一小块图像。
第五章 直方图修正和彩色变换
直方图修正和彩色变换反色
反色invert 就是形成底片效果。
反色的含义是将RGB值反转。若颜色的量化级别是256,则新图的RGB值为 255 减去 原图的 RGB值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为 伪彩图)、灰度图。
针对不同类型有不同处理:
真彩图: 真彩图不带调色板,每个像素用3byte ,表示 RGB 三个分量。所以处理很简单,只需要把翻转后的RGB值写入新图即可。
带调色板的彩色图: 位图中的数据只是对应调色板中的一个索引值,所以我们只需要将调色板反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图: 灰度图是一种特殊的为彩色图,只不过调色板中的 RGB 值都一样而已。所以,反转方法和上面一样。
【二值图,不一定是黑白图。而是说它的调色板中有2中颜色。所以,二值图 也可以是 彩色 的,只不过一般情况下是黑白图而已。】
彩色图转灰度图:
YUV表示方法中,Y分量的物理含义是亮度,它包含了 灰度图 grayscale 的所有信息,只用 Y 分量就完全能够表示出一幅灰度图来。
根据YUV 和RGB 的对应关系,可以根据RGB的值求出 Y值,然后将RGB的值都赋值成Y,就能表示出灰度图来,这就是彩色图转灰度图的原理。
真彩图: 不带调色板,所以处理很简单,根据RGB的值求出Y值后,将RGB值都赋值Y,写入新图即可。
带调色板的彩色图:位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的彩色变成灰度,形成新调色板,而位图数据不用动,就OK啦。
真彩图转 256 色图
真彩图包含最多 2的24次方种颜色,怎样从中选出 256 中颜色,又要使颜色的是真比较小?
方法一:将 R : G : B 以 3 : 3 : 2 表示,即取 R G 的高3位, B 的高 2 位,组成一个字节,这样就可以表示 256 中颜色了。但是,这样失真肯定很严重。
方法二:准备一个 4096 的数组,代表 4096 种颜色。对图中的每一个像素,取 R G B的最高四位(四位?只用一半?这样就可以做到失真不严重了么?R G B是怎么表示的?本来是8位的,只用前四位就可以。。。。?额。。。不明白。。。),拼成一个12位的整数,对应的数组元素加1.全部统计完后,就得到了这 4096 种颜色的使用频率。其中,可能有一些颜色一次都没有使用到,即对应数组元素为 0 (假设不为0 的数组 共有PalCounts 个)将这些为0 的数组元素清除,使得前 PalCounts 个元素都不为0.将这PalCounts 个数按从小到大的顺序排列。这样,前 256 种颜色就是用的最多的颜色,它们将作为调色板上的256种颜色。对于剩下的 PalCounts – 256 种颜色不是简单的丢弃,而是用前 256 种颜色中的一种来代替,代替的原则是找有最小平方误差的那个。再次对图中的每个像素,取 RGB的最高四位,拼成一个12位的整数,如果对应值在前 256 种颜色中,则直接将该索引值填入位图数据中,如果是在后PalCounts – 256 种颜色中,则用代替色的索引值填入位图数据中。
对比度扩展:
低对比度是指 灰度都挤在一起,没有拉开。
灰度扩展是指 把所感兴趣的灰度范围拉开,使得该范围内的像素亮的越亮,暗的越暗,从未达到了增强对比度的目的。
削波cliping 可以看作是对比度扩展的一个特例。
阈值化 thresholding 可以看作是削波得一个特例。
灰度窗口变换 slicing 是将某一区间的灰度级和其它部分(背景)分开。
灰度窗口变换有2种:一种是清除背景的,一种是保留背景的。前者把不在灰度窗口范围内的像素都赋为0,在灰度窗口范围内的像素都赋值为 255 ,这也能实现灰度图的二值化;后者把不在灰度窗口范围内的像素保留原灰度值,在灰度窗口范围内的像素都赋值为 255 。灰度窗口变换可以检测出在某一灰度窗口范围内的所有像素,是图像灰度分析中的一个有力工具。
灰度直方图统计histogram 用来描述一幅图中的灰度分布情况
横坐标表示 灰度值 ,纵坐标 表示 灰度值 出现的次数
灰度直方图均衡化 histogram equalization
直方图修正,是通过一个灰度映射函数Gnew = F(Gold) , 将元灰度直方图改造成你所希望的直方图。所以,直方图修正的关键就是灰度映射函数。(阈值化、削波、灰度窗口变换等都是灰度映射函数)
直方图均衡化 是一种最常用的直方图修正。它把给定图像的直方图分布改造成均匀直方图分布。用信息学的理论来解释,具有最大熵(信息量)的图像为均衡化图像。直观地讲,直方图均衡化导致图像的对比度增加
【看的很粗糙,用到得时候再细化吧,】
第六章 腐蚀 , 膨胀, 细化算法
【数学形态学】 的主要用途是获取物体拓扑和结构信息,它通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。在图像处理中的应用主要是:①利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的 ②描述和定义图像的各种几何参数和特征,如面积、周长、连通度、颗粒度、骨架和方向性等。
二值图像的形态学运算。。。。。。
一些基本符号和关系:元素、包含、击中、不击中、补集、结构元素(刷子)、对称集、平移、
腐蚀:把结构元素B平移a后得到 Ba, 若Ba包含于X,记下这个a点。所有满足上述条件的a点组成的集合称作X被B腐蚀 Erosion 的结果。【区域显然变小了】
膨胀: Dilation ,可以看做是腐蚀的对偶运算。定义是:把结构元素B平移a后得到Ba,若Ba 击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称作X被B膨胀的结果。【区域变大了】
开:先腐蚀,后膨胀称为 开 open。
闭:先膨胀,后腐蚀称为 闭 close。
细化:thinning ,就是从原图的图中去掉一些点,但仍要保持原来的形状。实际上,是保持原图的骨架。所谓骨架,可以理解为 图像的中轴。细化就是把不是骨架的点去掉。如下判断依据:①内部点不能删 ②孤立点不能删 ③直线端点不能删 ④如果P是边界点,去掉P后,如果联通分量不增加,则P才可以被删除。
第七章 边缘检测与提取 轮廓追踪
边沿检测:当一幅图像左右两边的灰度值相差很大时,中间就存在着一条很明显的边界。利用模板(-1, 0, 1)操作后,会得到中间部分比其他部分亮很多的边,其它区域会很暗,这样就起到了边沿检测的作用。模板的意思是,将右邻点的灰度值-左邻点的灰度值作为该点的灰度值。在灰度相近的区域内,这样做可以使得该点的灰度值接近0;而在边界附近,灰度值有明显的跳变,这样做就使得该点的灰度值很大。
这种模板是一种边沿检测器,数学上的含义是基于梯度的滤波器,又称为 边沿算子。
Sobel 算子 分为 普通 Sobel 算子 和 各向同性Sobel算子。又都分为检测 垂直平边沿的和检测水平边沿的。各项同性Soble算子的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
高斯拉普拉斯算子 由于噪声点(灰度与周围点相差很大的点) 对边沿检测有一定的影响,所以效果更好的边沿检测器 是 高斯拉普拉斯LOG算子。它把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来,先平滑掉噪声,再进行边沿检测,效果更好。
常用的LOG算子是5*5模板。到中心点的距离与位置加权系数用曲线表示很像一顶墨西哥草帽,所以,LOG又叫做 墨西哥草帽滤波器。
Hought变换 用来在图像中查找直线。
轮廓提取 方法:掏空内部点。即 如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点)则将该点删除。 注意,我们处理的虽然是二值图,但实际上是256级灰度图,不过只用到 0 和 255 两种颜色。
种子填充: 用来在封闭曲线的环中填充某种颜色。种子填充实际上是图形学中的算法,其原理是:准备一个堆栈, 先将要填充的点 push 进堆栈中,以后,每pop出一个点,即将该点涂成色。然后,按照左上右下的顺序查看它的四个相邻点,若为白(表示还没有填充),就将该邻点push进栈。一直循环,知道栈为空。
轮廓跟踪: 顾名思义就是通过顺序找出边缘点来跟踪边界。
第八章 图像的检测及模板匹配
模板匹配:就是拿已知的模板和原图像中同样大小的一块区域去对比。So,利用模板匹配可以在一幅图像中找到已知的物体。
差影法:将前后两幅图像相减,得到的差作为结果图像。
投影法:一般可以先选取合适的阈值做削波处理,然后将该图二值化,然后投影。由于噪声对投影有一定的影响,所以,处理前最好先做一次平滑,去除噪声。
第九章 图像的压缩编码,JPEG压缩编码标准
压缩可分为两大类:第一类压缩过程是可逆的,也就是说,从压缩后的图像能够完全恢复出原来的图像,信息没有任何丢失,称为 无损压缩。
第二类压缩过程是不可逆的,无法恢复出原图像,信息有一定的丢失,称为有损压缩。但是,它的压缩比 高 。
图像压缩一般通过改变图像的表示方式来达到,so 压缩和编码 是分不开的。
图像压缩主要应用在图像信息的传输和存储。
压缩编码的方法有: 像素编码 , 预测编码 , 变换编码 , else。
像素编码:编码对每个像素单独处理,不考虑像素之间的相关性。方法有:
① 脉冲编码调制(Pulse Code Modulation PCM)
② 熵编码 (Entropy Coding)
③ 行程编码(Run Length Coding)
④ 位平面编码(Bit Plane Coding)
其中熵编码又有 哈夫曼编码(Huffman) 和 行程 编码
预测编码: 去除相邻像素之间的相关性和冗余性,只对新的信息进行编码。
常用的预测编码有: 调制(Delta Modulation DM) 微分预测编码(Differential Pulse Code Modulation DPCM)
变换编码:将给定的图像变换到另一个数据域上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。
常用的变换编码有:离散傅里叶变换DFT 离散余弦变换DCT 离散哈达玛变换DHT
哈弗曼编码。。。。。
行程编码:将一行中颜色值相同的相邻像素用一个计数值和该颜色来代替。
Ex aaabccccccddee 可以表示为 3a1b6c2d3e 。如果一幅图像是由很多块颜色相同的大面积区域组成的,那么采用行程编码的压缩效率是惊人的。然而,该算法的致命点是:如果图像中每两个相邻点的颜色都不同,那么这种算法不但不能压缩,反而数据量增加一倍。
LZW算法:
LZW是一种比较复杂的压缩算法,其压缩效率也比较高。
LZW把第一次出现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符串。LZW是无损的,gif文件就是采用的这种压缩算法。
JPEG 是联合图像专家组 Joint Picture Expert Group 制定的静态图像的压缩编码标准。它的压缩比很好。
以上 关于 图像的基础知识,知识涉及到最基本得概念,还没有深入到算法。。。。算是开始入门了解吧。
参考 《数字图像处理编程入门》