二值图像腐蚀(vc实现)

来源:互联网 发布:vscode 开发go 编辑:程序博客网 时间:2024/05/16 01:22

为了处理上的方便,将彩色图像首先进行了灰度化、二值化处理。


void CISLSView::OnErosionBin(){//程序编制:李立宗  lilizong@gmail.com//2012-8-17//图像腐蚀,二值图像腐蚀。//int structure[3][3]={0,1,0,1,1,1,0,1,0};int structure[3][3]={1,1,1,1,1,1,1,1,1};erosionBin(structure);}void CISLSView::erosionBin(int structure[3][3]){if(myImage1.IsNull())OnOpenResourceFile();if(!myImage2.IsNull())myImage2.Destroy();if(myImage2.IsNull()){myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);}if(myImage3.IsNull()){myImage3.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);}//COLORREF pixel; int maxY = myImage1.GetHeight();int maxX=myImage1.GetWidth();byte* pRealData;byte* pRealData2;byte* pRealData3;pRealData=(byte*)myImage1.GetBits();pRealData2=(byte*)myImage2.GetBits();pRealData3=(byte*)myImage3.GetBits();int pit=myImage1.GetPitch();int pit2=myImage2.GetPitch();int pit3=myImage3.GetPitch();//需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现//CString str;//str.Format(TEXT("%d"),pit);//MessageBox(str);//str.Format(TEXT("%d"),pit2);//MessageBox(str);int bitCount=myImage1.GetBPP()/8;int bitCount2=myImage2.GetBPP()/8;int bitCount3=myImage3.GetBPP()/8;int tempR,tempG,tempB;//float temp,tempX,tempY;int temp;float u0,u1;   //均值float w0,w1;   //概率float sum0,sum1;  //像素和int optIndex,optT;   //最优阈值,及其所在像素的值float fVaria,fMaxVaria=0;   //临时方差,最大方差//int pixelR[256],pixelG[256],pixelB[256];int pixel[256]={0};   //不要忘记初始化//灰度化for (int y=0; y<maxY; y++) {for (int x=0; x<maxX; x++) {temp=*(pRealData+pit*(y)+(x)*bitCount);if(bitCount==3){tempR=*(pRealData+pit*(y)+(x)*bitCount);tempG=*(pRealData+pit*(y)+(x)*bitCount+1);tempB=*(pRealData+pit*(y)+(x)*bitCount+2);temp=(int)(tempR*0.49+tempG*0.31+tempB*0.2);//temp=(int)((tempR+tempG+tempB)/3);}*(pRealData3+pit3*(y)+(x)*bitCount3)=temp;*(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;*(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;}}//二值化for (int y=0; y<maxY; y++) {for (int x=0; x<maxX; x++) {temp=*(pRealData3+pit3*(y)+(x)*bitCount3);if(temp>128)temp=255;elsetemp=0;*(pRealData3+pit3*(y)+(x)*bitCount3)=temp;*(pRealData3+pit3*(y)+(x)*bitCount3+1)=temp;*(pRealData3+pit3*(y)+(x)*bitCount3+2)=temp;}}//CString str;//str.Format(TEXT("%d"),Td);//AfxMessageBox(str);//for (int y=0; y<maxY; y++) {for (int x=0; x<maxX; x++) {*(pRealData2+pit2*(y)+(x)*bitCount2)=255;*(pRealData2+pit2*(y)+(x)*bitCount2+1)=255;*(pRealData2+pit2*(y)+(x)*bitCount2+2)=255;}}int m,n;for (int y=1; y<maxY-1; y++) {for (int x=1; x<maxX-1; x++) {temp=*(pRealData3+pit3*(y)+(x)*bitCount3);for(m=0;m<3;m++)for(n=0;n<3;n++){if(structure[m][n]==0)continue;temp=*(pRealData3+pit3*(y-m+1)+(x+n-1)*bitCount3);if(temp==0){*(pRealData2+pit2*(y)+(x)*bitCount2)=0;*(pRealData2+pit2*(y)+(x)*bitCount2+1)=0;*(pRealData2+pit2*(y)+(x)*bitCount2+2)=0;break;}}}}Invalidate();}

原创粉丝点击