📄 imggrabprocdoc.cpp
字号:
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=
BOUND(GaussSmoothProc(0,pDibTmp,j,i)/16,0,255);
}
}
}
else{
for (int nColor=0;nColor<3;nColor++){
for (int j=1;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth-1;i++){
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+nColor]=
BOUND(GaussSmoothProc(nColor,pDibTmp,j,i)/16,0,255);
}
}
}
}
::GlobalFree (pDibTmp);
EndWaitCursor();
UpdateAllViews (NULL);
}
}
//************************
/*for (int lie=1;lie<m_bmInfo.bmiHeader.biHeight-1;lie++){
for (int hang=1;hang<m_bmInfo.bmiHeader.biWidth-1;hang++){
m_pDib[(lie*m_bmInfo.bmiHeader.biWidth +hang)*3]=1;
m_pDib[(lie*m_bmInfo.bmiHeader.biWidth +hang)*3+1]=
m_pDib[(lie*m_bmInfo.bmiHeader.biWidth +hang)*3+2]=
BOUND(GaussSmoothProc(0,pDibTmp,lie,hang)/16,0,255);
}
}*/
//**************************8
int CImgGrabProcDoc::GaussSmoothProc (int nrgb,BYTE* pDibTem,int j,int i)
{
int ColorTem=pDibTem[((j-1)*m_bmInfo.bmiHeader.biWidth +i-1)*3+ nrgb]*Gauss[0]+
pDibTem[((j-1)*m_bmInfo.bmiHeader.biWidth +i)*3+ nrgb]*Gauss[1]+
pDibTem[((j-1)*m_bmInfo.bmiHeader.biWidth +i+1)*3+ nrgb]*Gauss[2]+
pDibTem[((j)*m_bmInfo.bmiHeader.biWidth +i-1)*3+ nrgb]*Gauss[3]+
pDibTem[((j)*m_bmInfo.bmiHeader.biWidth +i)*3+ nrgb]*Gauss[4]+
pDibTem[((j)*m_bmInfo.bmiHeader.biWidth +i+1)*3+ nrgb]*Gauss[5]+
pDibTem[((j+1)*m_bmInfo.bmiHeader.biWidth +i-1)*3+ nrgb]*Gauss[6]+
pDibTem[((j+1)*m_bmInfo.bmiHeader.biWidth +i)*3+ nrgb]*Gauss[7]+
pDibTem[((j+1)*m_bmInfo.bmiHeader.biWidth +i+1)*3+ nrgb]*Gauss[8];
return ColorTem;
}
//***********************Gauss smooth End********************
//*******************Median Filter**************
void CImgGrabProcDoc::OnMedianFilter()
{
if (!m_pDib){
AfxMessageBox("No Image Opened");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth *m_bmInfo.bmiHeader.biHeight *3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc (GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Fail to allocate memory");
return;
}
::CopyMemory(pDibTmp,m_pDib,nDibSize);
MeFilterModeDlg dlg;
if (dlg.DoModal ()==IDOK){
BeginWaitCursor();
switch (dlg.m_nMoudle ){
case 0:
MedianFilterProc(2,pDibTmp);
break;
case 1:
MedianFilterProc(3,pDibTmp);
break;
case 2:
MedianFilterProc(4,pDibTmp);
break;
}
::GlobalFree(pDibTmp);
EndWaitCursor();
UpdateAllViews(NULL);
}
}
void CImgGrabProcDoc::MedianFilterProc(int nMoudle,BYTE* pDibTem)
{
int l,k;
int* ColorTmp=new int[nMoudle*nMoudle];
for (int j=1;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth-1;i++){
//int* ColorTmp=new int[nMoudle*nMoudle];
for (l=0;l<nMoudle;l++){
for (k=0;k<nMoudle;k++){
ColorTmp[l*nMoudle+k]=pDibTem[((j+l-1)*m_bmInfo.bmiHeader.biWidth+(i+k-1))*3];
}
}
for (l=0;l<nMoudle*nMoudle;l++){
for (k=0;k<nMoudle*nMoudle-l;k++){
if (ColorTmp[l]>ColorTmp[l+1]){
int a;
a=ColorTmp[l+1];
ColorTmp[l+1]=ColorTmp[l];
ColorTmp[l]=a;
}
}
}
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]=
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]=
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=
BOUND((ColorTmp[(nMoudle*nMoudle)/2]+ColorTmp[(nMoudle*nMoudle)/2+1])/2,0,255);
}
}
//delete []ColorTmp;
return;
}
//********************Median filter End**********
//********************Grad sharp**************
void CImgGrabProcDoc::OnGradSharp()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
BeginWaitCursor();
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=0;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=0;i<m_bmInfo.bmiHeader.biWidth-1;i++){
int ColorTmp=abs(pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]-
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3])+
abs(pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]-
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]=
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]=
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=BOUND(ColorTmp*4,0,255);
}
}
::GlobalFree(pDibTmp);
EndWaitCursor();
UpdateAllViews(NULL);
}
//**********************Grad Sharp End*********************
//**********************High Boost Filter******************
void CImgGrabProcDoc::OnHighFilter()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
BeginWaitCursor();
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=1;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth-1;i++){
int ColorTmp=pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(-1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(-1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(9*2-1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(-1);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]=BOUND(ColorTmp/9,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]=BOUND(ColorTmp/9,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=BOUND(ColorTmp/9,0,255);
}
}
::GlobalFree(pDibTmp);
EndWaitCursor();
UpdateAllViews(NULL);
return;
}
//****************High Boost Filter End**************
//*********************draw Histograms***************
void CImgGrabProcDoc::OnHistogram()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
HistogramsDlg dlg;
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=0;j<m_bmInfo.bmiHeader.biHeight;j++){
for (int i=0;i<m_bmInfo.bmiHeader.biWidth;i++){
dlg.m_nR[BOUND(pDibTmp[(j*m_bmInfo.bmiHeader.biWidth+i)*3],0,255)]++;
dlg.m_nG[BOUND(pDibTmp[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1],0,255)]++;
dlg.m_nB [BOUND(pDibTmp[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2],0,255)]++;
}
}
dlg.DoModal ();
delete dlg;
::GlobalFree(pDibTmp);
return;
}
//*****************************End HistoGrams************
//*****************************Dot Liner Tran******************
void CImgGrabProcDoc::OnDotLiner()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
LinerDlg dlg;
if (dlg.DoModal ()==IDOK){
BeginWaitCursor();
for (int k=0;k<3;k++){
for (int j=1;j<m_bmInfo.bmiHeader.biHeight;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth;i++){
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+k]=
BOUND(m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+k]*dlg.m_fa+dlg.m_fb,0,255);
}
}
}
}
delete dlg;
EndWaitCursor();
UpdateAllViews(NULL);
return;
}
//****************************End Liner Tran******************
//***********************window transform****************
void CImgGrabProcDoc::OnWindowTrans()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
WindowTran dlg;
if (dlg.DoModal ()==IDOK){
BeginWaitCursor();
for (int k=0;k<3;k++){
for (int j=1;j<m_bmInfo.bmiHeader.biHeight;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth;i++){
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+k]=
WINTRAN(m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+k],dlg.m_Low,dlg.m_Low+dlg.m_WindowWidth);
}
}
}
EndWaitCursor();
}
delete dlg;
UpdateAllViews(NULL);
return;
}
//****************End Window Tran****************
//***************Grad Average********************
void CImgGrabProcDoc::OnGradAvg()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
int ImgS=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight;
ULONG nDibSize=ImgS*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
long RCount[256],GCount[256],BCount[256],TempR[256],TempG[256],TempB[256];
BeginWaitCursor();
for (int k=0;k<256;k++){
GCount[k]=BCount[k]=RCount[k]=0;
TempR[k]=TempG[k]=TempB[k]=0;
}
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=1;j<m_bmInfo.bmiHeader.biHeight;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth;i++){
RCount[m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]]++;
GCount[m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]]++;
BCount[m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]]++;
}
}
for (int i=0;i<256;i++){
for (j=0;j<i;j++){
TempR[i]+=RCount[j];
TempG[i]+=GCount[j];
TempB[i]+=BCount[j];
}
}
for (int l=1;l<m_bmInfo.bmiHeader.biHeight;l++){
for (int h=1;h<m_bmInfo.bmiHeader.biWidth;h++){
m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3]
=BOUND(TempR[m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3]]*255/ImgS,0,255);
m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3+1]
=BOUND(TempG[m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3+1]]*255/ImgS,0,255);
m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3+2]
=BOUND(TempB[m_pDib[(l*m_bmInfo.bmiHeader.biWidth+h)*3+2]]*255/ImgS,0,255);
}
}
EndWaitCursor();
::GlobalFree (pDibTmp);
UpdateAllViews(NULL);
}
//**********end Grad average*********
//**************geometry tran*********8
void CImgGrabProcDoc::OnGeometryTran()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
/* GeometryDlg dlg;
dlg.DoModal ();
dlg.m_X;
float* f=new float[dlg.m_X*dlg.m_X];
for(int i=0;i<dlg.m_X*dlg.m_X;i++){
f[i]=1;
}
//f[dlg.m_X*dlg.m_X-1]=0;*/
BeginWaitCursor();
if (!::Templat (m_pDib,m_bmInfo.bmiHeader.biWidth,m_bmInfo.bmiHeader.biHeight,
3,3,1,1,Gauss,1.000/16)){
AfxMessageBox("Error");
return;}
EndWaitCursor();
UpdateAllViews(NULL);
}
//******************End Geometry********
//
void CImgGrabProcDoc::OnSobelConvo()
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
BeginWaitCursor();
int Strength=2;
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=1;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth-1;i++){
int ColorTmp=pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(-2)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(-1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(0)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(2)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1);
ColorTmp+=pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-2)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(2)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]=BOUND(ColorTmp,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]=BOUND(ColorTmp,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=BOUND(ColorTmp,0,255);
}
}
::GlobalFree(pDibTmp);
EndWaitCursor();
UpdateAllViews(NULL);
}
//
void CImgGrabProcDoc::OnProcConvolute()
//convolute
//the convolute kernel are:
//-1 0 1 1 2 1
//-2 0 2 and 0 0 0
//-1 0 1 -1 -2 -1
//2002.04.27
{
if (!m_pDib){
AfxMessageBox("No image to be process!");
return;
}
ULONG nDibSize=m_bmInfo.bmiHeader.biWidth*m_bmInfo.bmiHeader.biHeight*3;
BYTE* pDibTmp=(BYTE*)::GlobalAlloc(GMEM_FIXED,nDibSize);
if (!pDibTmp){
AfxMessageBox("Failed to allocate memory!");
return;
}
BeginWaitCursor();
int Strength=2;
::CopyMemory(pDibTmp,m_pDib,nDibSize);
for (int j=1;j<m_bmInfo.bmiHeader.biHeight-1;j++){
for (int i=1;i<m_bmInfo.bmiHeader.biWidth-1;i++){
int ColorTmp=pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-2)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(2)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1);
ColorTmp+=pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(1)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(2)+
pDibTmp[((j-1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(1)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(0)+
pDibTmp[((j)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(0)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i-1))*3]*(-1)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i))*3]*(-2)+
pDibTmp[((j+1)*m_bmInfo.bmiHeader.biWidth+(i+1))*3]*(-1);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]=BOUND(ColorTmp,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]=BOUND(ColorTmp,0,255);
m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]=BOUND(ColorTmp,0,255);
//m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3]+=abs((ColorTmp-m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3])*Strength/10);
//m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1]+=abs((ColorTmp-m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+1])*Strength/10);
//m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2]+=abs((ColorTmp-m_pDib[(j*m_bmInfo.bmiHeader.biWidth+i)*3+2])*Strength/10);
}
}
::GlobalFree(pDibTmp);
EndWaitCursor();
UpdateAllViews(NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -