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

📄 dibimage.cpp

📁 神经网络代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  if(x+1 <lWidth && gray==0 && lplab[y*lWidth+x+1] == false)

        //进行递归处理  
  DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y,lab,lianXuShu);

        //判断长度

  //如果连续长度满足要求,说明不是离散点,返回
  if(m_lianXuShu>=lianXuShu)
   return TRUE;
  
  //右下
  
  lpSrc=(char*)lpDIBBits + lLineBytes * (y-1) + x+1;

        //传递灰度值
  gray=*lpSrc;

        //如果点在图像内、颜色为黑色并且没有被访问过
  if(y-1 >=0 && x+1 <lWidth && gray == 0 && lplab[(y-1)*lWidth+x+1] == false)

       //进行递归处理  
    DeleteScaterJudge(lpDIBBits,lLineBytes,lplab,lWidth,lHeight,x+1,y-1,lab,lianXuShu);

        //判断长度
  //如果连续长度满足要求,说明不是离散点,返回
  if(m_lianXuShu>=lianXuShu)
   return TRUE;
 }
 

 //如果递归结束,返回false,说明是离散点
 return FALSE;



}

void CDibImage::RemoveScatterNoise(HDIB hDIB)
{
// 指向DIB的指针
	LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	
	// 找到DIB图像象素数据区的起始位置
	lpDIBBits = FindDIBBits(lpDIB);
	
	//获得图像的长度
	LONG lWidth=DIBWidth ((char*)lpDIB);
	
	//获得图像的高度
	LONG lHeight=DIBHeight ((char*)lpDIB);
	
	//设置判定噪声的长度阈值为15
	//即如果与考察点相连接的黑点的数目小于15则认为考察点是噪声点
	int length=15;
	
	// 循环变量
	m_lianXuShu=0;
	LONG	i;
	LONG	j;	
	LONG    k;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	
	LPSTR lpSrc;
	
	//开辟一块用来存放标志的内存数组
	LPBYTE lplab = new BYTE[lHeight * lWidth];
	
	//开辟一块用来保存离散判定结果的内存数组
	bool *lpTemp = new bool[lHeight * lWidth];
	//delete []lplab;
	//初始化标志数组
	for (i=0;i<lHeight*lWidth;i++)
	{
		
		//将所有的标志位设置为非
		lplab[i] = false;
		
	}
	
	//用来存放离散点的坐标的数组
	CPoint lab[21];
	
	//为循环变量赋初始值
	k=0;
	
	//扫描整个图像
	
	//逐行扫描
	for(i =0;i<lHeight;i++)
	{  
		
		//逐行扫描
		for(j=0;j<lWidth;j++)
		{	
			//先把标志位置false
			for(k=0;k<m_lianXuShu;k++)
				lplab[lab[k].y * lWidth + lab[k].x] = false;
			
			//连续数置0
			m_lianXuShu =0;
			
			//进行离散性判断
			lpTemp[i*lWidth+j] = DeleteScaterJudge(lpDIBBits,(WORD)lLineBytes,lplab,lWidth,lHeight,j,i,lab,length);
			
		}
	}
	
	//扫描整个图像,把离散点填充成白色
	
	//逐行扫描
	for(i = 0;i<lHeight;i++)
	{
		
		//逐列扫描
		for(j=0;j<lWidth;j++)
		{       
			//查看标志位,如果为非则将此点设为白点
			if(lpTemp[i*lWidth+j] == false)
			{	
				//指向第i行第j个象素的指针
				lpSrc=(char*)lpDIBBits + lLineBytes * i + j;
				
				//将此象素设为白点
				*lpSrc=BYTE(255);
			}
		}
	}
	
	//解除锁定

	::GlobalUnlock ((HGLOBAL)hDIB);

}

void CDibImage::GradientSharp(HDIB hDIB)
{
// 指向DIB的指针
	LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	
	// 找到DIB图像象素起始位置
	lpDIBBits = FindDIBBits(lpDIB);	
	
	//获取图像的宽度
	LONG lWidth=DIBWidth ((char*)lpDIB);
	
	//获取图像的长度
	LONG lHeight=DIBHeight ((char*)lpDIB);
	
	// 阈值
	BYTE	bThre = 2;
	
	// 调用GradSharp()函数进行梯度板锐化
	
	// 指向源图像的指针
	unsigned char*	lpSrc;
	unsigned char*	lpSrc1;
	unsigned char*	lpSrc2;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	// 中间变量
	BYTE	bTemp;
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	// 每行
	for(i = 0; i < lHeight; i++)
	{
		
		// 每列
		for(j = 0; j < lWidth; j++)
		{
			
			// 指向DIB第i行,第j个象素的指针
			lpSrc  = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			
			// 指向DIB第i+1行,第j个象素的指针
			lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j;
			
			// 指向DIB第i行,第j+1个象素的指针
			lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1;
			
			//计算梯度值
			bTemp = abs((*lpSrc)-(*lpSrc1)) + abs((*lpSrc)-(*lpSrc2));
			
			// 判断是否小于阈值
			if (bTemp < 255)
			{
				// 判断是否大于阈值,对于小于情况,灰度值不变。
				if (bTemp >= bThre)
				{
					// 直接赋值为bTemp
					*lpSrc = bTemp;
				}
			}
			else
			{
				// 直接赋值为255
				*lpSrc = 255;
			}
		}
	}
	
	//最后还要处理一下图像中最下面那行
	for(j = 0; j < lWidth; j++)
	{   
		//指向最下边一行,第j个象素的指针
		lpSrc  = (unsigned char*)lpDIBBits + lLineBytes * 0 + j;
		
		//将此位置的象素设置为255,即白点
		*lpSrc=255;
	}
	
	//解除锁定
	::GlobalUnlock ((HGLOBAL)hDIB);

}

void CDibImage::SlopeAdjust(HDIB hDIB)
{
	// 指向DIB的指针
	LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB);
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;	
	
	// 找到DIB图像象素起始位置
	lpDIBBits = FindDIBBits(lpDIB);
	
	// 指向源图像的指针
	unsigned char*	lpSrc;
	
	// 循环变量
	LONG	i;
	LONG	j;
	
	// 图像每行的字节数
	LONG	lLineBytes;
	
	//图像的长度
	LONG    lWidth;
	
	//图像的宽度
	LONG	lHeight;
	
	//获取图像的长度
	lWidth=DIBWidth ((char*)lpDIB);
	
	//获取图像的宽度
	lHeight=DIBHeight ((char*)lpDIB);
	
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	
	//图像左半边的平均高度
	double leftaver=0.0,
		
		//图像右半边的平均高度
		double rightaver=0.0;
	
	//图像的倾斜度
	double slope;
	
	//统计循环变量
	LONG counts=0;
	
	//扫描左半边的图像,求黑色象素的平均高度
	
	//行
	for (i=0;i<lHeight;i++)
	{   
		
		//列
		for (j=0;j<lWidth/2;j++)
		{
			
			//指向第i行第j个象素的指针	
			lpSrc=(unsigned char*)lpDIBBits + lLineBytes *  i + j;
			
			//如果为黑点
			if (*lpSrc == 0)
			{
				
				//对其高度进行统计叠加
				counts +=lWidth/2 -j;
				leftaver += i*(lWidth/2 -j);
				
			}
			
		}
	}
	
	//计算平均高度
	leftaver /= counts;
	
	//将统计循环变量重新赋值
	counts =0;
	
	//扫描右半边的图像,求黑色象素的平均高度
	
	//行
	for (i =0;i<lHeight;i++)
	{
		
		//列
		for (j=lWidth/2;j<lWidth;j++)
		{
			//指向第i行第j个象素的指针
			lpSrc=(unsigned char*)lpDIBBits + lLineBytes *  i + j;
			
			//如果为黑点
			if (*lpSrc == 0)
			{
				
				//进行统计叠加
				counts +=lWidth -j;
				rightaver += i*(lWidth -j);
			}
		}
	}
	
	//计算右半边的平均高度
	rightaver /= counts;
	
	//计算斜率
	slope = (leftaver - rightaver) / (lWidth/2);
	
	//指向新的图像象素起始位置的指针
	LPSTR lpNewDIBBits;
	
	//指向新图像的指针
	LPSTR lpDst;
	
	//新图像的句柄
	HLOCAL nNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);
	
	//锁定内存
	lpNewDIBBits=(char*)LocalLock(nNewDIBBits);
	
	//指向新图像象素的指针
	lpDst=(char*)lpNewDIBBits;
	
	//为新图像赋初始值
	memset(lpDst,(BYTE)255,lLineBytes*lHeight);
	
	//象素点的灰度值
	int gray;
	
	//位置映射值
	int i_src;
	
	//根据斜率,把当前新图像的点映射到源图像的点
	
	//行
	for (i=0;i<lHeight;i++)
	{
		//列
		for (j=0;j<lWidth;j++)
		{	
			//计算映射位置	
			i_src=int(i - (j-lWidth/2)*slope);
			
			//如果点在图像外,象素置白色
			if (i_src <0 || i_src >=lHeight )
				gray = 255;
			
			else
			{	
				//否则到源图像中找点,取得象素值
				
				//指向第i_src行第j个象素的指针
				lpSrc=(unsigned char *)lpDIBBits + lLineBytes *  i_src + j;
				gray = *lpSrc;
			}
			
			//把新图像的点用得到的象素值填充

			//指向第i行第j个象素的指针
			lpDst = (char *)lpNewDIBBits + lLineBytes * i + j;
			*lpDst=gray;
		}
	}
	
	// 将新的图像的内容拷贝到旧的图像中
	memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight);
	
	// 解除锁定
	::GlobalUnlock ((HGLOBAL)hDIB);


}



⌨️ 快捷键说明

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