# UI图像处理 **Repository Path**: zhao-puyi/ui-image-processing ## Basic Information - **Project Name**: UI图像处理 - **Description**: 该项目是一个以C++为开发语言,以Qt为开发环境,使用图形用户界面(GUI)的若干工具开发的,能够完成图像裁剪、降噪等若干图像处理功能的程序。 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2022-08-16 - **Last Updated**: 2024-01-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## #项目介绍 ``` 本项目是基于C++语言开发;利用C语言对于Bitmap-File图形文件的读写与储存技术、基于Qt集成开发环境的图形化控件开发的带有GUI用户可交互界面、能够实现bmp位图文件的裁剪、放缩、锐化以及处理模糊化/清晰化的一款多人协作开发的软件。 ``` ## # 开发过程实现 #### #项目分工 ##### 视频地址:https://www.bilibili.com/video/BV11G411V7Kf/?vd_source=e96c07ff761799b4709aefd400a9ff6b | 王威 | GUI控件的引入;Qt控件与各功能接口的编写.**图形化可交互界面的设计。** | | ---------- | ------------------------------------------------------------ | | **赵朴一** | **bitmap位图文件的读写与存储、bImage类的实现,图像锐化与均衡化的实现.** | | **叶子睿** | **主要几何变换的实现:放缩与平移.** | #### #设计思路 #bmp文件的存储 ​ 通过查阅资料我们得知了bmp文件由文件头、信息头、 图像数据阵列等部分构成. $$ linebyte=(width * biBitCount ÷ 8 + 3) ÷ 4 * 4 $$ ​ 实现文件头与信息头存储的结构体如下: ```c++ struct BITMAPFILEHEADER {//位图文件头信息的存储 unsigned short bfType; unsigned int bfSize;unsigned short bfReserved1; unsigned short bfReserved2;unsigned int bfOffBits; };struct BITMAPINFOHEADER { unsigned long biSize;long biWidth; long biHeight;unsigned short biPlanes; unsigned short biBitCount;unsigned long biCompression; unsigned long biSizeImage;long biXPelsPerMeter; long biYPelsPerMeter;unsigned long biClrUsed; unsigned long biClrImportant; }; ``` #GUI可交互图形界面的设计 引入QMenu和QAction控件来添加菜单栏和按钮并设置快捷键,QPushButton控件设置触发点击动作,QLabel控件来设置交互界面. ```c++ QMenu *editMenu = ui->menuBar->addMenu(QObject::tr("图片(&P)")); QAction *action_Open = editMenu->addAction(QObject::tr("打开图片&O")); QMenu *editMenuMake = ui->menuBar->addMenu(QObject::tr("图像几何变换(&M)")); QAction *action_Make1 = editMenuMake->addAction(QObject::tr("图像平移(&T)")); QAction *action_Make2 = editMenuMake->addAction(QObject::tr("图像放缩(&S)")); QMenu *editMenuBetter = ui->menuBar->addMenu(QObject::tr("图像增强(&B)")); QAction *action_Better1 = editMenuBetter->addAction(QObject::tr("图像锐化(&E)")); QAction *action_Better2 = editMenuBetter->addAction(QObject::tr("直方图均衡化(&A)")); QMenu *editMenuTiqu = ui->menuBar->addMenu(QObject::tr("提取(&G)")); QAction *action_Gray = editMenuTiqu->addAction(QObject::tr("图像灰度化")); ``` #图像均衡化 统计像素中各个灰度的出现频率,利用桶来存储后加权计算均衡化之后的像素灰度值. $$ S_k=\sum_{j=0}^k\left(\frac{255n_j}{n}\right) k=0,1,2,3,...L-1 $$ ```c++ for(i=0;ipixel(i,j); r[qRed(rgb)]++; g[qGreen(rgb)]++; b[qBlue(rgb)]++; } }//统计频率 //计算各个灰度的分布概率 for(i=0;i<256;i++){ rPro[i]=(r[i]*1.0)/(width*height); gPro[i]=(g[i]*1.0)/(width*height); bPro[i]=(b[i]*1.0)/(width*height); } ``` #图像的锐化 本项目中的锐化主要指模糊锐化处理,旨在加强像素的色差对比来突出图像的清晰度. > 为了突出对比度,需要设置阈值以决定临近像素的色差达到多大时进行锐化操作。 > > ```c++ > setBetterValue = new QSpinBox(dialog); > setBetterValue->setMaximum(100); > setBetterValue->setMinimum(10); > setBetterValue->move(180,50); > ``` 具体的锐化过程实现如下: ```C++ for(int i = 0; i < width; i++) { for(int j = 0; j < height; j++) { if(image->valid(i,j) && image->valid(i+1, j) && image->valid(i, j+1)) {// rgb00=image->pixel(i,j); rgb01=image->pixel(i,j+1); rgb10=image->pixel(i+1,j); r=qRed(rgb00); g=qGreen(rgb00); b=qBlue(rgb00); /*计算临近像素的灰度反差值*/ tmpR=abs(qRed(rgb00)-qRed(rgb01))+abs(qRed(rgb00)-qRed(rgb10)); tmpG=abs(qGreen(rgb00)-qGreen(rgb01))+abs(qGreen(rgb00)-qGreen(rgb10)); tmpB=abs(qBlue(rgb00)-qBlue(rgb01))+abs(qBlue(rgb00)-qBlue(rgb10)); if((tmpR+120)<255) { if(tmpR>betterValue) { r=tmpR+120; } } else { r=255; } if((tmpG+120)<255) { if(tmpG>betterValue) {//如果超过阈值则将像素灰度设置为指定值执行锐化操作 g=tmpG+120; } } else { g=255; } if((tmpB+120)<255) { if(tmpB>betterValue) { b=tmpB+120; } } else { b=255; } ImageBetter.setPixel(i,j,qRgb(r,g,b)); } } } ``` #图像的基础几何变换 > 只涉及基础的坐标平移or旋转,在此不做过多赘述,直接附上代码 ## #version 暂定版本号为--version 0.0.1,会随着功能的添加或是图形界面的美化不断更新. ## #组员贡献度 | 组员 | 主要工作 | 贡献度 | | :----- | ------------------------------------------------------------ | ------ | | 赵朴一 | 通过查阅相关资料了解到图像锐化与均衡化的相关数学原理并且编写了相关的代码,学习了bitmap位图文件的存储机制.项目主要介绍以及README文件的编写,仓库的整体维护与更新. | 36.8% | | 王威 | Qt控件的编写与实现,GUI交互界面的设计与开发,视频录制 | 33.2% | | 叶子睿 | 图像几何变换的实现 | 30% | ## #使用 请在配置了Qtcreater插件以及gdb/gcc/clang的集成环境编译运行.