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

📄 imageprocessingview.cpp

📁 matlab版图像数字处理这本书的配套代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		temp=pow(2,i);
		if(temp>=width)
		{
			newWidth=(LONG)temp;
			break;
		}
	}
	for(i=0;;i++)
	{
		temp=pow(2,i);
		if(temp>=height)
		{
			newHeight=(LONG)temp;
			break;
		}
	}
	if(newWidth>newHeight)
		newHeight=newWidth;
	else
		newWidth=newHeight;
	
	
	newLineBytes=(newWidth*8+31)/32*4;


	HDIB hDIB=(HDIB)::GlobalAlloc(GHND,newHeight*newLineBytes+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD));
	lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
	memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+sizeof(RGBQUAD)*256);
	
	lpNewDIBBits=lpNewDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
	lpNewbmi=(LPBITMAPINFOHEADER)lpNewDIB;
	lpNewbmi->biWidth=newWidth;
	lpNewbmi->biHeight=newHeight;
	
	
	
	LPSTR lpDst;
	for(i=0;i<newHeight;i++)
		for(j=0;j<newWidth;j++)
		{
			lpDst=lpNewDIBBits+newLineBytes*(newHeight-1-i)+j;
			
			if(i<=height-1&&j<=width-1)
				*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+j);
			else 
				*((unsigned char *)lpDst)=0;
			
			
		}
		::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
		::GlobalFree((HGLOBAL)pDoc->m_hDIB);
		pDoc->m_hDIB=hDIB;
		::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
		/////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////
		pDoc=GetDocument();
		
		

		
			unsigned char* lpNewBits;
			LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
		
			
			
			lpNewBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);

			
			LONG	w,h;//图象中只有w=2^wp,h=2^hp的部分可以参加傅立叶变换
			int		wp,hp;
			
			w=h=1;
			wp=hp=0;
			
			while(w*2<=newWidth)
			{
				w*=2;
				wp++;
			}
			while(h*2<=newHeight)
			{
				h*=2;
				hp++;
			}
			
			complex<double> *TD = new complex<double>[w * h];
			complex<double> *FD = new complex<double>[w * h];
			
			for(i=0;i<w;i++)
			for(j=0;j<h;j++)
			{
				if((i+j)%2)
					TD[j*w+i]=complex<double>(-*(lpNewBits+j*newLineBytes+i),0);
				else TD[j*w+i]=complex<double>(*(lpNewBits+j*newLineBytes+i),0);
				
			}
			for(j=0;j<h;j++)
				FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
			
			for(i=0;i<w;i++)
			for(j=0;j<h;j++)
				TD[j*w+i]=FD[i*h+j];//zhuan zhi
				
			for(j=0;j<w;j++)
				FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
				//now, w hang, h lie
			for(i=0;i<h;i++)
			for(j=0;j<w;j++)
				FD[j*h+i]/=h;
					//zhuanzhi & save////////////////////////////////////////
			for(i=0;i<w;i++)
			for(j=0;j<h;j++)
				TD[j*w+i]=FD[i*h+j];//zhuan zhi
							//SAVE	
			pDoc->m_hDFT=::GlobalAlloc(GHND,sizeof(complex<double>)*w*h);
			complex<double>* pDFT=(complex<double>*)::GlobalLock(pDoc->m_hDFT);
			memcpy(pDFT,TD,sizeof(complex<double>)*w*h);
			::GlobalUnlock(pDoc->m_hDFT);
							/////////////////////////////////////////////////////////
			double dTemp;
	
			w=h=1;
			wp=hp=0;
			while(w*2<=newWidth)
			{
				w*=2;
				wp++;
			}
			while(h*2<=newHeight)
			{
				h*=2;
				hp++;
			}
			//////////////////////////////////////////////////
			
			memcpy(TD,pDFT,sizeof(complex<double>)*w*h);
			::GlobalUnlock(pDoc->m_hDFT);
			//////////////////////////////////
			//first, change pinyu, display pinpu;
			
			//ButterWorth   ButterWorth   ButterWorth   ButterWorth   ButterWorth   ButterWorth 
			CRadius dlg;
			if(dlg.DoModal()!=IDOK)
				return;
		
			double D0;
			double D1;
			switch(dlg.m_select)
			{
			case 0://Gassian Lowpass filter
				D0=dlg.m_radius;
				
				for(i=0;i<w;i++)
				for(j=0;j<h;j++)
				{
					D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
					dTemp=-(D1)/(2*D0*D0);
					dTemp=exp(dTemp);
					TD[j*w+i]*=dTemp;
				}
				break;
			case 1://Butterworth Highpass filter
				D0=0.05*height;
				for(i=0;i<w;i++)
				for(j=0;j<h;j++)
				{
					D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
					dTemp=(D0*D0*D0*D0)/(pow(D1,2));
					dTemp=1.0/(1.0+dTemp);
					TD[j*w+i]*=dTemp;
				}
				break;
			case 2://High-frequency emphasis filter
				float gain,coefficient;
				gain=dlg.m_gain;
				coefficient=dlg.m_coefficient;
				D0=0.05*newHeight;
				for(i=0;i<w;i++)
				for(j=0;j<h;j++)
				{
					D1=(double)((i-newWidth/2.0)*(i-newWidth/2.0)+(j-newHeight/2.0)*(j-newHeight/2.0));
					dTemp=(D0*D0*D0*D0)/(pow(D1,2));
					dTemp=gain+coefficient/(1.0+dTemp);
					TD[j*w+i]*=dTemp;
				}
				break;
			
			}
			
		
				//second, IDFT
				//////////////////////////////////begin to IDFT
				//1. GONG/E
				for(i=0;i<w;i++)
				for(j=0;j<h;j++)
					TD[j*w+i]=complex<double>(TD[j*w+i].real(),-TD[j*w+i].imag());
					//2.
				for(j=0;j<h;j++)
					FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
					
				for(i=0;i<w;i++)
				for(j=0;j<h;j++)
					TD[j*w+i]=FD[i*h+j];//zhuan zhi
						
				for(j=0;j<w;j++)
					FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
								//now, w hang, h lie
				for(i=0;i<h;i++)
				for(j=0;j<w;j++)
				{
					TD[i*w+j]=FD[j*h+i];//zhuan zhi
					TD[i*w+j]/=h;
				}


				///////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////
				HDIB hDIBb=(HDIB)::GlobalAlloc(GHND,height*LineBytes+*(LPDWORD)pDIB+256*sizeof(RGBQUAD));
				LPSTR pDIB2=(LPSTR)::GlobalLock((HGLOBAL)hDIBb);
				memcpy(pDIB2,pDIB,*(LPDWORD)pDIB+sizeof(RGBQUAD)*256);
				LPSTR pBits=pDIB2+*(LPDWORD)pDIB+256*sizeof(RGBQUAD);
				LPBITMAPINFOHEADER pbmi=(LPBITMAPINFOHEADER)pDIB2;
				pbmi->biWidth=width;
				pbmi->biHeight=height;
			
			
				///////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////


				
				for(i=0;i<h;i++)
				for(j=0;j<w;j++)
				{
					dTemp=abs(TD[(h-1-i)*w+j].real());
					if(dTemp>255)
						dTemp=255;
					////////////////////////////////
					
					if(i<height&&j<width)
					*(pBits+(height-1-i)*LineBytes+j)=dTemp;
					
	
				}
					
				delete TD;
				delete FD;
				////////////////////////////////////
				////////////////////////////////////
				::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
				::GlobalFree((HGLOBAL)pDoc->m_hDIB);
				pDoc->m_hDIB=hDIBb;
				pDoc->m_sizeDoc=CSize((int)width,(int)height);
				SetScrollSizes(MM_TEXT,pDoc->m_sizeDoc);
				////////////////////////////////////////
				////////////////////////////////////////
				
				
				pDoc->UpdateAllViews(NULL);
				::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
				

	  
}


void CImageProcessingView::OnZftjh() 
{
	// TODO: Add your command handler code here
	CImageProcessingDoc* pDoc=GetDocument();
	if(pDoc->GetHDIB()!=0)
	{
		LONG width,height;
		LONG m,n,i,j;
		unsigned char* pBits;
        
        width=WIDTHBYTES(pDoc->m_sizeDoc.cx*8);
		
		//width=(pDoc->m_sizeDoc.cx*8+31)/32*4;
		height=pDoc->m_sizeDoc.cy;
		
		LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
		
		
	
		
		pBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
		
		//we have width, height, pBits now!
		//1. Jisuan zhi fang tu
		LONG number[256];
		for(i=0;i<256;i++)
			number[i]=0;
		//统计各灰度值的像素数
		for(m=0;m<height;m++)
		{	
			for(n=0;n<width;n++)
				number[*(pBits+m*width+n)]++;
		}
		//1.累积直方图
		LONG sum[256];
		for(i=0;i<256;i++)
			sum[i]=0;
		sum[0]=number[0];
		for(i=1;i<256;i++)
			sum[i]=sum[i-1]+number[i];
		
		//2. Jisuan gai lv 
		double gailv[256];
		double Area=(double)(width*height);
		for(i=0;i<256;i++)
			gailv[i]=(double)sum[i]/Area;
		//3. Ying she biao
		int map[256];
		for(j=0;j<256;j++)
			map[j]=int(gailv[j]*255+0.5);//数字图像需四舍五入
		//4. bian li zheng fu tu xiang
		for(m=0;m<height;m++)
		{	
			for(n=0;n<width;n++)
				*(pBits+m*width+n)=map[*(pBits+m*width+n)];
		}
		
		pDoc->UpdateAllViews(NULL);
		::GlobalUnlock((HGLOBAL)pDoc->GetHDIB());
	}
	
}


void CImageProcessingView::OnMotionblur() 
{
	// TODO: Add your command handler code here
	LONG width,height,LineBytes;
	LONG newWidth,newHeight,newLineBytes;
	LPSTR lpDIB,lpDIBBits,lpNewDIB,lpNewDIBBits;
	LPBITMAPINFOHEADER lpbmi,lpNewbmi;
	
	CImageProcessingDoc *pDoc=GetDocument();
	lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->m_hDIB);
	lpDIBBits=lpDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
	lpbmi=(LPBITMAPINFOHEADER)lpDIB;
	
	width=lpbmi->biWidth;
	LineBytes=(width*8+31)/32*4;
	height=lpbmi->biHeight;
	
	
	double temp;
	LONG i,j;
	for(i=0;;i++)
	{
		temp=pow(2,i);
		if(temp>=width)
		{
			newWidth=(LONG)temp;
			break;
		}
	}
	for(i=0;;i++)
	{
		temp=pow(2,i);
		if(temp>=height)
		{
			newHeight=(LONG)temp;
			break;
		}
	}
	if(newWidth>newHeight)
		newHeight=newWidth;
	else
		newWidth=newHeight;
	
	
	newLineBytes=(newWidth*8+31)/32*4;


	HDIB hDIB=(HDIB)::GlobalAlloc(GHND,newHeight*newLineBytes+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD));
	lpNewDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
	memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+sizeof(RGBQUAD)*256);
	
	lpNewDIBBits=lpNewDIB+*(LPDWORD)lpDIB+256*sizeof(RGBQUAD);
	lpNewbmi=(LPBITMAPINFOHEADER)lpNewDIB;
	lpNewbmi->biWidth=newWidth;
	lpNewbmi->biHeight=newHeight;
	
	
	
	LPSTR lpDst;
	for(i=0;i<newHeight;i++)
		for(j=0;j<newWidth;j++)
		{
			lpDst=lpNewDIBBits+newLineBytes*(newHeight-1-i)+j;
			
			if(i<=height-1&&j<=width-1)
				*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+j);
////////////////////////////////////////////////////////////////////////////////////
//直接补零的效果不是很好,因此这里不采用补零的方法,而是采用补边界的方法
		/*	else 
				*((unsigned char *)lpDst)=0;
		*/
			else if(i>height-1&&j<=width-1)
				*((unsigned char *)lpDst)=*(lpDIBBits+j);
			else if(i<=height-1&&j>width-1)
				*((unsigned char *)lpDst)=*(lpDIBBits+LineBytes*(height-1-i)+width-1);
			else
				*((unsigned char *)lpDst)=*(lpDIBBits+width-1);

			
		}
		::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
		::GlobalFree((HGLOBAL)pDoc->m_hDIB);
		pDoc->m_hDIB=hDIB;
		::GlobalUnlock((HGLOBAL)pDoc->m_hDIB);
		/////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////
		pDoc=GetDocument();


		unsigned char* lpNewBits;
		LPSTR pDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());
				
		lpNewBits=(unsigned char*)pDIB+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);

		
		LONG	w,h;//图象中只有w=2^wp,h=2^hp的部分可以参加傅立叶变换
		int		wp,hp;
		
		w=h=1;
		wp=hp=0;
		
		while(w*2<=newWidth)
		{
			w*=2;
			wp++;
		}
		while(h*2<=newHeight)
		{
			h*=2;
			hp++;
		}
			
		complex<double> *TD = new complex<double>[w * h];
		complex<double> *FD = new complex<double>[w * h];
		
		for(i=0;i<w;i++)
			for(j=0;j<h;j++)
			{
				if((i+j)%2)
					TD[j*w+i]=complex<double>(-*(lpNewBits+j*w+i),0);
				else TD[j*w+i]=complex<double>(*(lpNewBits+j*w+i),0);
			
			}
			for(j=0;j<h;j++)
				FFT(&TD[j*w],&FD[j*w],wp);//yan shuping fangxiang fft
			
			for(i=0;i<w;i++)
			for(j=0;j<h;j++)
					TD[j*w+i]=FD[i*h+j];//zhuan zhi
				
			for(j=0;j<w;j++)
					FFT(&TD[j*h],&FD[j*h],hp);//yan shuping fangxiang fft
				//now, w hang, h lie
			for(i=0;i<h;i++)

⌨️ 快捷键说明

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