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

📄 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 + -