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

📄 dipdemodlg.cpp

📁 阮秋琦的数字图像处理学一书所附的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void HistogramEq1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput);

void CDIPDemoDlg::HistogramEq()
{
	if (lpBitmap==0) return;
	BYTE *lpOutput=new BYTE[nByteWidth*nHeight];
	HistogramEq1(nWidth,nHeight,lpBits,lpOutput);
	dest.SetImage(nWidth,nHeight,lpOutput);
	delete lpOutput;
	NoColor();
}

/*
enum {INPUT_FILE,INPUT_GRAB,INPUT_SCAN,
HISTOEQ,HISTOSHOW,SMOOTH,
SHARPEN,PSEUDOCOLOR,BRIGHTMODIFY,
MED,MEAN,GEOMETRICAL,
FOURIER,WALSH,DCT,
SAVEAS,PRINT
};
*/

void CDIPDemoDlg::OnClick(WPARAM pos,LPARAM dump)
{
	int ID=buttonid[pos];
	if (Grabbing)
	{
		if (ID==INPUT_SNAP) Snap();
		else MessageBox("采集图像中,请选择\"捕捉图像\"结束");
	}
	switch(ID)
	{
	case INPUT_FILE:
		OpenFile();
		break;
	case INPUT_PASTE:
		Paste();
		break;
	case INPUT_SCAN:
		Scan();
		break;
	case INPUT_GRAB:
		Grab();
		break;
	case NOCOLOR:
		NoColor();
		break;
	case NOISE_GAUSSIAN:
		Noise(0);
		break;
	case NOISE_PEPPER:
		Noise(1);
		break;
	case INPUT_RESTORE:
		Restore();
		break;
	case GEOMETRICAL:
		Geometrical();
		break;
	case HISTOEQ://直方图修改
		HistogramEq();
		break;
	case HISTOSHOW://显示直方图
		if (lpBitmap)
		{
			CHistogramDlg dlg;
			dlg.lpSource=lpBits;
			dlg.lpDest=dest.lpBits;
			dlg.nWidth=nWidth;
			dlg.nHeight=nHeight;
			dlg.nDestWidth=dest.nWidth;
			dlg.nDestHeight=dest.nHeight;
			dlg.DoModal();
		}
		break;
	case SMOOTH://中值滤波
		Smooth();
		break;
	case EDGE:
		Edge();
		break;
	case TRANSFORM:
		Transform();
		break;
	case BRIGHTMODIFY:
		BrightModify();
		break;
	case BIVALUE:
		BiValue();
		break;
	case PSEUDOCOLOR:
		PseudoColor();
		break;
	case OUTPUT_SAVEAS:
		SaveAs();
		break;
	case OUTPUT_COPY:
		Copy();
		break;
	case OUTPUT_PRINT:
		PrintImages();
		break;
	case -1:
		CDialog::OnCancel();
		break;
	case -2:
		ShowWindow(SW_MINIMIZE);
		break;
	}
}

void Med1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Mean1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Gauss1(int nWidth,int nHeight,BYTE *lpIn,BYTE *lpOut,void (* Progress)(int Pos));

void CDIPDemoDlg::Smooth()
{
	if (!lpBitmap) return;
	CProcessDlg dlg;
	dlg.Introduce="图像复原";
	dlg.Process1=Med1;
	dlg.Option1="中值滤波";
	dlg.Process2=Mean1;
	dlg.Option2="均值滤波";
	dlg.Process3=Gauss1;
	dlg.Option3="高斯模糊";
	dlg.pDest=&dest;
	dlg.lpInput=lpBits;
	dlg.nWidth=nWidth;
	dlg.nHeight=nHeight;
	dlg.DoModal();
	if (dlg.Performed==3)
	{
		NoColor();
	}
}

void Fourier1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Walsh1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Dct1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));

void CDIPDemoDlg::Transform()
{
	if (lpBitmap)
	{
		CProcessDlg dlg;
		dlg.Introduce="图像变换";
		dlg.Process1=Fourier1;
		dlg.Option1="Fourier变换";
		dlg.Process2=Walsh1;
		dlg.Option2="Walsh变换";
		dlg.Process3=Dct1;
		dlg.Option3="离散余弦变换";

		dlg.pDest=&dest;
		dlg.lpInput=lpBits;
		dlg.nWidth=nWidth;
		dlg.nHeight=nHeight;
		dlg.DoModal();
	}
}

void CDIPDemoDlg::Paste()
{
	HGLOBAL hMem;
	BYTE *pMem;
	if (OpenClipboard())
	{
		hMem=GetClipboardData(CF_DIB);
		if (hMem)
		{
			pMem=(BYTE *)GlobalLock(hMem);
			if (lpBitmap) delete lpBitmap;
			int size=GlobalSize(hMem);
			nLen=size+sizeof(BITMAPFILEHEADER);
			lpBitmap=new BYTE[nLen];
			BITMAPFILEHEADER bmh;
			bmh.bfType='B'+'M'*256;
			bmh.bfSize=nLen;
			bmh.bfReserved1=0;
			bmh.bfReserved2=0;
			bmh.bfOffBits=54;
			memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));
			memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),pMem,size);
			LoadBitmap();
			if (lpBitmap) source.SetImage(nWidth,nHeight,lpBits);
			GlobalUnlock(hMem);
			FileName="";
		}
		CloseClipboard();
	}
}

void CDIPDemoDlg::Copy()
{
	if (dest.lpBits==0) return;
	OpenClipboard();
	EmptyClipboard();
	HGLOBAL hMem;
	BYTE *pMem;
	int nLen=dest.nByteWidth*dest.nHeight;
	hMem=GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,nLen+sizeof(BITMAPINFOHEADER));
	pMem=(BYTE *)GlobalLock(hMem);
	BITMAPINFOHEADER *bmi=(BITMAPINFOHEADER *)pMem;
	bmi->biSize=sizeof(BITMAPINFOHEADER);
	bmi->biWidth=nWidth;
	bmi->biHeight=nHeight;
	bmi->biPlanes=1;
	bmi->biBitCount=24;
	bmi->biCompression=BI_RGB;
	bmi->biSizeImage=0;
	bmi->biXPelsPerMeter=0;
	bmi->biYPelsPerMeter=0;
	bmi->biClrUsed=0;
	bmi->biClrImportant=0;
	memcpy(pMem+sizeof(BITMAPINFOHEADER),dest.lpBits,nLen);
	GlobalUnlock(hMem);
	SetClipboardData(CF_DIB,hMem);
	CloseClipboard();
}

void CDIPDemoDlg::NoColor()
{
	if (lpBitmap==0) return;
	int x,y,p;
	BYTE Point;
	for(y=0;y<nHeight;y++)
	{
		for(x=0;x<nWidth;x++)
		{
			p=x*3+y*nByteWidth;
			Point=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);
			lpBits[p+2]=Point;
			lpBits[p+1]=Point;
			lpBits[p]=Point;
		}
	}
	source.SetImage(nWidth,nHeight,lpBits);
}

void CDIPDemoDlg::Noise(int type)
{
	if (lpBitmap==0) return;
	int x,y,p;
	BYTE Point;
	srand((unsigned)time(NULL));
	if (type==0)
	{
		for(y=0;y<nHeight;y++)
		{
			for(x=0;x<nWidth;x++)
			{
				Point=rand()/1024;
				p=x*3+y*nByteWidth;
				lpBits[p+2]=lpBits[p+2]*224/256+Point;
				lpBits[p+1]=lpBits[p+1]*224/256+Point;
				lpBits[p]=lpBits[p]*224/256+Point;
			}
		}
	}
	else
	{
		for(y=0;y<nHeight;y++)
		{
			for(x=0;x<nWidth;x++)
			{
				if (rand()>31500)
				{
					p=x*3+y*nByteWidth;
					lpBits[p+2]=0;
					lpBits[p+1]=0;
					lpBits[p]=0;
				}
			}
		}
	}
	source.SetImage(nWidth,nHeight,lpBits);
}

void CDIPDemoDlg::BrightModify()
{
	if (lpBitmap==0) return;
	int x,y;
	BYTE *lpOutput=new BYTE[nByteWidth*nHeight];
	memset(lpOutput,0,nByteWidth*nHeight);
	for(y=0;y<nHeight;y++)
	{
		for(x=0;x<nWidth*3;x++)
		{
			lpOutput[x+nByteWidth*y]=255-lpBits[x+nByteWidth*y];
		}
	}
	dest.SetImage(nWidth,nHeight,lpOutput);
	delete lpOutput;
}

void CDIPDemoDlg::Restore()
{
	if (lpBackup && lpBitmap)
	{
		memcpy(lpBitmap,lpBackup,nLen);
		source.SetImage(nWidth,nHeight,lpBits);
	}
}

void BiValue1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput);

void CDIPDemoDlg::BiValue()
{
	if (lpBitmap==0) return;
	BYTE *lpOutput=new BYTE[nByteWidth*nHeight];
	BiValue1(nWidth,nHeight,lpBits,lpOutput);
	dest.SetImage(nWidth,nHeight,lpOutput);
	delete lpOutput;
}

void Sobel(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Prewitte(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void Roberts(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void LoG(int nWidth,int nHeight,BYTE *lpIn,BYTE *lpOut,void (* Progress)(int Pos));

void CDIPDemoDlg::Edge()
{
	if (lpBitmap==0) return;
	CProcessDlg dlg;
	dlg.Introduce="边缘提取";

	dlg.Process1=Sobel;
	dlg.Option1="Sobel边缘算子法";

	dlg.Process2=Prewitte;
	dlg.Option2="Prewitte边缘算子法";

	dlg.Process3=Roberts;
	dlg.Option3="Roberts边缘算子法";

	dlg.Process4=LoG;
	dlg.Option4="LoG边缘算子法";

	dlg.pDest=&dest;
	dlg.lpInput=lpBits;
	dlg.nWidth=nWidth;
	dlg.nHeight=nHeight;
	dlg.DoModal();
}

void CDIPDemoDlg::SaveAs()
{
	if (dest.lpBits==0) return;
	CFileDialog dlg(FALSE,"bmp",FileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"位图文件|*.bmp||");
	CFile file;
	if (dlg.DoModal()==IDOK)
	{
		if (!file.Open(dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate))
		{
			MessageBox("无法打开指定的文件");
			return;
		}
		int nLen=dest.nByteWidth*dest.nHeight;
		BYTE *pMem=new BYTE[nLen+sizeof(BITMAPINFOHEADER)];
		BITMAPINFOHEADER *bmi=(BITMAPINFOHEADER *)pMem;
		bmi->biSize=sizeof(BITMAPINFOHEADER);
		bmi->biWidth=nWidth;
		bmi->biHeight=nHeight;
		bmi->biPlanes=1;
		bmi->biBitCount=24;
		bmi->biCompression=BI_RGB;
		bmi->biSizeImage=0;
		bmi->biXPelsPerMeter=0;
		bmi->biYPelsPerMeter=0;
		bmi->biClrUsed=0;
		bmi->biClrImportant=0;
		BITMAPFILEHEADER bmh;
		bmh.bfType='B'+'M'*256;
		bmh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nLen;
		bmh.bfReserved1=0;
		bmh.bfReserved2=0;
		bmh.bfOffBits=54;

		memcpy(pMem+sizeof(BITMAPINFOHEADER),dest.lpBits,nLen);
		file.Write(&bmh,sizeof(BITMAPFILEHEADER));
		file.Write(pMem,nLen+sizeof(BITMAPINFOHEADER));
		file.Close();
	}
}

void CDIPDemoDlg::PrintImages()
{
	if (source.lpBits==0) return;
	if (dest.lpBits && (source.nWidth!=dest.nWidth || source.nHeight!=dest.nHeight))
	{
		MessageBox("图像尺寸不一致,无法打印!");
		return;
	}
	CPrintDialog dlg(FALSE);
	if (dlg.DoModal()==IDOK)
	{
		CDC dc;
		dc.Attach(dlg.m_pd.hDC);
		DOCINFO di;
		di.cbSize=sizeof(di);
		di.fwType=0;
		di.lpszDatatype=0;
		di.lpszDocName="数字图像处理实验演示软件";
		di.lpszOutput=0;
		dc.SetMapMode(MM_LOENGLISH);
		int maxWidth,maxHeight;
		maxWidth=dc.GetDeviceCaps(HORZRES)-400;
		maxHeight=(dc.GetDeviceCaps(VERTRES)-1000)/2;

		dc.StartDoc(&di);
		BITMAPINFOHEADER bmi;
		bmi.biSize=sizeof(BITMAPINFOHEADER);
		bmi.biWidth=nWidth;
		bmi.biHeight=nHeight;
		bmi.biPlanes=1;
		bmi.biBitCount=24;
		bmi.biCompression=BI_RGB;
		bmi.biSizeImage=0;
		bmi.biXPelsPerMeter=0;
		bmi.biYPelsPerMeter=0;
		bmi.biClrUsed=0;
		bmi.biClrImportant=0;

		int w=nWidth*5,h=nHeight*5,xc;
		if (w>maxWidth)
		{
			w=maxWidth;
			h=h*maxWidth/w;
		}
		if (h>maxHeight)
		{
			h=maxHeight;
			w=w*maxHeight/h;
		}
		xc=(maxWidth-w)/2;

		dc.StartPage();
		StretchDIBits(dc.m_hDC,200+xc,200,w,h,0,0,nWidth,nHeight,
		source.lpBits,
		(BITMAPINFO *)&bmi,
		DIB_RGB_COLORS,
		SRCCOPY);

		StretchDIBits(dc.m_hDC,200+xc,400+h,w,h,0,0,nWidth,nHeight,
		dest.lpBits,
		(BITMAPINFO *)&bmi,
		DIB_RGB_COLORS,
		SRCCOPY);

		dc.EndPage();
		dc.EndDoc();
	}
	DeleteDC(dlg.m_pd.hDC);
	GlobalFree(dlg.m_pd.hDevMode);
	GlobalFree(dlg.m_pd.hDevNames);
}

void PseudoColor1(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));
void PseudoColor2(int nWidth,int nHeight,BYTE *lpInput,BYTE *lpOutput,void (* Progress)(int Pos));

void CDIPDemoDlg::PseudoColor()
{
	if (lpBitmap==0) return;
	CProcessDlg dlg;
	dlg.Introduce="伪彩色";
	dlg.Process1=PseudoColor1;
	dlg.Option1="医学伪彩色处理";
	dlg.Process2=PseudoColor2;
	dlg.Option2="遥感伪彩色处理";

	dlg.pDest=&dest;
	dlg.lpInput=lpBits;
	dlg.nWidth=nWidth;
	dlg.nHeight=nHeight;
	dlg.DoModal();
	if (dlg.Performed) NoColor();
}

void CDIPDemoDlg::Scan()
{
	CScanner dlg;
	if (dlg.DoModal()==IDOK)
	{
		ShellExecute(m_hWnd,"open",dlg.scanner,0,dlg.scanner_path,SW_SHOW);
	}
}

CCPEControl cpe;

void CDIPDemoDlg::Grab()
{
	// TODO: Add your command handler code here
	if (cpe.InitCPE(source.m_hWnd)==-1) return;
	cpe.RTDisplay();
	Grabbing=TRUE;
//	CRect rect;
//	GetParent()->GetClientRect(rect);
//	SetScrollSizes(MM_TEXT,CSize(rect.right,rect.bottom));
	if (lpBitmap)
	{
		delete lpBitmap;
		lpBitmap=0;
	}
}

void CDIPDemoDlg::Snap() 
{
	// TODO: Add your command handler code here
	cpe.RTStop();
	nWidth=cpe.m_GrabWndWidth;
	nWidth/=4;
	nWidth*=4;
	nHeight=cpe.m_GrabWndHeight;
	nHeight/=2;
	nHeight*=2;
	nByteWidth=nWidth*3;
	if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4);
	nLen=nByteWidth*nHeight+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	lpBitmap=new BYTE[nLen];

	lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	ZeroMemory(lpBitmap,nLen);
	BITMAPFILEHEADER bmh;
	BITMAPINFOHEADER bmi;
	bmh.bfType='B'+'M'*256;
	bmh.bfSize=nLen;
	bmh.bfReserved1=0;
	bmh.bfReserved2=0;
	bmh.bfOffBits=54;

	bmi.biSize=sizeof(BITMAPINFOHEADER);
	bmi.biWidth=nWidth;
	bmi.biHeight=nHeight;
	bmi.biPlanes=1;
	bmi.biBitCount=24;
	bmi.biCompression=BI_RGB;
	bmi.biSizeImage=0;
	bmi.biXPelsPerMeter=0;
	bmi.biYPelsPerMeter=0;
	bmi.biClrUsed=0;
	bmi.biClrImportant=0;
	memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));
	memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER));
	
	memcpy(lpBits,cpe.lpDib,nByteWidth*nHeight);

//	MessageBox("Step 3 ok");
	cpe.CPEExit();
	Grabbing=FALSE;
	source.SetImage(nWidth,nHeight,lpBits);
}

void CDIPDemoDlg::OnOK() 
{
	// TODO: Add extra validation here
	
//	CDialog::OnOK();
}

void CDIPDemoDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
//	CDialog::OnCancel();
}

void CDIPDemoDlg::WinHelp(DWORD dwData, UINT nCmd) 
{
	// TODO: Add your specialized code here and/or call the base class
	CHelpDlg dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

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