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

📄 dip.cpp

📁 很经典的数字图像处理讲义
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for ( i = 255 ; i > 125 ; i-- )

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

		{    

			t = image[i][j];

			if ( t <= 185 ) image[i][j] = 0;

			else image[i][j] = (t-185)*2.5;

		}

		  

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

		image[i][208]=(image[i][207]+image[i][209])/2;



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

		image[125][j]=(image[124][j]+image[126][j])/2;

	  

	for ( i = 160 ; i > 123 ; i--)

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

			if ( image[i][j]>50 ) image[i][j]+=35;



	for ( i = 254 ; i > 120 ; i-- )

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

		{        

			t = 0;

			for ( i1=-1; i1 <= 1; i1++ )

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

				{

					if ( t == 0 )

					{

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

						t++;

					}

					else

					{      

						i3 = t;

						while ( i3 >= 0 && buf[i3] > image[i+i1][j+i2] )

						{

							buf[i3+1] = buf[i3];

							i3--;

						}     

						buf[i3+1] = image[i+i1][j+i2];

						t++;

					}

				}                               

							   

			temp[i][j] = buf[4];                                                              

		}                             

		   

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

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

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



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

		delete temp[i];

	delete temp;



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMClear()

{

	int i,j,t;



	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 = 0 ; i < bmpInfoHeader.biHeight ; i++ )

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

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



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

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

		{

			t = 9*temp[i][j] - ( temp[i-1][j-1] + temp[i-1][j]

				+ temp[i-1][j+1] + temp[i][j-1] + temp[i][j+1]

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

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

			else if ( t > 255 ) image[i][j] = 255;

			else image[i][j] = t;

	  }



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

		delete temp[i];

	delete temp;



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CM3D_Transfer()

{

	const float pi = 3.1415926;

	int i,j;

	int fai = 30,sita = 30;

	long d = 100000,f = 100000;

	float x0,y0,u,v;

	float s1,s2,c1,c2,sc,cc,ss,cs,a11,a12,a21,a22,det;



	DlgBuf * buffer = new DlgBuf();

	PTSetDialog PSet = new TSetDialog(this,DIPDIALOG,buffer);



	if ( GetApplication()->ExecDialog(PSet) == IDOK )

	{

		d = atol(buffer->s1);

		sita = atoi(buffer->s2);

        fai = atoi(buffer->s3);

    }



	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 ;

		}

	}



	s1 = sin(fai*pi/180);

	s2 = sin(sita*pi/180);

	c1 = cos(fai*pi/180);

	c2 = cos(sita*pi/180);

	sc = s1*c2;

	cc = c1*c2;

	ss = s1*s2;

	cs = c1*s2;



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

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

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



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

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

		{

			x0 = j - bmpInfoHeader.biWidth/2;

			y0 = i - bmpInfoHeader.biHeight/2;

			a22 = f*c1-x0*sc;

			a12 = f*s1+y0*cc;

			a21 = -f*ss+x0*sc;

			a11 = f*cs+y0*cc;

			det = a11*a22-a21*a12;

			u = (a11*x0*d+a12*y0*d)/det;

			v = (a21*x0*d+a22*y0*d)/det;



			if ( u < -bmpInfoHeader.biHeight/2 || u >= 256-bmpInfoHeader.biHeight/2

				|| v < -bmpInfoHeader.biWidth/2 || v >= 256-bmpInfoHeader.biWidth/2 )

				image[i][j] = 0;

			else image[i][j]

				= temp[(int)(v+bmpInfoHeader.biWidth/2)][(int)(u+bmpInfoHeader.biHeight/2)]; 

		}



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

		delete temp[i];

	delete temp;



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMEdge()

{

	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] > 135 ) image[i][j] = 0xff;

			else image[i][j] = 0;



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

		delete temp[i];

	delete temp;



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

	return;

}



void TDipWindow::CMThin()

{

	int i,j,flag,index,min,max;

	int change1,change2,change3,change4;

	unsigned char sum1[512],sum2[512],sum3[512];

	unsigned char total1[512],total2[512],total3[512];



	rd[0] = 0;

	rd[1] = -1;

	rd[2] = -1;

	rd[3] = -1;

	rd[4] = 0;

	rd[5] = 1;

	rd[6] = 1;

	rd[7] = 1;

	rd[8] = 0;



	cd[0] = 1;

	cd[1] = 1;

	cd[2] = 0;

	cd[3] = -1;

	cd[4] = -1;

	cd[5] = -1;

	cd[6] = 0;

	cd[7] = 1;

	cd[8] = 1;



	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 = 0 ; i < bmpInfoHeader.biHeight ; i++ )

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

			if ( image[i][j] > 0x80 ) image[i][j] = 0;

			else image[i][j] = 1;



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

	{

		sum1[j] = 0;

		for ( i = 30 ; i < 94 ; i++ )

		{

			flag = 0;

			flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )

				&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );

			if ( flag && image[i][j] == 1 ) sum1[j]++;

            }

	}



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

	{

		sum2[j] = 0;

		for ( i = 94 ; i < 155 ; i++ )

            {

			flag = 0;

			flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )

				&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );

			if ( flag && image[i][j] == 1 ) sum2[j]++;

            }

	}



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

	{

		sum3[j] = 0;

		for ( i = 155 ; i < 231 ; i++ )

            {

			flag = 0;

			flag = ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 )

				&& ( image[i-1][j-1]+image[i][j-1]+image[i+1][j-1] != 0 );

			if ( flag && image[i][j] == 1 ) sum3[j]++;

            }

	}



	do

	{

		change1 = ThinLeft();

		change2 = ThinRight();

		change3 = ThinTop();

		change4 = ThinBottom();

	} while( change1 || change2 || change3 || change4 );



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

	{

		total1[j] = 0;

		for ( i = 30 ; i < 94 ; i++ )

			if ( image[i][j] == 1 ) total1[j]++;

	}



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

	{

		total2[j] = 0;

		for ( i = 94 ; i < 155 ; i++ )

			if ( image[i][j] == 1 ) total2[j]++;

	}



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

	{

		total3[j] = 0;

		for ( i = 155 ; i < 231 ; i++ )

			if ( image[i][j] == 1 ) total3[j]++;

	}



	for ( j = 40 ; j < 380 ; j++ )

		if ( j % 5 < 3 ) image[30][j] = 1;

	for ( j = 40 ; j < 400 ; j++ )

		if ( j % 5 < 3 ) image[94][j] = 1;

	for ( j = 40 ; j < 472 ; j++ )

		if ( j % 5 < 3 ) image[155][j] = 1;

	for ( j = 40 ; j < 472 ; j++ )

		if ( j % 5 < 3 ) image[231][j] = 1;



	for ( i = 30 ; i < 231 ; i++ )

		if ( i % 5 < 3 ) image[i][40] = 1;

	for ( i = 30 ; i < 94 ; i++ )

		if ( i % 5 < 3 ) image[i][380] = 1;

	for ( i = 94 ; i < 155 ; i++ )

		if ( i % 5 < 3 ) image[i][400] = 1;

	for ( i = 155 ; i < 231 ; i++ )

		if ( i % 5 < 3 ) image[i][472] = 1;



	flag = 0;

	for ( j = 57 ; j < 372 ; j++ )

		if ( flag == 0 )

		{

			if ( sum1[j] < 3 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( sum1[j] > 2 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

                if ( total1[index] < 2 )

					for ( i = 30 ; i < 94 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



	flag = 0;

	for ( j = 57 ; j < 390 ; j++ )

		if ( flag == 0 )

		{

			if ( sum2[j] < 3 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( sum2[j] > 2 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

                		if ( total2[index] < 2 )

					for ( i = 94 ; i < 155 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



	flag = 0;

	for ( j = 57 ; j < 466 ; j++ )

		if ( flag == 0 )

		{

			if ( sum3[j] < 3 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( sum3[j] > 4 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

				if ( total3[index] < 2 )

					for ( i = 155 ; i < 231 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



	flag = 0;

	for ( j = 57 ; j < 372 ; j++ )

		if ( flag == 0 )

		{

			if ( total1[j] < 1 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( total1[j] > 0 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

                	if ( sum1[index] > 4 )

					for ( i = 30 ; i < 94 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



	flag = 0;

	for ( j = 57 ; j < 390 ; j++ )

		if ( flag == 0 )

		{

			if ( total2[j] < 1 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( total2[j] > 0 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

                		if ( sum2[index] > 3 )

					for ( i = 94 ; i < 155 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



	flag = 0;

	for ( j = 57 ; j < 466 ; j++ )

		if ( flag == 0 )

		{

			if ( total3[j] < 1 )

			{

				min = j;

				flag = 1;

			}

		}

		else

		{

			if ( total3[j] > 0 )

			{

				max = j - 1;

				flag = 0;

				index = (min+max)/2;

				if ( sum3[index] > 4 )

					for ( i = 155 ; i < 231 ; i++ )

						if ( i % 5 < 3 ) image[i][index] = 1;

			}

		}



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

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

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

		 else image[i][j] = 0;



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

		delete temp[i];

	delete temp;



	Show();



	SetCursor(hSaveCursor);

	ReleaseCapture();

   	return;

}



TSetDialog::TSetDialog(PTWindowsObject AParent,int ResourceID,

	DlgBuf *buffer):TDialog(AParent,ResourceID)

{

	TransferBuffer = (void *)buffer;

}





int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

	LPSTR lpCmdLine,int nCmdShow)

{

	TDipApp DipApp("Simple Draw Tool",hInstance,

		hPrevInstance,lpCmdLine,nCmdShow);

	DipApp.Run();

	return DipApp.Status;

}

⌨️ 快捷键说明

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