⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demoview.cpp

📁 visual c++图像处理经典算法示例程序 把功能都集中在一个程序中
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		pDocNew->UpdateAllViews(pView);
		Invalidate();
		
	}
	
}

void CDemoView::OnRobot() 
{
	CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = ::DIBWidth(lpDIB);
  int h = phead->biHeight;
  int b = phead->biBitCount/8;

  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);

  int  i, j;
  unsigned char *buf=new unsigned char[w*h*b];
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
	  }
  }
  robot(buf, w, h, b);
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
	  }
  }

  ::GlobalUnlock(dib); 
  
  delete []buf;
  Invalidate();
}

void CDemoView::Onprewitt() 
{
		CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = ::DIBWidth(lpDIB);
  int h = phead->biHeight;
  int b = phead->biBitCount/8;

  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);

  int  i, j;
  unsigned char *buf=new unsigned char[w*h*b];
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
	  }
  }
  prewitt(buf, w, h, b);
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
	  }
  }

  ::GlobalUnlock(dib); 
  
  delete []buf;
  Invalidate();
}

void CDemoView::OnLaplacian() 
{
	CDemoDoc *pDoc=GetDocument();
  HDIB dib=pDoc->GetHDIB();

  LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
  LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
  int w = ::DIBWidth(lpDIB);
  int h = phead->biHeight;
  int b = phead->biBitCount/8;

  int lineByte=(w * b+3)/4*4;
  unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);

  int  i, j;
  unsigned char *buf=new unsigned char[w*h*b];
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
	  }
  }
  laplacian(buf, w, h, b);
  for(i=0;i<h;i++){
	  for(j=0;j<w*b;j++){
		  *(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
	  }
  }

  ::GlobalUnlock(dib); 
  
  delete []buf;
  Invalidate();
}

void CDemoView::OnMeanFilter() 
{
	MaskDlg dlg;
	if(dlg.DoModal()==IDOK){
		CDemoDoc *pDoc=GetDocument();
		HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = ::DIBWidth(lpDIB);
		int h = phead->biHeight;
		int b = phead->biBitCount/8;
		
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		int  i, j;
		unsigned char *buf=new unsigned char[w*h*b];
		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
			}
		}
    int maskSize, mask[49];
    if(dlg.m_MaskStyle==3){
      DefineMaskDlg defDlg;
      if(defDlg.DoModal()==IDOK){
        int m[25]={defDlg.m_maskEdit1, defDlg.m_maskEdit2, defDlg.m_maskEdit3, defDlg.m_maskEdit4, defDlg.m_maskEdit5,
                   defDlg.m_maskEdit6, defDlg.m_maskEdit7, defDlg.m_maskEdit8, defDlg.m_maskEdit9, defDlg.m_maskEdit10,
                   defDlg.m_maskEdit11, defDlg.m_maskEdit12, defDlg.m_maskEdit13, defDlg.m_maskEdit14, defDlg.m_maskEdit15,
                   defDlg.m_maskEdit16, defDlg.m_maskEdit17, defDlg.m_maskEdit18, defDlg.m_maskEdit19, defDlg.m_maskEdit20,
                   defDlg.m_maskEdit21, defDlg.m_maskEdit22, defDlg.m_maskEdit23, defDlg.m_maskEdit24, defDlg.m_maskEdit25};
        for(i=0;i<25;i++)
          mask[i]=m[i];
        maskSize=5;
      }
      else{
        for(i=0;i<9;i++)
          mask[i]=1;
        maskSize=3;
      }
    }
    else{
      if(dlg.m_MaskStyle==0)
        maskSize=3;
      else if(dlg.m_MaskStyle==1)
        maskSize=5;
      else if(dlg.m_MaskStyle==2)
        maskSize=7;
      for(i=0;i<maskSize;i++)
        for(j=0;j<maskSize;j++)
          mask[i*maskSize+j]=1;
    }
		meanFilter(buf, w, h, b, mask,maskSize);

		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
			}
		}
		
		::GlobalUnlock(dib); 
		
		delete []buf;
		Invalidate();
	}
 
}

void CDemoView::OnMidleFilter() 
{
	MaskDlg dlg;
	if(dlg.DoModal()==IDOK){
		CDemoDoc *pDoc=GetDocument();
		HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = ::DIBWidth(lpDIB);
		int h = phead->biHeight;
		int b = phead->biBitCount/8;
		
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		int  i, j;
		unsigned char *buf=new unsigned char[w*h*b];
		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
			}
		}
    int maskSize, mask[49];
    if(dlg.m_MaskStyle==3){
      DefineMaskDlg defDlg;
      if(defDlg.DoModal()==IDOK){
        int m[25]={defDlg.m_maskEdit1, defDlg.m_maskEdit2, defDlg.m_maskEdit3, defDlg.m_maskEdit4, defDlg.m_maskEdit5,
                   defDlg.m_maskEdit6, defDlg.m_maskEdit7, defDlg.m_maskEdit8, defDlg.m_maskEdit9, defDlg.m_maskEdit10,
                   defDlg.m_maskEdit11, defDlg.m_maskEdit12, defDlg.m_maskEdit13, defDlg.m_maskEdit14, defDlg.m_maskEdit15,
                   defDlg.m_maskEdit16, defDlg.m_maskEdit17, defDlg.m_maskEdit18, defDlg.m_maskEdit19, defDlg.m_maskEdit20,
                   defDlg.m_maskEdit21, defDlg.m_maskEdit22, defDlg.m_maskEdit23, defDlg.m_maskEdit24, defDlg.m_maskEdit25};
        for(i=0;i<25;i++)
          mask[i]=m[i];
        maskSize=5;
      }
      else{
        for(i=0;i<9;i++)
          mask[i]=1;
        maskSize=3;
      }
    }
    else{
      if(dlg.m_MaskStyle==0)
        maskSize=3;
      else if(dlg.m_MaskStyle==1)
        maskSize=5;
      else if(dlg.m_MaskStyle==2)
        maskSize=7;
      for(i=0;i<maskSize;i++)
        for(j=0;j<maskSize;j++)
          mask[i*maskSize+j]=1;
    }
		midFilter(buf, w, h, b, mask,maskSize);

		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
			}
		}
		
		::GlobalUnlock(dib); 
		
		delete []buf;
		Invalidate();
	}
}

void CDemoView::OnThreshSegment() 
{
	
	CDemoDoc *pDoc=GetDocument();
	HDIB dib=pDoc->GetHDIB();
	
	LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
	LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
	int w = ::DIBWidth(lpDIB);
	int h = phead->biHeight;
	int b = phead->biBitCount/8;
	if(b!=1){
		::MessageBox(0,"只处理灰度图象!",MB_OK,0);
		::GlobalUnlock(dib); 
		return;
	}
	int lineByte=(w * b+3)/4*4;
	unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
	
	int  i, j;
	unsigned char *buf=new unsigned char[w*h*b];
	for(i=0;i<h;i++){
		for(j=0;j<w*b;j++){
			*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
		}
	}
	threshDlg dlg;
	if(dlg.DoModal()==IDOK){
		int thresh=dlg.m_Thresh;
		
		ErZhiSegment(buf, w, h, thresh);
	}
	for(i=0;i<h;i++){
		for(j=0;j<w*b;j++){
			*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
		}
	}
	
	::GlobalUnlock(dib); 
	
	delete []buf;
	Invalidate();
	
}

void CDemoView::OnDajinThresh() 
{
		CDemoDoc *pDoc=GetDocument();
		HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = ::DIBWidth(lpDIB);
		int h = phead->biHeight;
		int b = phead->biBitCount/8;
		if(b!=1){
			::MessageBox(0,"只处理灰度图象!",MB_OK,0);
			::GlobalUnlock(dib); 
			return;
		}
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		int  i, j;
		unsigned char *buf=new unsigned char[w*h*b];
		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(buf+i*w*b+j)=*(lpDIBBits+i*lineByte+j);
			}
		}

    autoThreshSegment(buf, w, h);

		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);
			}
		}
		
		::GlobalUnlock(dib); 
		
		delete []buf;
		Invalidate();
}

void CDemoView::OnImgReverse() 
{
	CDemoDoc *pDoc=GetDocument();
	HDIB dib=pDoc->GetHDIB();
	
	LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
	LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
	int w = ::DIBWidth(lpDIB);
	int h = phead->biHeight;
	int b = phead->biBitCount/8;
	int lineByte=(w * b+3)/4*4;
	unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
	for(int i=0;i<h*lineByte;i++){			
		*(lpDIBBits+i)=255-*(lpDIBBits+i);
	}
	::GlobalUnlock(dib); 
	Invalidate();
}

void CDemoView::OnRGBToGray() 
{
	CDemoDoc *pDoc=GetDocument();
	HDIB dib=pDoc->GetHDIB();
	
	LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
	LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
	int w = ::DIBWidth(lpDIB);
	int h = phead->biHeight;
	int b = phead->biBitCount/8;
	if(b!=3){
		::MessageBox(0,"只处理彩色图象!",MB_OK,0);
		::GlobalUnlock(dib); 
		return;
	}
	int lineByte=(w * b+3)/4*4;
	unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
	
	int i,j, newlineByte=(w+3)/4*4; 
	
	   int palSize=1024;
	   HANDLE dibNew=::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER)+ palSize+h*newlineByte);
	   LPSTR lpDIBNew = (LPSTR) ::GlobalLock(dibNew);
	   
	   ::memcpy((unsigned char*)lpDIBNew, (unsigned char*)lpDIB, sizeof(BITMAPINFOHEADER)+ palSize);
	   BITMAPINFOHEADER *info=(BITMAPINFOHEADER*)lpDIBNew;
	   info->biHeight=h;
	   info->biWidth=w;
	   info->biBitCount=8;
	   
	   LPSTR p=lpDIBNew+sizeof(BITMAPINFOHEADER);
	   for(i=0;i<256;i++){
		   for(j=0;j<3;j++)
			   *(p+i*4+j)=i;
       *(p+i*4+3)=0;
	   }
	   unsigned char *lpDIBBitsNew=(unsigned char *)::FindDIBBits(lpDIBNew);
	   for(i=0;i<h;i++){
		   for(j=0;j<newlineByte;j++){
         int Y=0.299*(double)*(lpDIBBits+i*lineByte+j*3+2)+0.587*(double)*(lpDIBBits+i*lineByte+j*3+1)
						+0.114*(double)*(lpDIBBits+i*lineByte+j*3+0)+0.1;
			   *(lpDIBBitsNew+i*newlineByte+j)=Y;/*0.30* *(lpDIBBits+i*lineByte+j*3+0)
				   +0.59* *(lpDIBBits+i*lineByte+j*3+1)
				   +0.11* *(lpDIBBits+i*lineByte+j*3+2);*/
		   }
	   }
	   ::GlobalUnlock(dib); 
	   ::GlobalUnlock(dibNew); 
	   
	   CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
	   pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);	   
	   CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView();
	   CDemoDoc* pDocNew=pView->GetDocument();	   
	   pDocNew->ReplaceHDIB((HDIB)dibNew);
	   pDocNew->InitDIBData();
	   pDocNew->UpdateAllViews(pView);
	   Invalidate();
}

void CDemoView::OnlinearTrans() 
{
	linearStretch dlg;
	if(dlg.DoModal()==IDOK){
		CDemoDoc *pDoc=GetDocument();
		HDIB dib=pDoc->GetHDIB();
		
		LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
		LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
		int w = ::DIBWidth(lpDIB);
		int h = phead->biHeight;
		int b = phead->biBitCount/8;		
		int lineByte=(w * b+3)/4*4;
		unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
		
		int  i, j;
		unsigned char *buf=new unsigned char[lineByte*h];
		
		int posData[4];
		posData[0]=dlg.m_point1X;
		posData[1]=dlg.m_point1Y;
		posData[2]=dlg.m_point2X;
		posData[3]=dlg.m_point2Y;

		if(b==1)
	    	Graytransition(lpDIBBits,buf,w,h,posData);
		else
			RGBtransition(lpDIBBits,buf,w,h,posData);

		for(i=0;i<h;i++){
			for(j=0;j<w*b;j++){
				*(lpDIBBits+i*lineByte+j)=*(buf+i*lineByte+j);
			}
		}		
		::GlobalUnlock(dib); 
		
		delete []buf;
		Invalidate();
	}

}

void CDemoView::OnhistAver() 
{
	CDemoDoc *pDoc=GetDocument();
	HDIB dib=pDoc->GetHDIB();
	
	LPSTR	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
	LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
	int w = ::DIBWidth(lpDIB);
	int h = phead->biHeight;
	int b = phead->biBitCount/8;		
	int lineByte=(w * b+3)/4*4;
	unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);
	unsigned char*lpIn=lpDIBBits;
	if(b==1)
	{
		int lineByte1=(w * b+3)/4*4;
		unsigned char *lpOut=new unsigned char [h*lineByte1];
		PointEqual((LPBYTE)lpIn,(LPBYTE)lpOut,w,h,256);
		::memcpy(lpIn,lpOut,h*lineByte1);
		::GlobalUnlock(dib);
		pDoc->SetModifiedFlag(TRUE);
		delete []lpOut;
	}
	else if(b==3)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -