L1B0 / Digital-image-processing

数字图像处理作业

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Digital-image-processing

Author: L1B0

请在连接外网的前提下用markdown编辑器打开,保证最佳效果:-)

0x00 文件说明

  • Source_Code文件夹包含项目的所有源码。
  • Test_Images文件夹包含测试用的图片
  • Result_Images文件夹包含所有测试结果的截图
  • picture_demo是可执行文件
  • imageTrans.py是第八周图像变换的作业

0x01 picture-demo(除第八周作业)

1. 系统亮点

  1. 界面简洁大方,功能栏位于在左侧方便点击。
  2. 图片保存,压缩,边缘闭合通过右键菜单实现。
  3. 图片打开时系统自动识别图片格式,若为彩图则提示是否转为灰度图。
  4. 图片应用功能,通过右键点击应用将点击的图片应用到其它界面上,实现了图片变换效果的叠加
  5. 图片过大时出现滚动条,方便查看。
  6. 灰度直方图统计功能:系统会通过迭代法确定最佳阀值,并显示在输入框的背景文字上,用户也可自定义。
  7. 点运算中三种变换均支持动态参数,并且有变换前后的效果对比。

2. 开发环境

  • 运行环境:Linux(deepin) - Qt Creator 4.6.2 based on Qt 5.11.1
  • 语言:C++
  • 依赖:qmake

3. 编译(已有可执行文件,可忽略这步)

cd picture_demo 
qmake -project
qmake                                           
make clean
vim picture_demo.pro
QT+=core widgets printsupport//添加这行,保存退出
make      

4. 运行

./picture_demo

5. 功能描述&测试结果

运行过程中会输出一些调试过程的结果,请忽略:-)

已实现功能(图片均指灰度图):

  1. 打开保存图片
  2. 图片采样率的改变
  3. 图片灰度级的改变
  4. 图片放缩(最近邻和双线性插值算法),图片旋转
  5. 图片平移(以图片过大时出现滚动条间接实现)
  6. 展示8幅位平面图片,支持保存功能
  7. 灰度值统计,包括动态改变阀值,图片的像素总数,平均灰度,中值灰度,灰度的标准差以及灰度直方图的展示
  8. 灰度直方图均衡化
  9. 点运算,包括线性变换和两种非线性变换
  10. 图像平滑,包括均值,中值,K邻域三种模板
  11. 图像锐化, 包括Roberts,Sobel,Laplacian三种算子。
  12. 图像增强-自定义模板
  13. 图像的边缘检测(拉普拉斯算子和Kirsch算子)
  14. 图像边缘闭合
  15. 图像中直线的检测(仅支持二值图
  16. 图像压缩及解压缩(huffman编码和游程编码)

5.1 打开图像

用户可通过文件(菜单栏 )-> 打开或快捷键Ctrl+O打开图片。

open

open1

5.2 保存图片

位平面界面的8幅位平面图片只能通过save all按钮一次保存8幅图片之外(该保存路径默认和原图路径相同),其余界面中的图片均可通过右键保存图片

save_bitplane

save

5.3 图像放缩

缩放范围在原图大小的1/11-10,旋转每次顺时针转90度。

big

zhuan

5.4 采样率

采样率不应超过原图的宽高,若超出则不做变换。

sampling

5.5 灰度级

灰度级输入在1-256之间,若超出则不做变换。

gray_trans

5.6 位平面

bitplane

5.7 灰度直方图

支持阀值自定义,并且系统将原图通过迭代法算出最佳阀值,显示在输入框的背景文字。

gray_hist

5.8 灰度直方图均衡化

将原图的灰度范围均衡至0-255

gray_bal

5.9 点运算

将原图的灰度通过函数映射转换成新图。

point

5.10 图像平滑

支持均值,中值和K邻域三种模板。

smooth

5.11 图像锐化

通过Roberts,Sobel,Laplacian三种算子对图像进行锐化。

sharpen

5.12 图像增强-自定义模板

zidingyi

5.13 边缘检测

  • 拉普拉斯算子

laphla

  • Kirsch算子

Kirsch

5.14 边缘闭合

通过八邻域和16邻域的检测实现边缘点的闭合。

左边为效果图,右边为原图

bihe

5.15 直线检测

通过霍夫变换对二值图进行处理,若是识别到直线则用蓝色像素点标识。

  • 原图

line_trans

  • 检测结果

line_result

5.16 图像压缩

  • huffman编码

原理

利用数组模拟哈弗曼树,对图像的灰度频率进行huffman编码。

压缩文件格式

压缩文件数据包括原图的宽高,哈弗曼树中各个节点的左儿子、右儿子和父节点在数组的位置,以及原图图像数据经huffman编码的二进制流。

huffman编码的二进制流解释:比如说有两个哈弗曼编码值,分别为1011101101,写入文件时二进制流为1011011101

压缩

ori1

compress1

可以看到压缩之后的文件大小是原图的1/3。

解压缩

de1

de2

  • 游程编码

原理

与游程编码的官方定义差不多。

压缩文件格式

文件的前8个字节为图像的宽度高度,之后每两个字节一组,第一个字节为重复次数,第二个字节为灰度值

若重复次数超过256,则重复模256,除256写入。

压缩

compress2

解压缩

de3

de4

0x02 imageTrans.py(第八周作业-图像变换)

1. 开发环境

  • 运行环境:Linux(deepin),windows应该也行

  • 语言:Python2

  • 依赖库:cv2, numpy, pywt, matplotlib

2. 功能说明

此脚本实现了图片的傅里叶变换离散余弦变换小波变换,展示的结果包括原图,三种变换结果的频谱图以及反变换重构结果

3. 测试结果

运行脚本,python imageTrans.py 即可

然后输入图像的路径(绝对路径和相对路径均可)

在我的环境里,cv2的dct函数处理图像时若图像的长度或高度为奇数会异常退出

运行结果如下图

绝对路径

absolute_path

相对路径

relative_path

About

数字图像处理作业

License:MIT License


Languages

Language:C++ 76.2%Language:Makefile 23.1%Language:C 0.6%Language:Python 0.1%Language:QMake 0.1%