📄 imageprocessingview.cpp
字号:
// 图象的沃尔什-哈达玛变换
// 更改光标形状
BeginWaitCursor();
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// 获得图象CDib类的指针
CDib * pDib = pDoc->m_pDibInit;
// 获得图象的头文件信息
LPBITMAPINFOHEADER lpBMIH=pDib->m_lpBMIH;
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的沃尔什-哈达玛变换)
if (lpBMIH->biBitCount != 8)
{
// 提示用户
MessageBox("目前只支持256色位图的离散沃尔什变换!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 进行沃尔什-哈达玛变换
DIBWalsh(pDib);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
/*************************************************************************
*
* \函数名称:
* OnViewHistogram()
*
* \输入参数:
* 无
*
* \返回值:
* 无
*
* \说明:
* 查看直方图,弹出直方图显示界面
*
*************************************************************************
*/
void CImageProcessingView::OnViewHistogram()
{
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// DIB的颜色数目
int nColorTableEntries;
nColorTableEntries = pDoc->m_pDibInit->m_nColorTableEntries;
// 判断是否是8bpp位图(这里只处理8bpp位图)
if ( nColorTableEntries != 256)
{
// 提示用户,不再进行处理
MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 创建对话框
CDlgHistShow dlgHistShow;
// 初始化变量值
dlgHistShow.m_pDib = pDoc->m_pDibInit;
// 显示对话框
if (dlgHistShow.DoModal() != IDOK)
{
// 返回
return;
}
// 恢复光标
EndWaitCursor();
}
/*************************************************************************
*
* \函数名称:
* OnEnhanceSmooth()
*
* \输入参数:
* 无
*
* \返回值:
* 无
*
* \说明:
* 对图象进行平滑处理,并弹出平滑模板设置对话框
*
*************************************************************************
*/
void CImageProcessingView::OnEnhanceSmooth()
{
// TODO: Add your command handler code here
// 图像平滑
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// 模板高度
int nTempHeight;
// 模板宽度
int nTempWidth;
// 模板系数
double dbTempCoef;
// 模板中心元素X坐标
int nTempCenX;
// 模板中心元素Y坐标
int nTempCenY;
// 模板元素数组
double pdbTemp[25];
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
//if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的平滑!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 创建对话框
CDlgSmooth dlgSmth;
// 给模板数组赋初值(为平均模板)
pdbTemp[0] = 1.0;
pdbTemp[1] = 1.0;
pdbTemp[2] = 1.0;
pdbTemp[3] = 0.0;
pdbTemp[4] = 0.0;
pdbTemp[5] = 1.0;
pdbTemp[6] = 1.0;
pdbTemp[7] = 1.0;
pdbTemp[8] = 0.0;
pdbTemp[9] = 0.0;
pdbTemp[10] = 1.0;
pdbTemp[11] = 1.0;
pdbTemp[12] = 1.0;
pdbTemp[13] = 0.0;
pdbTemp[14] = 0.0;
pdbTemp[15] = 0.0;
pdbTemp[16] = 0.0;
pdbTemp[17] = 0.0;
pdbTemp[18] = 0.0;
pdbTemp[19] = 0.0;
pdbTemp[20] = 0.0;
pdbTemp[21] = 0.0;
pdbTemp[22] = 0.0;
pdbTemp[23] = 0.0;
pdbTemp[24] = 0.0;
// 初始化对话框变量值
dlgSmth.m_nTemType = 0;
dlgSmth.m_nSmthTemHeight = 3;
dlgSmth.m_nSmthTemWidth = 3;
dlgSmth.m_nSmthTemCenX = 1;
dlgSmth.m_nSmthTemCenY = 1;
dlgSmth.m_dbSmthTemCoef = (double) (1.0 / 9.0);
dlgSmth.m_pdbTemp = pdbTemp;
// 显示对话框,提示用户设定平移量
if (dlgSmth.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
nTempHeight = dlgSmth.m_nSmthTemHeight;
nTempWidth = dlgSmth.m_nSmthTemWidth;
nTempCenX = dlgSmth.m_nSmthTemCenX;
nTempCenY = dlgSmth.m_nSmthTemCenY;
dbTempCoef = dlgSmth.m_dbSmthTemCoef;
// 删除对话框
delete dlgSmth;
// 更改光标形状
BeginWaitCursor();
// 调用Template()函数平滑DIB
if (GeneralTemplate(pDoc->m_pDibInit, nTempWidth, nTempHeight,
nTempCenX, nTempCenY, pdbTemp, dbTempCoef))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 恢复光标
EndWaitCursor();
}
/*************************************************************************
*
* \函数名称:
* OnEnhanceMedian()
*
* \输入参数:
* 无
*
* \返回值:
* 无
*
* \说明:
* 对图象进行中值滤波,并弹出平滑模板设置对话框
*
*************************************************************************
*/
void CImageProcessingView::OnEnhanceMedian()
{
// 中值滤波
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// 滤波器的高度
int nFilterHeight;
// 滤波器的宽度
int nFilterWidth;
// 中心元素的X坐标
int nFilterCenX;
// 中心元素的Y坐标
int nFilterCenY;
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的平滑!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 创建对话框
CDlgMedian dlgMedian;
// 初始化变量值
dlgMedian.m_nFilterType = 0;
dlgMedian.m_nFilterHeight = 3;
dlgMedian.m_nFilterWidth = 1;
dlgMedian.m_nFilterCenX = 0;
dlgMedian.m_nFilterCenY = 1;
// 显示对话框,提示用户设定平移量
if (dlgMedian.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
nFilterHeight = dlgMedian.m_nFilterHeight;
nFilterWidth = dlgMedian.m_nFilterWidth;
nFilterCenX = dlgMedian.m_nFilterCenX;
nFilterCenY = dlgMedian.m_nFilterCenY;
// 删除对话框
delete dlgMedian;
// 更改光标形状
BeginWaitCursor();
// 调用MedianFilter()函数中值滤波
if (MedianFilter(pDoc->m_pDibInit, nFilterWidth,
nFilterHeight, nFilterCenX, nFilterCenY ))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 恢复光标
EndWaitCursor();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
void CImageProcessingView::OnEnhancePseudcolor()
{
// 伪彩色编码
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// 保存用户选择的伪彩色编码表索引
int nColor;
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平滑,其它的可以类推)
if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 参数对话框
CDlgEnhColor dlgPara;
// 初始化变量值
if (pDoc->m_nColorIndex >= 0)
{
// 初始选中当前的伪彩色
dlgPara.m_nColor = pDoc->m_nColorIndex;
}
else
{
// 初始选中灰度伪彩色编码表
dlgPara.m_nColor = 0;
}
// 指向名称数组的指针
dlgPara.m_lpColorName = (LPSTR) ColorScaleName;
// 伪彩色编码数目
dlgPara.m_nColorCount = COLOR_SCALE_COUNT;
// 名称字符串长度
dlgPara.m_nNameLen = sizeof(ColorScaleName) / COLOR_SCALE_COUNT;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
nColor = dlgPara.m_nColor;
// 删除对话框
delete dlgPara;
// 更改光标形状
BeginWaitCursor();
// 判断伪彩色编码是否改动
if (pDoc->m_nColorIndex != nColor)
{
// 调用ReplaceColorPal()函数变换调色板
ReplaceDIBColorTable(pDoc->m_pDibInit, (LPBYTE)ColorsTable[nColor]);
// 更新调色板
pDoc->m_pDibInit->MakePalette();
// 更新类成员变量
pDoc->m_nColorIndex = nColor;
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
// 恢复光标
EndWaitCursor();
}
void CImageProcessingView::OnTransDwt()
{
// 获得文档类指针
CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
// 指向图象的指针
CDib * pDib = pDoc->m_pDibInit;
// 更改光标形状
BeginWaitCursor();
// 进行小波变换
int rsl = DIBDWTStep(pDib,0);
// 恢复光标形状
EndWaitCursor();
// 如果小波变换不成功,则直接返回
if (!rsl)
return;
// 设置脏标志
pDoc->SetModifiedFlag(TRUE);
// 更新显示
pDoc->UpdateAllViews(FALSE);
}
void CImageProcessingView::OnTransIdwt()
{
// 获得文档类指针
CImageProcessingDoc * pDoc = (CImageProcessingDoc *)this->GetDocument();
// 指向图象的指针
CDib * pDib = pDoc->m_pDibInit;
// 更改光标形状
BeginWaitCursor();
// 进行小波反变换
int rsl = DIBDWTStep(pDib,1);
// 恢复光标形状
EndWaitCursor();
// 如果小波变换不成功,则直接返回
if (!rsl)
return;
pDoc->UpdateAllViews(FALSE);
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
BOOL CImageProcessingView::DIBDWTStep(CDib* pDib, int nInv)
{
// 循环变量
int i, j;
// 获取图象的长度和宽度
int nWidth = pDib->m_lpBMIH->biWidth;
int nHeight = pDib->m_lpBMIH->biHeight;
// 获取变换的最大层数
int nMaxWLevel = Log2(nWidth);
int nMaxHLevel = Log2(nHeight);
int nMaxLevel;
if (nWidth == 1<<nMaxWLevel && nHeight == 1<<nMaxHLevel)
nMaxLevel = min(nMaxWLevel, nMaxHLevel);
// 获取图象的存储尺寸
CSize sizeImageSave = pDib->GetDibSaveDim();
// 临时变量
double *pDbTemp;
BYTE *pBits;
// 如果小波变换的存储内存还没有分配,则分配此内存
if(!m_pDbImage){
m_pDbImage = new double[nWidth*nHeight];
if (!m_pDbImage) return FALSE;
// 将图象数据放入m_pDbImage中
for (j=0; j<nHeight; j++)
{
pDbTemp = m_pDbImage + j*sizeImageSave.cx;
pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
for (i=0; i<nWidth; i++)
pDbTemp[i] = pBits[i];
}
}
// 进行小波变换(或反变换)
if (!DWTStep_2D(m_pDbImage, nMaxWLevel-m_nDWTCurDepth, nMaxHLevel-m_nDWTCurDepth,
nMaxWLevel, nMaxHLevel, nInv, 1, m_nSupp))
return FALSE;
// 如果是反变换,则当前层数减1
if (nInv)
m_nDWTCurDepth --;
// 否则加1
else
m_nDWTCurDepth ++;
// 然后,将数据拷贝回原CDib中,并进行相应的数据转换
int lfw = nWidth>>m_nDWTCurDepth, lfh = nHeight>>m_nDWTCurDepth;
for (j=0; j<nHeight; j++)
{
pDbTemp = m_pDbImage + j*sizeImageSave.cx;
pBits = pDib->m_lpImage + (nHeight-1-j)*sizeImageSave.cx;
for (i=0; i<nWidth; i++)
{
if (j<lfh && i<lfw)
pBits[i] = FloatToByte(pDbTemp[i]);
else
pBits[i] = BYTE(FloatToChar(pDbTemp[i]) ^ 0x80);
}
}
// 返回
return TRUE;
}
void CImageProcessingView::OnEnhanceLintrans()
{
// 获取文档
CImageProcessingDoc* pDoc = GetDocument();
// 创建对话框
CDlgEhnLinTrans dlgPara;
// 点1坐标
int nX1;
int nY1;
// 点2坐标
int nX2;
int nY2;
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的灰度拉伸,其它的可以类推)
if(pDoc->m_pDibInit->m_nColorTableEntries != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的伪彩色变换!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 初始化变量值
dlgPara.m_nX1 = 50;
dlgPara.m_nY1 = 30;
dlgPara.m_nX2 = 200;
dlgPara.m_nY2 = 220;
// 显示对话框,提示用户设定拉伸位置
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户的设定
nX1 = dlgPara.m_nX1;
nY1 = dlgPara.m_nY1;
nX2 = dlgPara.m_nX2;
nY2 = dlgPara.m_nY2;
// 删除对话框
delete dlgPara;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -