灰度图像腐蚀(vc实现)
2012-08-17 11:57
387 查看
void CISLSView::OnErosionGray() { //int structure[3][3]={23,21,10,97,23,98,0,0,123}; //int structure[3][3]={1,1,1,1,1,1,1,1,1}; //int structure[3][3]={255,255,255,255,255,255,255,255,255}; int structure[3][3]={5,225,155,0,255,0,25,25,25}; erosionGray(structure); } void CISLSView::erosionGray(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; } } //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; int src,des; src=des=255; for (int y=1; y<maxY-1; y++) { for (int x=1; x<maxX-1; x++) { for(m=0;m<3;m++) for(n=0;n<3;n++) { src=*(pRealData3+pit3*(y-m+1)+(x+n-1)*bitCount3)-structure[m] ; //src=abs(src); if(src<des) { des=src; } } des=abs(des); *(pRealData2+pit2*(y)+(x)*bitCount2)=des; *(pRealData2+pit2*(y)+(x)*bitCount2+1)=des; *(pRealData2+pit2*(y)+(x)*bitCount2+2)=des; } } Invalidate(); }
void CISLSView::erosionGray(int structure[3][3]) { //程序编制:李立宗 lilizong@gmail.com //2012-8-17 //2012-8-22修改 ,将src=des=255;移动到每个像素循环的内部。 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; } } //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; int src,des; for (int y=1; y<maxY-1; y++) { for (int x=1; x<maxX-1; x++) { src=des=255; for(m=0;m<3;m++) for(n=0;n<3;n++) { src=*(pRealData3+pit3*(y-m+1)+(x+n-1)*bitCount3)-structure[m]; //src=abs(src); if(src<des) { des=src; } } des=abs(des); *(pRealData2+pit2*(y)+(x)*bitCount2)=des; *(pRealData2+pit2*(y)+(x)*bitCount2+1)=des; *(pRealData2+pit2*(y)+(x)*bitCount2+2)=des; } } Invalidate(); }
相关文章推荐
- VC编程实现灰度图像与彩色图像的相互转换
- 二值图像的腐蚀运算及其VC实现
- 图像的分割和灰度处理(VC++实现)
- 灰度图像的膨胀操作(vc实现)
- 形态学中灰度图像腐蚀实现的MATLB代码
- 二值图像的腐蚀运算及其VC实现
- 数字图像处理领域的二十四个典型算法及vc实现、第二章
- 图像灰度化方法总结及其VC实现 .
- JAVA实现彩色图像转黑白(灰度)
- VC++实现Contourlet图像处理
- 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
- 数字图像处理领域的二十四个典型算法及vc实现、第二章
- 图像滤波常见方法原理总结及VC下实现
- C++基于Directx MMX实现的图像灰度转换代码
- 灰度图像之同现矩阵的求解算法与实现
- 数字图像处理领域的二十四个典型算法及vc实现、第二章
- 在VC上实现如何从内存中读取JPEG、GIF等图像
- 图像灰度化方法总结及其VC实现
- Matlab实现灰度图像的水平和垂直投影
- 灰度图像形态学膨胀与腐蚀