Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)
目录
一、前言
1、MATLAB or C++
用MATLAB进行图像处理编程,无需考虑内存分配和回收的问题,开发难度小一些;
相比之下,Visual C++需要考虑的问题比较多,但在工业开发中更实用,效率更高。
只用MATLAB容易忽视底层问题,比如读取图片等。
2、图像文件
图像文件一般由文件头、调色板数据和像素数据三部分组成。
文件头
存放图像的各种参数,包括图像类型、宽度、像素位数、压缩类型、有无调色板等。
文件头中的参数可以是固定的,也可以是灵活的。
如BMP格式,不仅参数类型固定,而且每个参数的位数也是固定的。
而有些图像文件格式中存在自定义参数,参数在文件中的存储位置也不固定。
调色板
图像的颜色索引表。
调色板仅存在于二值、16色、256色图像中,真彩色图像是没有调色板的。
GIF就不支持真彩色图像,因此在GIF文件中必然存在调色板。
像素数据
像素数据可以是压缩的,也可以是非压缩的。
不压缩的像素数据,在不同格式的图像文件中具有基本相同的存储结构。
3、RGB颜色空间
原理
人眼中的锥状细胞和棒状细胞对红、绿、蓝特别敏感。
在CRT显示系统中:彩色阴极射线管使用R、G、B数值,来驱动电子枪发射电子,分别激发荧光屏上的R、G、B三种颜色的荧光粉,以发出不同亮度的光线,并混合得到各种颜色。
坐标表示
RGB颜色模型对应笛卡尔坐标系中的一个立方体,R、G、B分别代表3个坐标轴。
白色:(255,255,255)
黑色:(0,0,0)原点
灰度级:两点连成的对角线。
一般编程语言和编译环境都直接提供对RGB颜色表示的支持,并且3个分量取值范围都是0到255。
4、MATLAB中的图像文件
默认情况下,MATLAB将图像中的数据存储为double(64位浮点数);
但涉及运算时,必须转成double型,保证运算精度。
在图像文件中,uint8范围是[0,255],double范围是[0,1]。
图像类型
MATLAB中的图像类型包括:灰度图像,RGB图像,二值图像和索引图像4种。
灰度图像:灰度级0~255。存储形式为矩阵,其元素可以是double,也可以是uint8。
RGB图像(真彩色图像):存储形式为mn3的矩阵,其元素也可以是double和uint8。
例如,像素(20,10)的R、G、B值分别存在(20,10,1)、(20,10,2)和(20,10,3)。
二值图像:也用矩阵存储,但只需要1个矩阵,并且元素也可以是uint8
索引图像:包括一个数据矩阵X和一个颜色映射矩阵Map。Map含3列和若干行,每个元素均为[0,1]之间的double。
当矩阵数值为1时,用色图矩阵中第2行表示的颜色绘制。
当矩阵数值为0时,用色图矩阵中第1行表示的颜色绘制。
image()函数
可以直接显示8位图像,原始尺寸。
将double型数据取整(正数取整就是把小数部分舍掉),然后直接映射,按颜色表显示。
imshow()函数
功能最强,映射方式丰富。可以替代image()和imagesc()函数。
imshow(I)
当图像为double型时,函数把显示范围设置成[0,1],小于0的变成黑色,大于1的变成白色。
当图像为uint8型时,函数把显示范围设置成[0,255]。处理不当会出现全白。根本原因是数据类型和map范围不匹配。
imshow(I/(max(I(:))))
解决超范围double数据出现的全白问题方法1。
用max(I(:)) 对矩阵进行归一化,再显示。uint8型不要这么做!!!直接显示即可,否则会很黑。
imshow(uint8(I))
解决超范围double数据出现的全白问题方法2。
如果原本就是uint8类型,没影响。
如果原本是超范围double类型,uint8()函数先把double数据转换成uint8,但方式很粗暴:负数归零,超过255置为255,小数被round。由于方式太粗暴,丢的信息比较多。
imshow(I,[ ])
这种方式就是把imshow的显示范围设置成[min(I(:)) max(I(:))],也就是线性映射。
相当于imagesc(I),colormap(gray(256))。
imread()函数
如果是灰度图像,imread()把图像存入一个8位矩阵,色图矩阵转换为double矩阵。
如果是RGB图像,imread()把图像存入一个8位RGB矩阵。
可以显式地给出图片路径。
图像转换
- 灰度图像和索引图像
[X, MAP] = gray2ind(I, [n])
n是颜色值,默认为64
I = ind2gray(X, MAP)
- RGB彩色图像和索引图像
[X, MAP] = rgb2ind(RGB)
RGB = ind2rgb(X, MAP)
- RGB彩色图像和索引图像
[X, MAP] = rgb2ind(RGB)
RGB = ind2rgb(X, MAP)
- RGB彩色图像 → 灰度图像
I = rgb2gray(RGB) % 由于灰度级的RGB三个分量是相同的,因此做算术平均即可
反过来不行。因为这是一个病态过程。
- 其他图像 → 二值图像
BW = im2bw(I, MAP, level) % level是阈值,在0和1之间。默认为OSTU寻找阈值。
BW = im2bw(I, level)
BW = im2bw(RGB, level) % 先转换成灰度图像
有一个更强的函数:imbinarize(),可以设置method,比如局部level。
其他图片操作
whos I % 给出附加信息,如存储方式等。
imwrite(I, 'newImage.png') % filename可以包含完整路径
% 只适用于JPG图像:
imwrite(I, 'newImage.jpg', 'quality', q)
% q在0到100之间,控制压缩后的图像质量。q越小图像越差。
% 只适用于TIF图像:
imwrite(I, 'newImage.tif', 'compression', 'p', 'res', ...[colres rowres])
% p:none为无压缩,ccitt为CCITT压缩,packbits为比特压缩。
% clores是列分辨率,rowres是行分辨率,默认为[72 72]。即每单元的点数。
最后要注意的是,MATLAB中的图像坐标系,类似于笛卡尔坐标系的第四象限。
二、图像的点运算
点运算:操作对象是图像的单个像素值。
输出像素值只与当前输入像素值有关。
变换公式是最关键的,可唯一确定结果。
1、灰度直方图
高对比度:灰度分布范围广,灰度直方图整体比较平滑。对于彩色图像,图像会显得色彩丰富艳丽。
低对比度:灰度分布集中。
可用于:
图像信息加密:理想秘图不仅摆脱原始图像的纹理特征信息,还应该具有均匀分布的直方图。
无损信息隐藏:基于图像直方图移位。
2、灰度均衡
直方图均衡可以有效调节图像对比度。
后来延伸出自适应的直方图均衡化算法AHE,通过计算图像的局部直方图,重新分布亮度来改变图像对比度。
优势:改进图像局部对比度,获得更多的图像细节。
缺点:过度放大图像中相同区域的噪声。
为了解决这一问题,有学者提出了对比度有限的自适应直方图均衡化算法CLAHE。
CLAHE在图像去雾中广泛使用,因为去雾算法的本质,就是调节图像对比度和亮度。
当然,去雾还有其他算法,比如暗通道算法。这在后面会介绍。
3、直方图规定化
离散方式实现比较复杂,推导见P56。
就个人经验,大家普遍采用近似的方法:逐个累积,看合并多少个误差最小。这样更简单。
Matlab内置函数可以参考另外一个图像(的直方图),代码见P57。
三、图像的几何变换
图像几何变换:建立一种 源图像像素 与 变换后的图像像素 之间的映射关系。
1、图像几何变换的基本理论
分为前向映射(由输入图像坐标,推出输出图像坐标)和后向映射。
前向映射可能的问题:映射不完全或映射重叠。
此时需要相应规则,决定或生成输出坐标的像素值。
为了解决前向映射的问题,我们引入后向映射。我们寻找的映射作用在输出坐标上,反向寻找唯一的输入坐标。
在图像的旋转和缩放中,我们普遍采用后向映射。
2、插值算法
书上介绍了双线性插值,见P72。
四、图像增强
(未完待续)
Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)的更多相关文章
- javascript有用小功能总结(未完待续)
1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 关于DOM的一些总结(未完待续......)
DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)
virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...
- MVC丶 (未完待续······)
希望你看了此小随 可以实现自己的MVC框架 也祝所有的程序员身体健康一切安好 ...
- 一篇文章让Oracle程序猿学会MySql【未完待续】
一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...
- [python]爬代理ip v2.0(未完待续)
爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...
- IOS之KVC和KVO(未完待续)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- Altium Designer9.4局域网内冲突的问题
Altium Designer破解 1.安装Altium Designer原程序.2.运行AD9KeyGen,点击“打开模板”,加载ad9.ini,如想修改注册名,只需修改:TransactorNam ...
- 第三章 FFmpeg转封装
3.1 音视频文件转MP4格式 在互联网常见的格式中,跨平台最好的应该是MP4文件. 3.1.1 MP4格式标准介绍 MP4文件由多个Box与FullBox组成 每个Box由Header和Data两部 ...
- 关于element-ui日期选择器disabledDate使用心得
实现目的: 使用type="data"类型实现具备开始日期与结束日期组件(ps:element有自带的type="daterange"类型的组件可以实现此功能) ...
- 关于tp5自动过滤index.php
在public/.htaccess 中输入这段代码即可实现过滤index.php <IfModule mod_rewrite.c> Options +FollowSymlinks -Mul ...
- 装饰器 -- 函数装饰器(tornado异常响应装饰器)
# 值可变,每次使用需要重新赋值 ERR_RESP_TEMPLATE = {"state": "FAILED", "error": None ...
- Selenium IDE录制脚本时弹出窗口的完美处理
很多朋友录制脚本时新打开弹出窗口后无法定位元素,我也遇到同样的问题,国内没有什么好的资料,于是就阅读英文,不断尝试,感觉那个selectWindow(title)什么就是个坑,我用这种方法成功处理后得 ...
- 443. String Compression
原题: 443. String Compression 解题: 看到题目就想到用map计数,然后将计数的位数计算处理,这里的解法并不满足题目的额外O(1)的要求,并且只是返回了结果array的长度,并 ...
- 十一、Composite 组合模式
原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...
- Handler相关
1.延迟方法 Message msg = new Message(); msg.what = 0x111; // netWorkHandler.sendMessage(msg); //延迟方法三 ...
- 微信小程序记账本进度二
二.1,下载微信web开发者工具 2,使用新注册的账号登录,并创建工程