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

📄 windipdoc.cpp

📁 System will automatically delete the directory of debug and release, so please
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			
            RobertMaskOperation( x, y, m_InputImg, iSize, robMask1, &pixel1 );
			RobertMaskOperation( x, y, m_InputImg, iSize, robMask2, &pixel2 );

			address = BmpAddress( x, y, iSize );

			*( m_OutputImg + address     ) = (BYTE)((pixel1.b + pixel2.b) * scale);
			*( m_OutputImg + address + 1 ) = (BYTE)((pixel1.g + pixel2.g) * scale);
			*( m_OutputImg + address + 2 ) = (BYTE)((pixel1.r + pixel2.r) * scale);
		}
	}
	
	UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}

void CWinDIPDoc::RobertMasking(int robMask[][2], int mask)
{
	if( mask == 1 ){
		robMask[0][0] = -1, robMask[0][1] = 0,
		robMask[1][0] = 0,  robMask[1][1] = 1;
	}	
	else{
		robMask[0][0] = 0,  robMask[0][1] = -1,
		robMask[1][0] = 1,  robMask[1][1] = 0;
	}
}

void CWinDIPDoc::RobertMaskOperation(int x, int y, BYTE *input, CSize iSize, int robMask[][2], IntRGB *pixel)
{
	int wx, wy, address, bgrSum[3] = {0, 0, 0};
	int b, g, r, maskX = 0, maskY = 0;

	for( wy = 0; wy <= 1; wy++ )
	{
		maskX = 0;
		for( wx = 0; wx <= 1; wx++ )
		{
            address = BmpAddress( x+wx, y+wy, iSize );

			b =	*( input + address     );
			g =	*( input + address + 1 );
			r =	*( input + address + 2 );
		
			bgrSum[0] += robMask[maskX][maskY] * b;
			bgrSum[1] += robMask[maskX][maskY] * g;
			bgrSum[2] += robMask[maskX][maskY] * r;

			maskX++;
		}
		maskY++;
	}
	
	pixel->b = abs(bgrSum[0]);
	pixel->g = abs(bgrSum[1]);
	pixel->r = abs(bgrSum[2]);
}

void CWinDIPDoc::C3_7_3Sobel()
{
	CSize iSize;
	iSize.cx = width;
	iSize.cy = height;
	
	int x, y, address;
	IntRGB pixel1 = {0, 0, 0}, pixel2 = {0, 0, 0};
	int sobelMask1[3][3], sobelMask2[3][3];

	SobelMasking( sobelMask1,  1 );
	SobelMasking( sobelMask2,  2 );

	for( y = 1; y < iSize.cy - 1; y++ ){
		for( x = 1; x < iSize.cx - 1; x++ ){
			
            SobelMaskOperation( x, y, m_InputImg, iSize, sobelMask1, &pixel1 );
			SobelMaskOperation( x, y, m_InputImg, iSize, sobelMask2, &pixel2 );

			address = BmpAddress( x, y, iSize );

			*( m_OutputImg + address     ) = (BYTE)((pixel1.b + pixel2.b) );
			*( m_OutputImg + address + 1 ) = (BYTE)((pixel1.g + pixel2.g) );
			*( m_OutputImg + address + 2 ) = (BYTE)((pixel1.r + pixel2.r) );
		}
	}
	
	UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}

void CWinDIPDoc::SobelMasking(int sobelMask[][3], int mask)
{
	
}

void CWinDIPDoc::SobelMaskOperation(int x, int y, BYTE *input, CSize iSize, int sobelMask[][3], IntRGB *pixel)
{
	int wx, wy, address, bgrSum[3] = {0, 0, 0};
	int b, g, r, maskX = 0, maskY = 0;


}

void CWinDIPDoc::C2_MOUSE(CPoint m_pt1, CPoint m_pt2)
{
	int x, y, b, g, r;
	int address;
	CSize iSize;
	iSize.cx = width;
	iSize.cy = height;
	
	for( y = m_pt1.y; y < m_pt2.y; y++ )
	{
		for( x = m_pt1.x; x < m_pt2.x; x++ )
		{
			address = BmpAddress( x, y, iSize );

			b = *( m_InputImg + address     );
			g = *( m_InputImg + address + 1 );
			r = *( m_InputImg + address + 2 );

			*( m_OutputImg + address     ) = b;
			*( m_OutputImg + address + 1 ) = g;
			*( m_OutputImg + address + 2 ) = r;
		}
	}
	UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.

}

void CWinDIPDoc::Labeling()
{
	int x, y, num, left, top, k;
	//int *rt;
	//int *area;
	int address, b, g, r, intensity, i;
	int j = 0;
	CSize iSize;
	iSize.cx = width;
	iSize.cy = height;
//	BYTE pixelColor[2][2][3];
	int **Label;
	
//	rt = (new int)[width * height];
//	area = (new int)[width * height];
	
	for(y = 0; y < iSize.cy; y++) //硅版 备埃 : -1, 拱眉 : 0栏肺 檬扁拳 threshold
	{
		for(x = 0; x <iSize.cx; x++)
		{
			address = BmpAddress( x, y, iSize );
			
			b = *( m_InputImg + address     );
			g = *( m_InputImg + address + 1 );
			r = *( m_InputImg + address + 2 );
			
			intensity = (int)(b + g + r) / 3;
			if(intensity >= 128)
				Label[y][x] = 0;	
			else Label[y][x] = -1;
		}
	}
	
	for(x = 0; x < width; x++) //康惑狼 版拌急 拱眉 康开 力芭
	{
		Label[0][x] = -1;
		Label[height-1][x] = -1;
	}
	
	for(y = 0; y < height; y++) //饭骇 康惑 檬扁拳
	{
		Label[y][0] = -1;
		Label[y][width-1] = -1;
	}
	
	num = -1;
	
	for(y = 0; y < height; y++) {
		for(x = 0; x < width; x++) {
			if(y > 0 && x > 0) {
				if(Label[y][x] >= 0) {
					left = Label[y][x-1];
					top = Label[y-1][x];
					if(left == -1 && top != -1) {
						Label[y][x] = top;
					}
					else if(left != -1 && top == -1) {
						Label[y][x] = left;
					}
					else if(left == -1 && top == -1) {
						num++;
						Label[y][x] = num;
					}
					else if(left != -1 && top != -1){
						if(left == top) {
							Label[y][x] = left;
						}
						else if(left > top) {
							Label[y][x] = top;
							left= top;
						}
						else {
							Label[y][x] = left;
							top = left;
						}
					}
				}
			}
		}
	}
	/*
	for(k = 0; k <= num; k++) {
		if(k != rt[k]) rt[k] = rt[rt[k]];
		area[k] = 0;
	}
	
	for(y = 0; y < height; y++)
		for(x = 0; x < width; x++) {
			if(Label[y][x] > -1) {
				Label[y][x] = rt[Label[y][x]];
				area[Label[y][x]]++;
			}
		}
		
		int cnt = 0;
		for (k = 0; k <= num; k++) {
			if(area[k] > 4) rt[k] = cnt++;
			else rt[k] = -1;
		}
		
		for(y = 0; y < height; y++)
			for(x = 0; x < width; x++) {
				if(Label[y][x] >= 0)
					Label[y][x] = rt[Label[y][x]];
			}
			
			delete [] r;
			delete [] area;
			*/
			for( y = 0; y < height; y++ )
			{
				for( x = 0; x < width; x++ )
				{
					address = BmpAddress( x, y, iSize );

					//b = *( m_InputImg + address     );
					//g = *( m_InputImg + address + 1 );
					//r = *( m_InputImg + address + 2 );

					if(Label[y][x] >= 0)
					{
						if(Label[y][x] == j)
						{
						*( m_OutputImg + address     ) = j * 10 + 10;
						*( m_OutputImg + address + 1 ) = j * 10 + 10;
						*( m_OutputImg + address + 2 ) = j * 10 + 10;
						j++;
						}
						else
							j++;
					}
					else
					{					
						*( m_OutputImg + address     ) = 0;
						*( m_OutputImg + address + 1 ) = 0;
						*( m_OutputImg + address + 2 ) = 0;
					}
				}
			}
			UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}

void CWinDIPDoc::C3_7_2Highboost(double mask)
{
	CSize iSize;
	iSize.cx = width;
	iSize.cy = height;
	double HighMask[3][3];

	HighboostMasking( HighMask,  mask );
	HighboostFilteringOperation( m_InputImg, m_OutputImg, HighMask, mask, iSize );
	
	UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}

void CWinDIPDoc::HighboostMasking(double HighMask[][3], double mask)
{
	int x, y;

	for( y = 0; y < 3; y++ )
	{
		for( x = 0; x < 3; x++ )
		{
			if(x == 1 && y == 1)
				HighMask[x][y] = mask + 8;
			else
				HighMask[x][y] = -1;
		}
	}
}

void CWinDIPDoc::HighboostFilteringOperation(BYTE *input, BYTE *output, double HighMask[][3], double mask, CSize iSize)
{
	int x, y, wHalfSize, address;
	ColorRGB pixel;

	for( y = 1; y < iSize.cy - 1; y++ )
	{
		for( x = 1; x < iSize.cx - 1; x++ )
		{
			HighboostMaskOperation(x, y, input, iSize, HighMask, mask,	&pixel);

			address = BmpAddress( x, y , iSize );

			*( output + address     ) = pixel.b;
			*( output + address + 1 ) = pixel.g;
			*( output + address + 2 ) = pixel.r;
		}
	}
}

void CWinDIPDoc::HighboostMaskOperation(int x, int y, BYTE *input, CSize iSize, double HighMask[][3], double mask, ColorRGB *pixel)
{
	int wx, wy, address;
	double bgrSum[3] = {0, 0, 0};
	int b, g, r, maskX = 0, maskY = 0, wHalfSize;
	int scale = 3;

	wHalfSize = 1;

	for( wy = -wHalfSize; wy <= wHalfSize; wy++ ) //付农救俊 -1何磐 1鳖瘤 付胶农狼 农扁父怒
	{
		maskX = 0;
		for( wx = -wHalfSize; wx <= wHalfSize; wx++ )
		{
            address = BmpAddress( x+wx, y+wy, iSize );

			b =	*( input + address     );
			g =	*( input + address + 1 );
			r =	*( input + address + 2 );
		
			bgrSum[0] += HighMask[maskX][maskY] * b;
			bgrSum[1] += HighMask[maskX][maskY] * g;
			bgrSum[2] += HighMask[maskX][maskY] * r;

			maskX++;
		}
		maskY++;
	}
	if(bgrSum[0] > 255)
		bgrSum[0] = 255;
	
	if(bgrSum[1] > 255)
		bgrSum[1] = 255;

	if(bgrSum[2] > 255)
		bgrSum[2] = 255;

	if(bgrSum[0] < 0)
		bgrSum[0] = 0;

	if(bgrSum[1] < 0)
		bgrSum[1] = 0;

	if(bgrSum[2] < 0)
		bgrSum[2] = 0;

	pixel->b = bgrSum[0];
	pixel->g = bgrSum[1];
	pixel->r = bgrSum[2];

}

void CWinDIPDoc::C3_3_4HistogramStatistics()
{
	CSize iSize;
	iSize.cx = width;
	iSize.cy = height;
	int HistoMask[3][3];
	
	HistogramOperating(m_InputImg, m_OutputImg, HistoMask, iSize);
	
	UpdateAllViews(FALSE); //拳搁免仿狼 盎脚.
}

//DEL void CWinDIPDoc::HistogramFrequencyCounting(m_InputImg, numPixel, iSize)
//DEL {
//DEL 	int wx, wy, b, g, r, gray;
//DEL 	int	address;  	
//DEL 	 
//DEL 	for( gray = 0; gray < 256; gray++ )
//DEL 	{
//DEL 		numPixel[gray].b = 0;
//DEL 		numPixel[gray].g = 0;
//DEL 		numPixel[gray].r = 0;
//DEL 	}		
//DEL 	 
//DEL 	for( wy = x -1; y < iSize.cy; y++ )
//DEL 	{
//DEL 		for( wx = 0; x < iSize.cx; x++ )
//DEL 		{
//DEL 			address = BmpAddress( x, y, iSize );
//DEL 			
//DEL 			b = *( input + address     );	
//DEL 			g = *( input + address + 1 );
//DEL 			r = *( input + address + 2 );
//DEL 			
//DEL 			numPixel[b].b += 1;
//DEL 			numPixel[g].g += 1;
//DEL 			numPixel[r].r += 1;
//DEL 		}
//DEL 	}  
//DEL }

void CWinDIPDoc::HistogramOperating(BYTE *input, BYTE *output, int HistoMask[][3], CSize iSize)
{
	int x, y, address, b, g, r;
	int Lmean, Lvariance, Gmean, Gvariance;
	double k0, k1, k2, E;
	E = 4.0;
	k0 = 0.4;
	k1 = 0.02;
	k2 = 0.4;

	for( y = 1; y < iSize.cy - 1; y++ )
	{
		for( x = 1; x < iSize.cx - 1; x++ )
		{
			Lmean = LocalMeanOperation(x, y, input, HistoMask, iSize);
			Lvariance = LocalVarianceOperation(x, y, input, HistoMask, iSize);
			Gmean = GlobalMeanOperation(x, y, input, HistoMask, iSize);
			Gvariance = GlobalVarianceOperation(x, y, input, HistoMask, iSize);
			//HistogramFrequencyCounting(x, y, input, HistoMask, iSize, &pixel);
			
			if((Lmean <= (k0 * Gmean)) && ((k1 * Gvariance) <= Lvariance) && ((k2 * Gvariance) >= Lvariance))
			{
				address = BmpAddress( x, y , iSize );
			
				b =	*( input + address     );
				g =	*( input + address + 1 );
				r =	*( input + address + 2 );

				*( output + address     ) = b * E;
				*( output + address + 1 ) = g * E;
				*( output + address + 2 ) = r * E;
			}
			else
			{
				address = BmpAddress( x, y , iSize );
			
				b =	*( input + address     );
				g =	*( input + address + 1 );
				r =	*( input + address + 2 );

				*( output + address     ) = b;
				*( output + address + 1 ) = g;
				*( output + address + 2 ) = r;
			}
		}
	}
}
int CWinDIPDoc::LocalMeanOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
	int wx, wy, b, g, r, count = 0;
	int address;
	for(wy = y-1; wy <= y+1; wy++)
	{
		for(wx = x-1; wx <= x+1; wx++)
		{
			address = BmpAddress( wx, wy, iSize );

			b = *( input + address     );	
 			g = *( input + address + 1 );
			r = *( input + address + 2 );

			count += b;
		}
	}
	return (count/9);
}


int CWinDIPDoc::LocalVarianceOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
	int wx, wy, b, g, r, count = 0, count1 = 0, variance;
	int address;
	for(wy = y-1; wy <= y+1; wy++)
	{
		for(wx = x-1; wx <= x+1; wx++)
		{
			address = BmpAddress( wx, wy, iSize );

			b = *( input + address     );	
 			g = *( input + address + 1 );
			r = *( input + address + 2 );

			count1 += b * b;
			count += b;
		}
	}
	variance = (count1 / 9) - ((count / 9) * (count / 9));
	return variance;
}

int CWinDIPDoc::GlobalMeanOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{	
	int wx, wy, b, g, r, count = 0;
	int address;
	int total;
	total = iSize.cy * iSize.cy;
	for(wy = 0; wy < iSize.cy; wy++)
	{
		for(wx = 0; wx < iSize.cx; wx++)
		{
			address = BmpAddress( wx, wy, iSize );

			b = *( input + address     );	
 			g = *( input + address + 1 );
			r = *( input + address + 2 );

			count += b;
		}
	}
	return (count/total);
}

int CWinDIPDoc::GlobalVarianceOperation(int x, int y, BYTE *input, int HistoMask[][3], CSize iSize)
{
	int wx, wy, b, g, r, count = 0, count1 = 0, variance;
	int address;
	int total;
	total = iSize.cy * iSize.cy;
	for(wy = 0; wy < iSize.cy; wy++)
	{
		for(wx = 0; wx < iSize.cx; wx++)
		{
			address = BmpAddress( wx, wy, iSize );

			b = *( input + address     );	
 			g = *( input + address + 1 );
			r = *( input + address + 2 );

			count1 += b * b;
			count += b;
		}
	}
	variance = (count1 / total) - ((count / total) * (count / total));
	return variance;
}

⌨️ 快捷键说明

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