C++大作业记录
一学期的C++课程要结束了,最后用一篇博客记录一下大作业的过程,记录的可能会有点乱。。。。
1. 开始
1.1 菜单栏
qt的菜单栏的UI界面其实很友好,直接编辑就好
1.1.1 打开图片
打开图片使用到的主要函数是:QFileDialog
中的getOpenFileName
。该函数包含四个参数,分别表示为:
- 参数一:父窗口
- 参数二:对话框标题
- 参数三:默认打开位置。为空则表示打开当前工程所在目录
- 参数四:文件的过滤器,文档的类型之间用
;;
隔开
参考:1
1.1.2 图片另存为
使用的函数:QFileDialog::getSaveFileName
、QGuiApplication::primaryScreen()
包含的头文件:<QGuiApplication>
、<QScreen>
保存时要注意将后缀写上,否则有错误提醒
getSaveFileName
:函数的参数与上面的getOpenFileName
的参数含义是一样的QGuiApplication::primaryScreen()
:screen->grabWindow(ui->label->winId()).save(file_name)
参考:1
1.1.3 保存图片
和上面的差不多,少了一行
1.1.4 新建
把label空间清除。
1.1.5 关闭
close()
2 算法实现
2.1 高斯滤波
滤波是对输入信号进行卷积处理的一个过程,表达式为:
滤波 = 卷积(输入信号,卷积模板),卷积模板/掩膜的不同决定了不同的滤波方式。
高斯滤波:
利用高斯掩膜对输入信号进行卷积,也叫高斯模糊,是一种线性平滑滤波器。
高斯分布公式为:
前面的系数是一个常数不会影响相互之间的比例关系,由于最终都要进行归一化所以在实际计算中只需要计算后半部分。
其中(x,y)是掩膜内任一点的坐标,(ux,uy)是掩膜内中心点的坐标,再图像处理中可以认为是整数,σ是标准差。
2.1.1 高斯平滑流程
- 确定权重矩阵
如果要产生一个3x3的高斯滤波模板,模板的中心位置和周围的点的坐标为:
计算权重矩阵需要设定σ的值,假设为1,则模糊半径为1 的权重矩阵为:
以上九个点的权重之和小于1,如果只计算9个点的加权平均,必须使得它们的权重之和等于1,所以还需要将9个值分别除以他们的权重之和得到最终的权重矩阵。(也就是归一化)
- 计算高斯模糊
得到权重矩阵之后进行高斯模糊。
假设9个像素点的灰度值如下所示:
将每个点乘以对应的权重值,可得:
然后再将得到的就九个值相加得到中心点的高斯模糊的值。
然后对所有的点重复这个过程就得到高斯模糊之后的图像。如果原图是彩色的可以对RGB三个通道分别做高斯平滑。 - σ的选取
高斯滤波生成最重要的参数就是σ,标准差代表着数据的离散程度。如果σ较小,那么生成模板的中心系数较大,而周围系数较小会导致对图像的平滑效果不是很明显;反之,如果σ较大那个生成的模板的各个系数相差就不是很大,类似均值模板。对图像的平滑效果比较明显。
2.1.1.1卷积核大小的定义
高度和宽度应该为奇数并且可以不同。
2.2 均值滤波
对目标像素及周边像素取平均值后再填回目标像素来实现滤波目的的方法。
公式:
均值滤波:
由一个归一化卷积框完成,只是用卷积框覆盖区域所有像素的平均值来代替中心元素
上图中红色点的值是周围蓝色背景区域像素值之和除以25,25是蓝色区域的大小。
优点:
算法简单,计算速度较快
缺点:
去噪的同时去除了很多细节部分,将图像变模糊。
2.3 直方图均衡化
直方图根据灰度图绘制而不是彩色图,所以在使用时需要将彩色图转为灰度图。
直方图均衡化
把原始图像的灰度直方图从比较集中的某个灰度区间变成比较广泛灰度范围内的分布。也就是对图像进行非线性拉伸,重新分配图像像素值,是一定灰度范围内的像素数量大致相同。
2.3.1 流程
- 遍历全图,统计每个灰度下的像素点个数
- 计算每个灰度级的像素点占总像素的点的比例
- 根据求出的比例重新计算每个灰度级下的新的灰度值
- 更新图像的灰度图
2.4 动态库的创建与使用
感谢这个B站视频,动态库的创建与使用有以下几个流程:
-
新建共享库工程,然后编译获得dll文件
-
在另一个工程中导入相关头文件,需要将动态库的两个头文件复制到该工程下。如下图所示,enhance的两个头文件是我动态库的两个头文件
-
然后在qt中选择添加现有文件,将新复制的两个头文件加入工程中,如下图所示
-
链接库,配置pro文件,将动态库的dll文件的路劲加入pro文件中
-
编译执行,会发现只弹出一个对话窗口没有显示要显示的东西,此时,到该工程的debug文件夹下,将动态库的dll文件复制进去然后再次执行,完成。
以上就是动态库创建与使用的测试。测试成功,接下来开始继续大作业的推动。
2.5.1 问题
问题:出现“ACCESS_MASK“问题,在加入动态库之前没有这个问题但加入洞开库之后出现了这个问题,将所有的using namespace cv
改掉之后,还是不行,所以应该是include文件重复引用导致的,将动态库中的h文件中一部分uinclude文件放入cpp文件中,解决。
3. 总结
大作业结束了,但是对c++的学习并不会因此而结束,这门课的结束,是结束也是开始,结束了课程上的学习,开始了自己的探索之旅。