本项目是南京大学2021年数字图像处理课程大实验,旨在鼓励同学亲自动手,实现算法,增强理解。
截止时间2021年圣诞节12月25日23:59:59。
每个需要实现的算法各100分(除了Canny算法150分),总分达到550分本课程实验满分,所有同学都不需要撰写实验报告,评分主要考察实现效果和代码。
同学们唯一需要使用的第三方库是NumPy(例如np.fft
可以直接用),如果代码使用其他第三方库,该算法实现得分最多30分。如果按照下文自行扩展非平凡功能,该算法实现分值为150分(仅限一次有效)。
如果发现抄袭其他同学代码,倒扣相关同学在相关算法上的得分。
推荐使用PyCharm打开本项目,打开requirements.txt
自动安装依赖,或者通过命令pip install -r requirements.txt
安装。 运行main.py
,出现如下界面启动成功。
通过Open
打开图片,在左侧显示,任意选择一个算法,点击之后结果在右侧显示,再用Save
保存图片。
实验中只会用到灰度图(形状[H,W]
)和RGB图(形状[H,W,3]
),可以通过if img.ndim == 2:
是灰度图还是RGB图。对于只接受二维图像的算法,已经预先将RGB图转为灰度图。除了位平面使用8比特表示,其余均用0到1浮点表示。
算法 | 图片类型 | 数据表示 |
---|---|---|
位平面 | 灰度图 | 8比特整型 |
直方图均衡 | 均可 | 0到1浮点 |
去噪 | 均可 | 0到1浮点 |
插值 | 均可 | 0到1浮点 |
傅里叶变换 | 灰度图 | 0到1浮点 |
巴特沃斯低通滤波 | 灰度图 | 0到1浮点 |
坎尼边缘检测 | 灰度图 | 0到1浮点 |
形态学开操作 | 灰度图 | 0到1浮点 |
同学们的任务是按照下面要求完善algorithm.py
,一般不用改动其他代码文件(除非想要扩展功能)。
输出[3*H,3*W]
的九宫格,依次是从高到低比特单独表示的结果。
将灰度直方图变换成尽可能平(均匀分布),如果是RGB图对三通道分别处理。
任意实现一个去噪算法(例如中值滤波器),因为算法不尽相同,效果也不一样,评价只考察代码。
将输入图片大小变为两倍,使用任意插值算法均可(不必局限课程),注意示例中的横纵轴变化。
需要注意频率域原点移到图像中心,为了美观结果记得取对数,调用np.fft
可以快速完成。
必讲的频率域低通滤波,可以在上一题基础上添加代码,截止频率自行设置。
非常经典的边缘检测算法,考虑到难度高于其他算法,分值设为150分。
如果想要扩展功能添加算法ABC
,熟悉PyQt的同学不作赘述,不熟悉的同学也有办法。
首先编辑ui_mainwindow.py
,仿照已有代码,加入如下代码。
...
self.actionABC = QtWidgets.QAction(MainWindow)
self.actionABC.setText("ABC")
self.actionABC.setObjectName("actionABC")
...
self.toolbar.addAction(self.actionABC)
...
然后编辑mainwindow.py
,在函数connect
中添加。
self.ui.actionABC.triggered.connect(self.handleABC)
继续添加handleABC
方法,一般会用到装饰器draw(2)
,可以将它理解为,自动在函数调用前处理异常,并在函数调用后显示图像。
@draw(2)
def handleABC(self):
self.img2 = abc(self.img1)
最后修改algorithm.py
,实现扩展算法。
def abc(img: ndarray) -> ndarray:
# Your Code
本项目使用了Matlab和scikit-image的图像用例,以及icons8的程序图标,在此致谢。