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

📄 dip.cpp

📁 很经典的数字图像处理讲义
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "dip.h"



void TDipApp::InitMainWindow()

{

	MainWindow = new TDipWindow(NULL,"Dip");

}



TDipWindow::TDipWindow(PTWindowsObject pwParent,

	LPSTR lpszTitle):TWindow(pwParent,lpszTitle,NULL)

{

	image = NULL;

	AssignMenu("DIPMENU");

}



TDipWindow::~TDipWindow()

{

	if ( !image )

	{

		for ( int i = 0 ; i < nH ; i++ )

			delete image[i];

		delete image;

    }

}



void TDipWindow::SetupWindow()

{

	TWindow::SetupWindow();

	hHourCursor = LoadCursor(NULL,IDC_WAIT);

}



LPSTR TDipWindow::GetClassName()

{

	return "DipMainWindow";

}



BOOL TDipWindow::CMOpen()

{

	int i;

	OPENFILENAME ofn;

	char szDirName[256];

	char szFile[256], szFileTitle[256];

	UINT  cbString;

	char  chReplace;

	char  szFilter[256];



	GetSystemDirectory(szDirName, sizeof(szDirName));

	szFile[0] = '\0';



    HINSTANCE hinst = GetApplication()->hInstance;

	if ((cbString=LoadString(hinst,IDS_FILTERSTRING,

		szFilter,sizeof(szFilter))) == 0 )

			return FALSE;

	chReplace = szFilter[cbString-1];



	for ( i = 0 ; szFilter[i] != '\0' ; i++ )

		if ( szFilter[i] == chReplace ) szFilter[i] = '\0';



	memset(&ofn,0,sizeof(OPENFILENAME));



	ofn.lStructSize = sizeof(OPENFILENAME);

	ofn.hwndOwner = HWindow;

	ofn.lpstrFilter = szFilter;

	ofn.nFilterIndex = 1;

	ofn.lpstrFile = szFile;

	ofn.nMaxFile = sizeof(szFile);

	ofn.lpstrFileTitle = szFileTitle;

	ofn.nMaxFileTitle = sizeof(szFileTitle);

	ofn.lpstrInitialDir = szDirName;

	ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;



	if ( !GetOpenFileName(&ofn) )

		return  FALSE;



	FILE * fp = fopen(szFile,"rb");

	if ( !fp ) 

	{

		MessageBox(HWindow,"The file is not exist","Receive Message",MB_OK);

		return  FALSE;

	}



	fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);

	fread(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);

	fread(Quad,sizeof(RGBQUAD),256,fp);



	if ( image )

	{

		for ( int i = 0 ; i < nH ; i++ )

			delete image[i];

		delete image;

	}



	nW = bmpInfoHeader.biWidth;

	nH = bmpInfoHeader.biHeight;



	image =(unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];

	if (!image)

	{

		fclose(fp);

		MessageBox(HWindow,"Get A null point","Receive Message",MB_OK);

		return FALSE;

	}

	for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0  ; i-- )

	{

		image[i] = new unsigned char[bmpInfoHeader.biWidth];

		if (!image[i])

		{

			fclose(fp);

			MessageBox(HWindow,"Get a null point","Receive Message",MB_OK);

			return FALSE;

		}



		int count = fread(image[i],1,bmpInfoHeader.biWidth,fp);

		if ( count < bmpInfoHeader.biWidth )

		{

			fclose(fp);

			MessageBox(HWindow,"File read error","Receive Message",MB_OK);

			return FALSE;

		}

	}



	HDC hDC = GetDC( HWindow );



	for ( int row = bmpInfoHeader.biHeight - 1 ; row >= 0  ; row-- )

		for ( int col = bmpInfoHeader.biWidth - 1 ; col >= 0 ; col -- )

		{

			unsigned char gc = image[row][col];

			SetPixel ( hDC,col,row,RGB(gc,gc,gc) );

		}



	ReleaseDC( HWindow, hDC );



	fclose ( fp );

	return TRUE;

}



void  TDipWindow::CMSave()

{

	int i;

	OPENFILENAME ofn;

	char szDirName[256];

	char szFile[256], szFileTitle[256];

	UINT  cbString;

	char  chReplace;

	char  szFilter[256];



	GetSystemDirectory(szDirName, sizeof(szDirName));

	szFile[0] = '\0';



    HINSTANCE hinst = GetApplication()->hInstance;

	if ((cbString=LoadString(hinst,IDS_FILTERSTRING,

		szFilter,sizeof(szFilter))) == 0 )

			return;

	chReplace = szFilter[cbString-1];



	for ( i = 0 ; szFilter[i] != '\0' ; i++ )

		if ( szFilter[i] == chReplace ) szFilter[i] = '\0';



	memset(&ofn,0,sizeof(OPENFILENAME));



	ofn.lStructSize = sizeof(OPENFILENAME);

	ofn.hwndOwner = HWindow;

	ofn.lpstrFilter = szFilter;

	ofn.nFilterIndex = 1;

	ofn.lpstrFile = szFile;

	ofn.nMaxFile = sizeof(szFile);

	ofn.lpstrFileTitle = szFileTitle;

	ofn.nMaxFileTitle = sizeof(szFileTitle);

	ofn.lpstrInitialDir = szDirName;

	ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;



	if ( !GetSaveFileName(&ofn) )

		return;



	FILE * fp = fopen(szFile,"wb");



	fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);

	fwrite(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);

	fwrite(Quad,sizeof(RGBQUAD),256,fp);



	for ( i = nH-1 ; i >= 0 ; i-- )

		fwrite(image[i],1,nW,fp);



    fclose(fp);

}



void TDipWindow::Show()

{

	HDC hDC = GetDC( HWindow );



	SetCapture(HWindow);

	hSaveCursor = SetCursor(hHourCursor);



	for ( int row = bmpInfoHeader.biHeight - 1 ; row >= 0  ; row-- )

		for ( int col = bmpInfoHeader.biWidth - 1 ; col >= 0 ; col -- )

		{

			unsigned char gc = image[row][col];

			SetPixel ( hDC,col,row,RGB(gc,gc,gc) );                 

		}



	SetCursor(hSaveCursor);

	ReleaseCapture();



	ReleaseDC( HWindow, hDC );

}



void TDipWindow::WMSize(RTMessage Msg)

{

	if ( !image ) Show();

}



void TDipWindow::GetNeighbour(int row,int col,unsigned char *p)

{

	int m;

	for ( m = 0; m < 8; m ++ )

		p[m] = image[row+rd[m]][col+cd[m]];

}



int TDipWindow::ThinLeft(void)

{

	 unsigned char p[8];

	 int row, col, B4;



	 for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			temp[row][col] = 0;



	 int change = 0;

	 for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )

		for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )

		{

			if( image[row][col] == 1 )

			{

				GetNeighbour(row,col,p);

				B4 = !p[4] && p[0] && ( p[1] || p[2] || p[6] || p[7] )

					&& ( p[2] || !p[3] ) && ( !p[5] || p[6] );

				if ( B4 ) change = 1;

				else temp[row][col] = 1;

			}

		}



	 for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			image[row][col] = temp[row][col];



	 return change;

}



int TDipWindow::ThinRight(void)

{

	unsigned char p[8];

	int row, col, B0;



	for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			temp[row][col] = 0;



	int change = 0;

	for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )

		 for ( col = bmpInfoHeader.biWidth-1 ; col > 0; col -- )

		 {

			  if( image[row][col] == 1 )

			  {

					GetNeighbour(row, col, p);

					B0 = !p[0] && p[4] && ( p[2] || p[3] || p[5] || p[6] )

						&& ( p[6] || !p[7] ) && ( !p[1] || p[2] );

					if ( B0 ) change = 1;

					else temp[row][col] = 1;

			  }

		 }



	 for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			image[row][col] = temp[row][col];



	return change;

}



int TDipWindow::ThinTop(void)

{

	unsigned char p[8];

	int row, col, B2;



	for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			temp[row][col] = 0;



	int change = 0;

	for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )

		for ( row = 1; row < bmpInfoHeader.biHeight-1 ; row ++ )

		{

			if( image[row][col] == 1 )

			{

				GetNeighbour(row,col,p);

				B2 = !p[2] && p[6] && ( p[0] || p[4] || p[5] || p[7] )

					&& ( p[0] || !p[1] ) && ( !p[3] || p[4] );

				if ( B2 ) change = 1;

				else temp[row][col] = 1;

			}

		}



	for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			image[row][col] = temp[row][col];



	return change;

}



int TDipWindow::ThinBottom(void)

{

	unsigned char p[8];

	int row, col, B6;



	for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			temp[row][col] = 0;



	int change = 0;

	for ( col = 1; col < bmpInfoHeader.biWidth-1 ; col ++ )

		for ( row = bmpInfoHeader.biHeight-1 ; row > 0; row -- )

		{

			if( image[row][col] == 1 )

			{

				GetNeighbour(row, col, p );

				B6 = !p[6] && p[2] && ( p[0] || p[1] || p[3] || p[4] )

					&& ( p[4] || !p[5] ) && ( !p[7] || p[0] );

				if ( B6 ) change = 1;

				else temp[row][col] = 1;

			}

		}



	for ( row = 0 ; row < bmpInfoHeader.biHeight ; row++ )

		for ( col = 0 ; col < bmpInfoHeader.biWidth ; col++ )

			image[row][col] = temp[row][col];



	return change;

}



void TDipWindow::Edge(void)

{

	int i,j,max,t;



	for ( i = 1 ; i < bmpInfoHeader.biHeight-1 ; i++ )

		for ( j = 1 ; j < bmpInfoHeader.biWidth-1 ; j++ )

		{

			max = 0;



			t = abs(image[i-1][j-1]+image[i-1][j]+image[i-1][j+1]

				-image[i+1][j-1]-image[i+1][j]-image[i+1][j+1]);

			if ( t > max ) max = t;



			t = abs(image[i][j-1]+image[i-1][j-1]+image[i-1][j]

				-image[i+1][j]-image[i+1][j+1]-image[i][j+1]);

			if ( t > max ) max = t;



			t = abs(image[i-1][j-1]+image[i][j-1]+image[i+1][j-1]

				-image[i-1][j+1]-image[i][j+1]-image[i+1][j+1]);

			if ( t > max ) max = t;



			t = abs(image[i][j-1]+image[i+1][j-1]+image[i+1][j]

				-image[i-1][j]-image[i-1][j+1]-image[i][j+1]);

			if ( t > max ) max = t;



			temp[i][j] = max;

		}



	for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

	{

		temp[i][0] = 0;

		temp[i][bmpInfoHeader.biWidth-1] = 0;

	}



	for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )

	{

		temp[0][j] = 0;

		temp[bmpInfoHeader.biHeight-1][j] = 0;

	}



	return;

}



void TDipWindow::CMTower()

{

	int i,j;

	unsigned char total[256];



	SetCapture(HWindow);

	hSaveCursor = SetCursor(hHourCursor);



	for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

		for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )

			if ( image[i][j] < 195 && image[i][j] > 170 )

				image[i][j] = 0xff;

			else image[i][j] = 0;



	for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )

	{

		total[j] = 0;

		for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

			if ( image[i][j] == 0xff ) total[j]++;

	}



	for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )

		if ( total[j] < 40 )

			for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

				image[i][j] = 0;



    Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMBridge()

{

	int i,j;



	SetCapture(HWindow);

	hSaveCursor = SetCursor(hHourCursor);



	temp = (unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];

	if (!temp)

	{

		MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);

		SetCursor(hSaveCursor);

		ReleaseCapture();

		return ;

	}



	for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0  ; i-- )

	{

		temp[i] = new unsigned char[bmpInfoHeader.biWidth];

		if (!temp[i])

		{

			MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);

			SetCursor(hSaveCursor);

			ReleaseCapture();

			return ;

		}

	}



    Edge();



	for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

		for ( j = 0 ; j < bmpInfoHeader.biWidth ; j++ )

			if ( temp[i][j] > 45 ) image[i][j] = 0xff;

			else image[i][j] = 0;



	for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

		delete temp[i];

	delete temp;



	for ( i = 0 ; i < bmpInfoHeader.biHeight ; i++ )

		for ( j = 163 ; j < bmpInfoHeader.biWidth ; j++ )

			image[i][j] = 0;



    Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMWord()

{

	int i,j,t;

	int scale1=25,scale2=20,scale;



	SetCapture(HWindow);

	hSaveCursor = SetCursor(hHourCursor);



	 for ( i = 252 ; i > 122 ; i-- )

		 for ( j = 1 ; j < bmpInfoHeader.biWidth - 1 ; j++ )

		 {

			t=image[i][j];



			if ( (j>198) && (j<269) ) scale = scale1;

			else if ( (j>333) && (j<459) ) scale = scale1;

				else scale = scale2;



			if ( (t>75) && (t<155) )

			{

				t = image[2*129-i][j];

				if ( t <= scale ) image[i][j] = 1;

				else  image[i][j] = t - scale;

			}

		 }



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMMark()

{

	int i,j,i1,i2,i3;

	unsigned char t,buf[9];



	SetCapture(HWindow);

	hSaveCursor = SetCursor(hHourCursor);



	temp = (unsigned char huge**) new unsigned char * [bmpInfoHeader.biHeight];

	if (!temp)

	{

		MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);

		SetCursor(hSaveCursor);

		ReleaseCapture();

		return ;

	}



	for ( i = bmpInfoHeader.biHeight - 1 ; i >= 0  ; i-- )

	{

		temp[i] = new unsigned char[bmpInfoHeader.biWidth];

		if (!temp[i])

		{

			MessageBox(HWindow,"Not enough memory","Receive Message",MB_OK);

			SetCursor(hSaveCursor);

			ReleaseCapture();

			return ;

		}

	}



	for ( i = 255 ; i > 125 ; i-- )

		for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )

		{    

			t = image[i][j];

			if ( t < 170 ) image[i][j] = 255;

		}





	for ( i = 255 ; i > 125 ; i-- )

		for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )

		{

			if ( image[i][j] == 255 )

			{

				t = 0;

				i3 = 0;

				for ( i1 = -6 ; i1 < 0 ; i1++ )

					for ( i2 = -5 ; i2 < 1 ; i2++ )

						if ( image[i+i1][j+i2] < 255 )

						{

							t += image[i+i1][j+i2];

							i3++;

						}

				t = t/i3;

				temp[i][j] = t;    

			}

		} 

	  

	for ( i = 255 ; i > 125 ; i--)

		for ( j = 209 ; j < bmpInfoHeader.biWidth ; j++ )

			if ( image[i][j] == 255 )

				image[i][j] = temp[i][j];

		   

⌨️ 快捷键说明

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