📄 dipdoc.cpp
字号:
strCodeL += "1";
fTemp1 = fTemp1*2 - 1;
}
else
{
strCodeL += "0";
fTemp1 = fTemp1 * 2;
}
//将fEnd转换为二进制
if( fTemp2*2 >= 1.0 )
{
strCodeR += "1";
fTemp2 = fTemp2*2 - 1;
}
else
{
strCodeR += "0";
fTemp2 = fTemp2 * 2;
}
}
//最后取两者二进制的中间值
if( fTemp2*2 >= 1.0 )
{
strCodeL += "1";
}
//输出编码结果
AfxMessageBox(strCodeL);
delete [] uCodeNum;
delete [] fInterval;
delete [] fFreq;
}
}
void CDipDoc::OnCodeHuffman()
{
int imgSize;
imgSize = m_pDibObject->GetWidth()*m_pDibObject->GetHeight();
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation(m_pDibObject );
int *pHistogram = PointOperation.GetHistogram();
//生成一个对话框CHistDlg类的实例
CDlgHuffman HuffmanDlg;
//将绘制直方图的数据传递给CHistDlg对话框类的公有成员变量m_pnHistogram
if( pHistogram != NULL )
{
//设置直方图数据指针
HuffmanDlg.m_fFreq = pHistogram;
HuffmanDlg.m_iSizeImage = imgSize;
if(m_pDibObject->GetNumBits() >= 8)
HuffmanDlg.m_iLeafNum=256;
else
HuffmanDlg.m_iLeafNum=m_pDibObject->GetNumBits();
}
//显示对话框
if ( HuffmanDlg.DoModal() != IDOK)
return;
delete [] pHistogram;
}
void CDipDoc::OnCodeShannon()
{
/* int i,j,imgSize;
FLOAT *fFreq;
BYTE *uMap;
int *pHist;
//在点处理CPointPro类中创建直方图数据,并定义指向该数据的指针
CPointPro PointOperation(m_pDibObject);
pHist = PointOperation.GetHistogram();
//图像大小
imgSize = m_pDibObject->GetWidth()*m_pDibObject->GetHeight();
//统计频率不为0的灰度数
j = 0;
for(i=0;i<256;i++)
{
if(pHist[i] > 0) j++;
}
// 分配内存
fFreq = new FLOAT[j];
uMap = new BYTE[j];
//计算图像中亮度数据的各灰度的频率
j = 0;
for(i=0;i<256;i++)
{
if(pHist[i] > 0)
{
fFreq[j] = (float)pHist[i]/imgSize;
//记住频率不为0的灰度的映射关系
uMap[j] = i;
j++;
}
}
//创建香农编码对话框实例
CDlgShannon Shannon;
//传递灰度频率数据、灰度级数给对话框
Shannon.m_fFreq = fFreq;
Shannon.m_uMap = uMap;
Shannon.m_iColorNum = j;
//显示对话框
Shannon.DoModal();
//释放内存
delete[] fFreq;
delete[] uMap;
*/
//***************
//把上面的代码替换为下面的代码可以对指定的信源符号进行香农编码
FLOAT fFreq[8];
BYTE uMap[8];
fFreq[0] = 0.4f;
fFreq[1] = 0.18f;
fFreq[2] = 0.10f;
fFreq[3] = 0.10f;
fFreq[4] = 0.07f;
fFreq[5] = 0.06f;
fFreq[6] = 0.05f;
fFreq[7] = 0.04f;
for(int i=0;i<8;i++) uMap[i] = i;
CDlgShannon Shannon;
Shannon.m_fFreq = fFreq;
Shannon.m_iColorNum = 8;
Shannon.m_uMap = uMap;
Shannon.DoModal();
/****************/
}
void CDipDoc::OnUpdateCodeArith(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnUpdateCodeHuffman(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnUpdateCodeShannon(CCmdUI* pCmdUI)
{
//判断当前是否有图像对象
if( m_pDibObject == NULL ) return;
//在点处理CPointPro类中创建用来绘制直方图的数据
CPointPro PointOperation( m_pDibObject );
//判断是否为256色灰度图像
pCmdUI->Enable(PointOperation.IsGray256());
}
void CDipDoc::OnViewHistmatlab()
{
Engine *ep; //定义Matlab引擎变量
CString command;
if (!(ep=engOpen("\0"))) //打开Matlab引擎
{
fprintf(stderr, "\n Matlab引擎启动失败!\n");
MessageBox(NULL,"Matlab引擎启动失败!","MaTLAB",MB_OK |MB_ICONERROR);
exit(-1);
}
CString strPathName = GetPathName();
//实现MATLAB命令
command="data=imread('"+strPathName+"')";
//通过Matlab引擎执行Matlab命令
engEvalString(ep, command);
engEvalString(ep, "figure,imshow(data)");
engEvalString(ep, "figure('Visible','off','NumberTitle','off', 'Name', '图像的直方图统计','MenuBar','none'),imhist(data)");
MessageBox(NULL,"关闭Matlab引擎,系统将退出Matlab应用程序!","MATLAB",MB_OK | MB_ICONINFORMATION);
engClose(ep); //关闭Matlab引擎,退出Matlab*/
}
void CDipDoc::OnMorphErosionMatlab()
{
//通过向MATLAB空间发送变量实现混合编程
Engine *ep; //定义Matlab引擎变量
mxArray *T = NULL;
mxArray *Data= NULL;
mxArray *Result=NULL;
if (!(ep=engOpen("\0"))) //打开Matlab引擎
{
fprintf(stderr, "\n Matlab引擎启动失败!\n");
MessageBox(NULL,"Matlab引擎启动失败!","MaTLAB",MB_OK |MB_ICONERROR);
exit(-1);
}
//向MATLAB空间传送图像文件名
CString strPathName = GetPathName();
T=mxCreateString(strPathName);
engPutVariable(ep, "T", T);
//------------------------------------------
//向MATLAB空间传送图像数据
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return;
//对不是8位的图像不作任何操作直接返回
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位图像的处理!");
return;
}
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//定义变量
unsigned char *pBuffer;
unsigned char *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits());
if( pBuffer == NULL ) return;
//获得颜色数
nNumColors = m_pDibObject->GetNumColors();
//获得调色板指针
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//获得位图数据指针
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];
//图像数据区大小(字节总数)
DWORD SizeImage = nWidthBytes * nHeight;
//--------------------------------------------------------
//创建图像数据矩阵
Data=mxCreateNumericMatrix(nHeight, nWidthBytes, mxUINT8_CLASS, mxREAL);
//用memcpy内存拷贝命令将图像数据赋给矩阵。
memcpy((char *)(mxGetPr(Data)), (char *)pBits, SizeImage);
//传送到MATLAB空间
engPutVariable(ep, "Data", Data);
//再用rot90()函数将二维矩阵逆时针旋转90度,将矩阵变为nHeight×nWidthBytes的二维矩阵,
//并使的矩阵的第nHeight行对应图像数据的第一行数据。
engEvalString(ep,"Data=rot90(Data)");
engEvalString(ep,"SE = strel('square',[3 3])");
engEvalString(ep,"Result = imerode(Data,SE)");
engEvalString(ep,"Result=rot90(Result,-1)");
Result=engGetVariable(ep,"Result");
memcpy((char *)pBits, (char *)(mxGetPr(Result)), SizeImage);
engClose(ep); //关闭Matlab引擎,退出Matlab*/
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphDilationMatlab()
{
//通过向MATLAB空间发送变量实现混合编程
Engine *ep; //定义Matlab引擎变量
mxArray *T = NULL;
mxArray *Data= NULL;
mxArray *Result=NULL;
if (!(ep=engOpen("\0"))) //打开Matlab引擎
{
fprintf(stderr, "\n Matlab引擎启动失败!\n");
MessageBox(NULL,"Matlab引擎启动失败!","MaTLAB",MB_OK |MB_ICONERROR);
exit(-1);
}
//向MATLAB空间传送图像文件名
CString strPathName = GetPathName();
T=mxCreateString(strPathName);
engPutVariable(ep, "T", T);
//------------------------------------------
//向MATLAB空间传送图像数据
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return;
//对不是8位的图像不作任何操作直接返回
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位图像的处理!");
return;
}
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//定义变量
unsigned char *pBuffer;
unsigned char *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits());
if( pBuffer == NULL ) return;
//获得颜色数
nNumColors = m_pDibObject->GetNumColors();
//获得调色板指针
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//获得位图数据指针
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];
//图像数据区大小(字节总数)
DWORD SizeImage = nWidthBytes * nHeight;
//--------------------------------------------------------
//创建图像数据矩阵
Data=mxCreateNumericMatrix(nHeight, nWidthBytes, mxUINT8_CLASS, mxREAL);
//用memcpy内存拷贝命令将图像数据赋给矩阵。
memcpy((char *)(mxGetPr(Data)), (char *)pBits, SizeImage);
//传送到MATLAB空间
engPutVariable(ep, "Data", Data);
//再用rot90()函数将二维矩阵逆时针旋转90度,将矩阵变为nHeight×nWidthBytes的二维矩阵,
//并使的矩阵的第nHeight行对应图像数据的第一行数据。
engEvalString(ep,"Data=rot90(Data)");
engEvalString(ep,"SE = strel('square',3)");
engEvalString(ep,"Result = imdilate(Data,SE)");
engEvalString(ep,"Result=rot90(Result,-1)");
Result=engGetVariable(ep,"Result");
memcpy((char *)pBits, (char *)(mxGetPr(Result)), SizeImage);
engClose(ep); //关闭Matlab引擎,退出Matlab*/
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphThiningMatlab()
{
// TODO: Add your command handler code here
//通过向MATLAB空间发送变量实现混合编程
Engine *ep; //定义Matlab引擎变量
mxArray *T = NULL;
mxArray *Data= NULL;
mxArray *Result=NULL;
if (!(ep=engOpen("\0"))) //打开Matlab引擎
{
fprintf(stderr, "\n Matlab引擎启动失败!\n");
MessageBox(NULL,"Matlab引擎启动失败!","MaTLAB",MB_OK |MB_ICONERROR);
exit(-1);
}
//向MATLAB空间传送图像文件名
CString strPathName = GetPathName();
T=mxCreateString(strPathName);
engPutVariable(ep, "T", T);
//------------------------------------------
//向MATLAB空间传送图像数据
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return;
//对不是8位的图像不作任何操作直接返回
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位图像的处理!");
return;
}
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//定义变量
unsigned char *pBuffer;
unsigned char *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits());
if( pBuffer == NULL ) return;
//获得颜色数
nNumColors = m_pDibObject->GetNumColors();
//获得调色板指针
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//获得位图数据指针
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];
//图像数据区大小(字节总数)
DWORD SizeImage = nWidthBytes * nHeight;
//--------------------------------------------------------
//创建图像数据矩阵
Data=mxCreateNumericMatrix(nHeight, nWidthBytes, mxUINT8_CLASS, mxREAL);
//用memcpy内存拷贝命令将图像数据赋给矩阵。
memcpy((char *)(mxGetPr(Data)), (char *)pBits, SizeImage);
//传送到MATLAB空间
engPutVariable(ep, "Data", Data);
//再用rot90()函数将二维矩阵逆时针旋转90度,将矩阵变为nHeight×nWidthBytes的二维矩阵,
//并使的矩阵的第nHeight行对应图像数据的第一行数据。
engEvalString(ep,"Data=rot90(Data)");
engEvalString(ep,"SE = strel('square',3)");
engEvalString(ep,"Result = bwmorph(Data,'thin',Inf)");
engEvalString(ep,"Result=rot90(Result,-1)");
Result=engGetVariable(ep,"Result");
memcpy((char *)pBits, (char *)(mxGetPr(Result)), SizeImage);
engClose(ep); //关闭Matlab引擎,退出Matlab*/
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
UpdateAllViews(NULL);
}
void CDipDoc::OnFftMideva()
{
//初始化Matrix<LIB>类库
initM(MATCOM_VERSION);
Mm m_matBits;
//读取图像数据
//-------------------------------------------------
//图像指针为空,无法操作返回
if(m_pDibObject == NULL) return;
//对不是8位的图像不作任何操作直接返回
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位图像的处理!");
return;
}
//获取图像宽度和高度(以像素为单位)
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//定义变量
unsigned char *pBuffer, *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits());
if( pBuffer == NULL ) return;
//获得颜色数
nNumColors = m_pDibObject->GetNumColors();
//获得调色板指针
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//获得位图数据指针
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];
//图像数据区大小(字节总数)
DWORD SizeImage = nWidthBytes * nHeight;
//创建图像数据矩阵,并将其元素初始值设为0
m_matBits = zeros(1, SizeImage);
//默认的矩阵数据类型是double,
//首先将其转换为unsigned char型,
//以便用memcpy内存拷贝命令将图像数据赋给矩阵。
m_matBits = muint8(m_matBits);
//通过Matrix<LIB>C++库的.addr()函数返回矩阵变量的内存指针,以完成对矩阵单元的访问。
//用memcpy内存拷贝命令将图像数据赋给矩阵。
memcpy(m_matBits.addr(), pBits, SizeImage);
//由于Mm类型的矩阵是按先列后行的顺序排列,
//在此用reshape()函数将创建的一维矩阵m_matBits变维为nWidthBytes×nHeight的二维矩阵。
//再用rot90()函数将二维矩阵逆时针旋转90度,将矩阵变为nHeight×nWidthBytes的二维矩阵,
//并使的矩阵的第nHeight行对应图像数据的第一行数据。
m_matBits = rot90(reshape(m_matBits, nWidthBytes, nHeight));
//若图像宽度与其字节宽度不同,
//则将由系统补齐的每行字节数为4的整数倍的各列0删除,以减小矩阵大小加快处理速度。
if(nWidthBytes != nWidth)
{
//相当于Matlab中的X=X(:,1:nWidth)操作
m_matBits = m_matBits(c_p, colon(1, 1, nWidth));
}
//将矩阵由unsigned char型转换为double型,以便进行运算
m_matBits = mdouble(m_matBits);
//内存解锁
::GlobalUnlock(m_pDibObject->GetDib());
//--------------------------------------------------------------
Mm mSize = size(m_matBits);
//调用Matrix<Lib>C++库函数fft2()完成二维离散傅立叶变换
Mm ff = fft2(m_matBits);
Mm matTransed = ff;
//调用Matrix<Lib>C++库函数fftshift()将频域中心移到矩阵中心
ff = fftshift(ff);
//调用Matrix<Lib>C++库函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -