背景:本学期多媒体技术原理与应用课程的实验
本学期有一门课程是多媒体技术原理与应用,虽然看培养方案上没有实践课程,但是老师居然还准备了好几个实验,看来老师真是为我们着想。这次是第一个实验,题目比较简单:
编制程序,实现图像文件(如bmp等)的读取、显示、真彩图
转换成灰度图、灰度图转化为二值图及绘制图像直方图功能;
老师要求不允许在真彩图转灰度、灰度转二值图时不允许调库,即使不调库,用裸用python+opencv+matplotlib就可以不超过50行代码实现,就是直接遍历像素点的效率肯定是比不过人家封装好并且优化了的库函数(向np.where()以及cv.cvtColor()都是经过优化的,所以处理的时候明显感觉比库函数慢多了)。我想着即使不调库也很简单,不如整个GUI,还可以让用户自己选择要读取的文件,岂不美哉!于是,现学wxPython(其实就是照着网上教程走,然后有些坑的地方不断谷歌~,最后写出了成品(虽然还是很垃圾,但是相当于一个UI界面就显示完所有的图像,感觉体验比opencv直接冒出多个窗口好点,大佬勿喷 ~~~)
部分代码
主要是还要交实验报告,不方便直接把代码全贴上来,想要完整代码的朋友可以私信我~~~
#暂时只贴一个让我感到神奇的片段:gamma校正,就是将真彩图转换成灰度图(之前说过,老师不许调库)
#该方法将真彩色图转换成灰度图,由于不允许直接使用库函数,所以遍历每个像素点,并对其进行gamma校正,gamma一般取2.2
def rgbToGray(self, event):
g = self.colorImg.copy()
w, h = g.shape[:2][::-1]
for i in range(0, h):
for j in range(0, w):
x = int((1 * g[i, j][2]) ** 2.2) + int((1.5 * g[i, j][1]) ** 2.2) + int((0.6 * g[i, j][0]) ** 2.2)
y = 1 ** 2.2 + 1.5 ** 2.2 + 0.6 ** 2.2
g[i, j] = int((x / y) ** (1 / 2.2))
pic = wx.Bitmap.FromBuffer(w, h, self.BGR2RGB(g))
self.m_bitmap2.SetBitmap(pic)
np.resize(self.grayImg,(w,h))
self.grayImg=g
结果截图
点击第一个按钮后会弹出文件选择框,用户可以自己选择要展示的文件
点击第二个按钮后可以将第一个按钮读取到的真彩色图像转换成灰度图像
点击第三个按钮后将灰度图转换成二值图
点击第四个按钮后,我用的PyCharm开发工具,会在右侧的Plots中看到真彩图对应的图像直方图,然后再我们的UI界面也会看到一模一样的图像直方图。这个实现也不算难。
结语
虽然我写的很烂(不论是这次的代码还是博客,都写得很烂),但是我会不断改进的~
希望各位大佬们给个一键三连~~~
转载:https://blog.csdn.net/m0_46379909/article/details/115645317