在数字时代,图像处理已成为一项重要的技术需求。Photoshop等专业软件功能强大,但对普通用户来说可能过于复杂。因此,开发一个简单、小巧且易于使用的图像处理软件变得十分必要。本文将介绍如何使用MicrosoftVisual Studio2010和OpenCV库(版本2.4.1)来创建这样一个软件。
该软件允许用户加载图像,转换为不同的颜色空间(如RGB、HSV、YCrCb),调整亮度/对比度,应用滤镜(如噪声、模糊等),直方图均衡化,查看图像信息等。处理后的图像可以以可选的质量保存。
要使用此代码,需要具备基本的图像处理知识,了解如何在Visual Studio中使用MFC以及OpenCV库。
程序分为三个部分:图像处理核心类、图像预览类和主处理流程。
此类包含许多处理函数,如调整亮度、添加噪声、检测边缘、旋转图像等。所有这些函数的形式如下:
void Brightness(cv::Mat &src, cv::Mat &dst, int val);
其中,src是源图像,dst是处理后的图像,val是特定函数的值。
此类继承自CDialog类。此类具有统一的函数,允许更改参数并预览处理后的图像。
例如,当点击亮度调整菜单时,图像预览对话框将出现。OnInitDialog函数定义如下:
BOOL ImgPreview::OnInitDialog() {
// 初始化组件
this->slider1.SetRange(0, 450);
this->slider1.SetPos(225);
this->slider2.SetRange(0, 450);
this->slider2.SetPos(225);
this->slider3.SetRange(0, 450);
this->slider3.SetPos(225);
this->slider2.EnableWindow(false);
this->slider3.EnableWindow(false);
switch (type) {
case m_brightness: {
this->param1.SetWindowTextA("Brightness");
break;
}
// ...
}
return true;
}
当在图像预览对话框中改变滑块位置时,图像的亮度必须相应改变并显示在图片框中。
主处理流程基于MFC对话框,包含菜单系统、按钮和其他控件。例如,反转图像的事件处理程序如下:
void CMyPhotoEditorDlg::OnUpdateAdjustmentsInvert(CCmdUI *pCmdUI) {
// 反转图像
process.Invert(src, src);
ImageDisplay(src);
// ...
}
如果需要预览的菜单处理图像,菜单事件处理程序将如下所示:
void CMyPhotoEditorDlg::OnUpdateAdjustmentsBrightness(CCmdUI *pCmdUI) {
// 调整亮度
ImgPreview dlg;
dlg.SetType(m_brightness);
dlg.src = src;
dlg.DoModal();
if (dlg.is_ok) {
process.Brightness(src, src, dlg.i_param1);
ImageDisplay(src);
// ...
}
}
另一个重要任务是验证菜单系统。如果不进行验证,可能会出现错误。例如,如果尝试将灰度图像转换为HSV模式,或者尝试修改未加载的图像(即空图像),程序可能会崩溃。验证菜单函数如下:
void CMyPhotoEditorDlg::ValidateMenu() {
// 验证菜单
CMenu *m_file = GetMenu();
m_file->GetSubMenu(0);
CMenu *m_image = GetMenu();
m_image->GetSubMenu(1);
// ...
if (!is_load) {
m_file->EnableMenuItem(ID_FILE_SAVE1, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_GRAYSCALE, MF_DISABLED|MF_GRAYED);
// ...
} else {
m_file->EnableMenuItem(ID_FILE_SAVE1, MF_ENABLED);
m_image->EnableMenuItem(ID_MODE_GRAYSCALE, MF_ENABLED);
// ...
}
if (is_gray) {
m_image->EnableMenuItem(ID_MODE_HSV, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_YCrCb, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_RGBCOLOR, MF_DISABLED|MF_GRAYED);
}
if (is_hsv) {
m_image->EnableMenuItem(ID_MODE_HSV, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_GRAYSCALE, MF_DISABLED|MF_GRAYED);
m_image->EnableMenuItem(ID_MODE_YCrCb, MF_DISABLED|MF_GRAYED);
}
// ...
}
视图菜单包含图像信息、直方图和历史记录。如果选择了这些菜单,它们将被设置为选中状态,并在每一步之后更新。
void CMyPhotoEditorDlg::OnUpdateAdjustmentsBrightness(CCmdUI *pCmdUI) {
// 亮度
ImgPreview dlg;
// ...
dlg.DoModal();
if (dlg.is_ok) {
// ...
if (is_histogram) UpdateHistogram(0);
if (is_history) history_list.AddString("Adjust Image Brightness");
}
}