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

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