现在的位置: 首页 > 综合 > 正文

灰度形态学梯度(vc实现)

2013年04月24日 ⁄ 综合 ⁄ 共 5156字 ⁄ 字号 评论关闭

	void CISLSView::OnGradientA()
	{
		//灰度形态学梯度
		//李立宗  lilizong@gmail.com
		//2012-8-23
		int structure[3][3]={5,25,15,0,25,0,25,25,25};
		CImage myImage1Copy,erosionImage,dilationImage;
		dilationGray(structure);
		imageCopy(dilationImage,myImage2);
		imageCopy(myImage1Copy,myImage1);
		imageCopy(myImage1,myImage2);
		erosionGray(structure);
		imageCopy(erosionImage,myImage2);
		int maxX=myImage1.GetWidth();
		int maxY=myImage1.GetHeight();
		byte* pRealDataDilation;
		byte* pRealDataErosion;
		byte* pRealData2;
		pRealDataDilation=(byte*)dilationImage.GetBits();
		pRealDataErosion=(byte*)erosionImage.GetBits();
		pRealData2=(byte*)myImage2.GetBits();
		int pitDilation=dilationImage.GetPitch();
		int pitErosion=erosionImage.GetPitch();
		int pit2=myImage2.GetPitch();
		int bitCountDilation=dilationImage.GetBPP()/8;
		int bitCountErosion=erosionImage.GetBPP()/8;
		int bitCount2=myImage2.GetBPP()/8;
		int erosionValue,dilationValue;
		int temp;
		for (int y=0; y<maxY; y++) {
			for (int x=0; x<maxX; x++) {
				erosionValue=*(pRealDataDilation+pitDilation*(y)+(x)*bitCountDilation);
				dilationValue=*(pRealDataErosion+pitErosion*(y)+(x)*bitCountErosion);
				temp=dilationValue-erosionValue;
				//if(temp<0)
				//	temp=0;
				//temp=abs(temp);
				*(pRealData2+pit2*(y)+(x)*bitCount2)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

			}
		}
		imageCopy(myImage1,myImage1Copy);
		Invalidate();
	}


	void CISLSView::OnGradientB()
	{
		//灰度形态学梯度
		//李立宗  lilizong@gmail.com
		//2012-8-23
		int structure[3][3]={5,25,15,0,25,0,25,25,25};
		CImage myImage1Copy,erosionImage,dilationImage;
		dilationGray(structure);
		imageCopy(dilationImage,myImage2);
		imageCopy(myImage1Copy,myImage1);
		imageCopy(myImage1,myImage2);
		erosionGray(structure);
		imageCopy(erosionImage,myImage2);
		int maxX=myImage1.GetWidth();
		int maxY=myImage1.GetHeight();
		byte* pRealDataDilation;
		byte* pRealDataErosion;
		byte* pRealData2;
		pRealDataDilation=(byte*)dilationImage.GetBits();
		pRealDataErosion=(byte*)erosionImage.GetBits();
		pRealData2=(byte*)myImage2.GetBits();
		int pitDilation=dilationImage.GetPitch();
		int pitErosion=erosionImage.GetPitch();
		int pit2=myImage2.GetPitch();
		int bitCountDilation=dilationImage.GetBPP()/8;
		int bitCountErosion=erosionImage.GetBPP()/8;
		int bitCount2=myImage2.GetBPP()/8;
		int erosionValue,dilationValue;
		int temp;
		for (int y=0; y<maxY; y++) {
			for (int x=0; x<maxX; x++) {
				erosionValue=*(pRealDataDilation+pitDilation*(y)+(x)*bitCountDilation);
				dilationValue=*(pRealDataErosion+pitErosion*(y)+(x)*bitCountErosion);
				temp=dilationValue-erosionValue;
				//if(temp<0)
				//	temp=0;
				temp=abs(temp);
				*(pRealData2+pit2*(y)+(x)*bitCount2)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

			}
		}
		imageCopy(myImage1,myImage1Copy);
		Invalidate();
	}



	void CISLSView::OnGradientC()
	{
		//灰度形态学梯度
		//李立宗  lilizong@gmail.com
		//2012-8-23
		int structure[3][3]={5,25,15,0,25,0,25,25,25};
		CImage myImage1Copy,erosionImage,dilationImage;
		erosionGray(structure);
		imageCopy(erosionImage,myImage2);
		imageCopy(myImage1Copy,myImage1);
		imageCopy(myImage1,myImage2);
		dilationGray(structure);
		imageCopy(dilationImage,myImage2);
		int maxX=myImage1.GetWidth();
		int maxY=myImage1.GetHeight();
		byte* pRealDataDilation;
		byte* pRealDataErosion;
		byte* pRealData2;
		pRealDataDilation=(byte*)dilationImage.GetBits();
		pRealDataErosion=(byte*)erosionImage.GetBits();
		pRealData2=(byte*)myImage2.GetBits();
		int pitDilation=dilationImage.GetPitch();
		int pitErosion=erosionImage.GetPitch();
		int pit2=myImage2.GetPitch();
		int bitCountDilation=dilationImage.GetBPP()/8;
		int bitCountErosion=erosionImage.GetBPP()/8;
		int bitCount2=myImage2.GetBPP()/8;
		int erosionValue,dilationValue;
		int temp;
		for (int y=0; y<maxY; y++) {
			for (int x=0; x<maxX; x++) {
				erosionValue=*(pRealDataDilation+pitDilation*(y)+(x)*bitCountDilation);
				dilationValue=*(pRealDataErosion+pitErosion*(y)+(x)*bitCountErosion);
				temp=dilationValue-erosionValue;
				//if(temp<0)
				//	temp=0;
				//temp=abs(temp);
				*(pRealData2+pit2*(y)+(x)*bitCount2)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

			}
		}
		imageCopy(myImage1,myImage1Copy);
		Invalidate();
	}


	void CISLSView::OnGradientD()
	{
		//灰度形态学梯度
		//李立宗  lilizong@gmail.com
		//2012-8-23
		int structure[3][3]={5,25,15,0,25,0,25,25,25};
		CImage myImage1Copy,erosionImage,dilationImage;
		erosionGray(structure);
		imageCopy(erosionImage,myImage2);
		imageCopy(myImage1Copy,myImage1);
		imageCopy(myImage1,myImage2);
		dilationGray(structure);
		imageCopy(dilationImage,myImage2);
		int maxX=myImage1.GetWidth();
		int maxY=myImage1.GetHeight();
		byte* pRealDataDilation;
		byte* pRealDataErosion;
		byte* pRealData2;
		pRealDataDilation=(byte*)dilationImage.GetBits();
		pRealDataErosion=(byte*)erosionImage.GetBits();
		pRealData2=(byte*)myImage2.GetBits();
		int pitDilation=dilationImage.GetPitch();
		int pitErosion=erosionImage.GetPitch();
		int pit2=myImage2.GetPitch();
		int bitCountDilation=dilationImage.GetBPP()/8;
		int bitCountErosion=erosionImage.GetBPP()/8;
		int bitCount2=myImage2.GetBPP()/8;
		int erosionValue,dilationValue;
		int temp;
		for (int y=0; y<maxY; y++) {
			for (int x=0; x<maxX; x++) {
				erosionValue=*(pRealDataDilation+pitDilation*(y)+(x)*bitCountDilation);
				dilationValue=*(pRealDataErosion+pitErosion*(y)+(x)*bitCountErosion);
				temp=dilationValue-erosionValue;
				//if(temp<0)
				//	temp=0;
				temp=abs(temp);
				*(pRealData2+pit2*(y)+(x)*bitCount2)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+1)=temp;
				*(pRealData2+pit2*(y)+(x)*bitCount2+2)=temp;

			}
		}
		imageCopy(myImage1,myImage1Copy);
		Invalidate();
	}

抱歉!评论已关闭.