0、小叙闲言

续第一章之后,对数字图像和图像处理略有了解。第二章内容有不少,书中编写了很多的函数,还是一样,只要沉下心看看,理清楚结构,看明白功能,个人觉得很容易看明白。同时书中的代码都有很多的注释,更加减少我们看代码的难度。耐心,静心,定会有所收获。

1、本章整体结构

本章内容很多,也有很多的数学知识,个人在学习的时候,碰到了好多困难,毕竟不是科班出生,而且也没有学习过数字信号处理,还好,线性代数和概率论学得还可以,但依旧有不少不理解的地方。下面也只能整理一下书中的知识要点,以后有新的领悟再来更新,看下面一章,关于离散傅里叶变换,好像更难。

2、书中例子

例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把

>> imread('myimage.jpg');
>> f=imread('myimage.jpg');
>> g1 = imadjust(f, [ ], [ ]);
>> imshow(g1);
>> imshow(f);
>> g2 = imadjust(f, [0.5 0.75], [ ]);
>> figure;imshow(g2);
>> g3 = imadjust(f, [], [],);
>> figure;imshow(g3);

处理前后效果,还可以,f到g1的变换,就是对像素值进行了反转,也就是书中所讲的负片效果,对医学很有用。

g2图是将[0.5 0.75]间的像素线性变换到[0 1]之间,也就是进行了放大。那么这里有点疑问,我们的图像像素幅值区间不可能只是有[0.5 0.75],这个参数的意义到底是什么呢?我对书中的理解如下,上面图中所用到的是uint8类型图像,因此图像幅值区间是[0 255],有一点编程基础的都应该清楚。所以对应uint8类型,它的实际区间为[0.5 0.75]*255=[127.5  191.25]。如果是对应是uint16类型,那么他的实际区间为[0.5 0.75]*(2^16-1)=[32767 49151],也就是只取区间[32767 49151]像素幅值。再回到imadjust(f, [0.5 0.75], [0 1]),也就是将区间[127.5  191.25]映射到[0 255],怎么一个映射法呢?默认的就是线性对应,由两点(两个区间形成两点)确定一条直线。如下图所示:

那么问题又来了,如果是区间[0.5 0.75]映射到[1 0]又是如何理解的呢,其实是一样的道理,做好点对点的对应关系,求出线性函数即可。如下图所示的对应关系,这也就解释了g1图效果的原因,从[0 1]映射到[1 0],就是斜率为-1,x取值范围为[0 255],完全就是一个线性明暗反转操作。

Low_High=strechlim(f),就是帮我们找到图像f中的像素幅值的最大值和最小值,如果f是一个单值图像,那么Low_High就是一个行向量(1*2的矩阵),如果f是一个彩色图像,那么Low_High就是一个3*2的矩阵。当我们找到f图像的最小,最大像素幅值后,再将其映射到整个像素区间[0 1],也就是书中所讲,实现对比度拉伸,可以得到不错的效果。如下图,从A图到D图,D图就是使用了strechlim(f),然后使用D=imadjust(f,Low_High,[0 1]);得到的图像,很是清晰。

书中的一个tofloat函数,很短,但写得很棒,我读了一下,并添加了一些自己的注释,代码如下。

 function [out, revertclass] = tofloat(in)
%out=输入的图像参数(in)转化为float型数据点
%revertclass=一个函数句柄可以将类型转回去 identity = @(x) x; %一个匿名函数的句柄,表示自身
tosingle = @im2single; %普通函数句柄 理解为函数指针也行
tabel = {
'uint8', tosingle, @im2uint8
'uint16', tosingle, @im2uint16
'int16', tosingle, @im2uint16
'int16', tosingle, @logical
'double', identity, identity
'single', identity, identity
};
%在单元矩阵的第1列中找到输入参数类型的名字
classIndex = find(strcmp(class(in), tabel(:, ))); if isempty(classIndex)
error('Unspported input image class.');
end
%在单元矩阵的第2列中找到索引处转为flaot型的函数句柄,进行转换
out = tabel{classIndex, }(in);
%在单元矩阵的第3列中找到索引处反转为原来类型函数句柄,进行转换
revertclass = tabel{classIndex, };

运用例中的代码做两个图看看,练练手,效果如下:

h=imhist(f,);
horz = linspace(,,);
subplot(,,);bar(horz,h);
subplot(,,);stem(horz, h, 'fill');

3、个人对书中一些知识的理解

书中intrans函数的的结构如下,书中写了比较长的代码,但并不复杂。只是在下面结构基础上添加了一些逻辑判断,增加了代码的长度,算法不复杂。

本质就是对前面灰度变换方法的一个综合,书中函数代码写了很长,其实都很容易,大部分代码都是在做一个判断,减少函数的bug。

书中重新编写的g = gscale(f, method, low, high)函数,也就是实现前文所讲的,灰度全尺度拉伸变换,个人觉得其实配合,stretchlim函数和imadjust可以轻松完成此功能。

心得总结

学习本章,深深感受好数学功底太重要了,很多理论如果对数学没有一定的了解,很难理解原理。只能掌握一些关于图像处理的方法。这跟当年学习单片机是一样的,很多的电路原理都不太清楚,但是照着别人的方法和步骤来编程,一样可以取得想要的效果。当使用单片机多了,接触得更多了,慢慢以也就理解了。目前学习数字图像处理的我,正像是当年第一次接触单片机一样。很多图像处理的算法,虽然书上说了,但我还是不理解,只能照着书上的来,然后也得到了书上的效果。

在知乎上搜索如何学习数字图像处理这一话题时,有很多人跟我一样,也是不能理解其中的算法原理,有一些知乎的大神也给出了建议,第一次学习,书中诸多难以理解的算法,暂且可不用刨根问底。先掌握数字图像处理这一技能,而后理解数字图像处理这一心法,最后化为自己的内功。自身不是天才,无法一次就能掌握。

数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波的更多相关文章

  1. 数字图像处理(MATLAB版)学习笔记(1)——第1章 绪言

    0.下定决心 当当入手数字图像处理一本,从此开此正式跨入数字图像处理大门.以前虽然多多少少接触过这些东西,也做过一些相关的事情,但感觉都不够系统,也不够专业,从今天开始,一步一步地学习下去,相信会有成 ...

  2. 锋利的jQuery第2版学习笔记4、5章

    第4章,jQuery中的事件和动画 注意:使用的jQuery版本为1.7.1 jQuery中的事件 JavaScript中通常使用window.onload方法,jQuery中使用$(document ...

  3. 锋利的jQuery第2版学习笔记6、7章

    第6章,jQuery与Ajax的应用 Ajax的优势和不足 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 4.减轻服务器和带宽的负担 Ajax的不足 1.浏览器对X ...

  4. C++Primer第5版学习笔记(二)

    C++Primer第5版学习笔记(二) 第三章的重难点内容         这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...

  5. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  6. [学习一个] Matlab GUI 学习笔记 Ⅰ

    Matlab GUI 学习笔记 Ⅰ 1. Foreword Matlab 是严格意义上的编程语言吗?曾经有人告诉我他是通过 Matlab 学会了面对对象编程,我是不信的,但这依然不妨碍它在特殊领域的强 ...

  7. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  8. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  9. C++Primer第5版学习笔记(四)

    C++Primer第5版学习笔记(四) 第六章的重难点内容         你可以点击这里回顾第四/五章的内容       第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...

随机推荐

  1. MobileOA第一期总结

    MobileOA第一期总结 前段时间一直没有更新博客,好想给自己找个借口---恩,我还是多找几个吧.毕业论文.毕业照,再感伤一下,出去玩一下,不知不觉就过去几个月了.然后上个月底才重新回到学习之路,从 ...

  2. arguments及arguments.callee

    首先有一个JavaScript函数 function test(a, b, c, d) { return a + b; } 在JavaScript中调用一个函数的实参个数可以和被调用函数的形参个数不匹 ...

  3. Synchronize执行过程

    Synchronize执行过程及原理 在windows原生应用程序开发中,经常伴随多线程的使用,多线程开发很简单,难点就是在于线程的同步,在Delphi中提供了VC中不具备的一个过程Synchroni ...

  4. 网络性能测试工具Iperf/Jperf解读

    Iperf 是一个网络性能测试工具.Iperf 可以测试TCP 和UDP 带宽质量.Iperf 可以测量最大TCP 带宽,具有多种参数和UDP 特性. Iperf 可以报告带宽,延时抖动和数据包丢失. ...

  5. 《C#语言和数据库技术基础》单词必备

    <C#语言和数据库技术基础> 第一章1..NET Framework   框架2.sharp            尖锐,强烈的3.application      应用程序4.devel ...

  6. WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置

    WebStorm :是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaScript IDE ...

  7. Visual Studio 2017正式版发布全纪录

    又是一年发布季,微软借着Visual Studio品牌20周年之际,于美国太平洋时间2017年3月7日9点召开发布会议,宣布正式发布新一代开发利器Visual Studio 2017.同时发布的还有 ...

  8. 腾讯云分布式高可靠消息队列服务CMQ架构

    在分布式大行其道的今天,我们在系统内部.平台之间广泛运用消息中间件进行数据交换及解耦.CMQ是腾讯云内部自研基于的高可靠.强一致.可扩展分布式消息队列,在腾讯内部包括微信手机QQ业务红包.腾讯话费充值 ...

  9. 图片流量节省大杀器:基于腾讯云CDN的sharpP自适应图片技术实践

    目前移动端运营素材大部分依赖图片,基于对图片流量更少,渲染速度更快的诉求,我们推动CDN,X5内核,即通产品部共同推出了一套业务透明,无痛接入的CDN图片优化方案:基于CDN的sharpP自适应图片无 ...

  10. TSQL语句和CRUD(20161016)

    上午 TSQL语句 1.创建数据库 create database test2; 2.删除数据库 drop database test2; 3.创建表 create table ceshi ( ids ...