学习内容
方向 | 计划 | 完成情况 |
CV | 小波变换,图像分割 | 完成 |
编程 | 实现小波变换,图像分割 | 小波变换未完成 |
数学 | 矢量场,旋转场,散度场,张量场 | 放弃 |
CV:
小波变换
预处理:
为方便计算和学习,使用PS创建一张256*256,8bit的灰度图像
小波变换和图像小波变换(大坑)_(:з」∠)_
(一下部分大都在记载踩坑心得)
看清华大学出版社的《数字图像处理》课本,似懂非懂;看了两遍,好像懂了,但是算法层面好像没讲?感觉不对啊,不可能把一整行数据传入小波基的解析表达式和尺度函数啊!!!
得了,我明天把这章从头到尾连公式都挨个推一遍,要么是我脑子有问题要么是这书有问题!!!(╯‵□′)╯︵┻━┻
看了三遍,得出结论,课本的“二维小波离散变换”知识点,未指明所用的高频滤波器和低频滤波器。在P161对Haar小波的解析表达式和尺度函数与冈萨雷斯的教材完全不一样(P298)
冈萨雷斯提供了一个不错的例题,该例题使用了Harr小波,但是实际使用了一个4*4的变换矩阵H4:
关于Haar小波,两本书的内容不一样,咋办?没错,求助互联网
在Wikipedia上找到了冈萨雷斯提到的“矩阵”,而且有N=2、4、8的三种矩阵
看着看着感觉不对劲,中文版wiki翻译不全,部分资料没有。
英文wiki里面的例子和中文不大一样,H4提了个1/2,感觉没啥用啊?
通过英文wiki的栗子,我好像学会了Haar小波变换
重新回到冈萨雷斯的课本。在P309的例7.8中,提到W1和w2w3w4(那个符号打不出来)分别对应H4的1234行
在冈萨雷斯P314例7.10 计算一维快速小波变换中,出现了清华课本中的Haar表达式和尺度函数。
随后发现,看不懂例题(╯‵□′)╯︵┻━┻
冈萨雷斯学到了“一维快速小波变换”,终于看到了清华课本中的公式:
这是被小波困扰的第四天,在本章投入了很多时间精力,产出令人沮丧地太低,这个知识点此时已经没有学习的必要了,暂时放弃。
↑↑↑我是象征着高产的分界线(*^▽^*) ↑↑↑
嵌入式零树小波编码
这个还是相对简单的,由于在上一节耽误太多时间,因此没有使用代码实现。当然,课本中也存在少许看不懂的地方,比如P165 “除最高品子带以外的其余子带的系数都有四个孩子”,我百思不得其解,为啥我怎么数都是仨孩子啊?第四个孩子是谁家的?
关于小波去噪,课本只用了两页左右的篇幅介绍,因此我也浅尝辄止。
图像分割
在本章节,学习了图像分割的基本概念,基于边缘检测的图像分割(Hough变换),基于阈值的图像分割(阈值化分割、半阈值化分割)
基于双峰型直方图的阈值选取(利用极大值极小值、双峰型直方图谷底阈值的选取,最小误差法),其他阈值选取方法(全局阈值、类二值图像的阈值选取、迭代式阈值选取)
基于跟踪的图像分割:轮廓跟踪法,光栅跟踪法
基于区域的图像分割:区域生长法,合并分裂法,
代码展示
阈值化图像分割
利用阈值化提取物体轮廓,设置了一个滑动块,可以随时手动调节灰度阈值
半阈值化分割
和阈值化分割很像,只不过把保留的部分设置为原灰度值,可以处理多值图像。源码:https://github.com/Sirlanri/cv-practice/blob/758597930541889bbfa444ecb41ef78830826832/cv-practice/threshold.cpp#L54
基于双峰形直方图的阈值选取
首先,这个双峰形直方图不多啊,于是乎自己用PS画了个,勉勉强强满足双峰
由于从未系统学习过C++,在编程过程中遇到了小麻烦,于是转而深入学习C++指针相关的知识。关键点:指针数组、数组指针
说实话,我个人不喜欢C/C++ 🙁
这个算法由两个函数组成:生成直方图数组的generateHistogram函数、寻找谷底和k值的findThresByMaxMin函数。源码:https://github.com/Sirlanri/cv-practice/blob/758597930541889bbfa444ecb41ef78830826832/cv-practice/threshold.cpp#L118
可能是由于PS绘制的图片过于极端,存在某个数值为0的灰度阶,同时不是严格的双峰形,导致结果有点奇怪?
类二值图像的阈值选取
使用滑块输入“文字百分比”,通过文字百分比确定阈值。源码:https://github.com/Sirlanri/cv-practice/blob/4e0953d0adf2f3d851d1a9643bef10550eb80975/cv-practice/threshold.cpp#L217
步骤:计算直方图,确定对应百分比的灰度值,进行阈值化分割
迭代式阈值选取
通过不断迭代的方式逼近合适的阈值。源码:https://github.com/Sirlanri/cv-practice/blob/373195ac976d9fa6fde4fb578c5bcd4e0f0322cd/cv-practice/threshold.cpp#L236
疑问:这个是不是只针对双峰图?
光栅跟踪法
为了方便和直观,没有实际测试图像,而是使用课本提供的矩阵,方便校验对错。源码:https://github.com/Sirlanri/cv-practice/blob/e1b08aae4c6acad00563762d95524a95eb93795e/cv-practice/trackSeg.cpp#L75
数学:
问题很大,完成情况差,只了解了一点点皮毛。看了一些视频和中英文资料,仍没搞懂…
原因:未接触过相关知识;未了解其前置知识点
故暂时放弃相关知识点
总结
本周再次转变了学习方式,采用“深度优先”策略,不追求进度,追求学习的深度,并手写一切代码。
从结果看,对我而言,这种方式投入大产出很小,是不合适的
本周头发都掉的更多了(;´༎ຶД༎ຶ`)
直至开学前,采用“广度优先”学习方法,用最快的速度学习更多的知识,根据边际效应递减原理,掌握5成即可(了解,有啥用,怎么用),跳过数学推导部分。后续编程实践中,用到了某个算法,再进行深度的学习,推导其数学原理。研1上学期,可以学的很少,但要尽可能学会学习,寻找适合自己的学习方式