您的位置:首页 > 其它

高斯拉普拉斯锐化(边缘检测)vc实现

2013-04-18 15:49 162 查看
高斯拉普拉斯锐化(边缘检测)vc实现  -LoG锐化,边缘检测。

[cpp]
view plaincopyprint?

void CSDIELSView::OnSharpeningGaussianAndLaplace()  
    {  
//程序编制:李立宗  lilizong@gmail.com  
//2012-8-12   
            if(myImage1.IsNull())  
            OnOpenResourceFile();  
        if(!myImage2.IsNull())  
            myImage2.Destroy();  
        if(myImage2.IsNull()){  
            myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);  
        }  
        //COLORREF pixel;    
        int maxY = myImage1.GetHeight();  
        int maxX=myImage1.GetWidth();  
        byte* pRealData;  
        byte* pRealData2;  
        pRealData=(byte*)myImage1.GetBits();  
        pRealData2=(byte*)myImage2.GetBits();  
        int pit=myImage1.GetPitch();  
        int pit2=myImage2.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 tempR,tempG,tempB;  
        float temp,tempX,tempY;  
  
        //int M[3][3]={{1,2,1},{2,4,2},{1,2,1}};  
        int M[5][5]={{-2,-4,-4,-4,-2},{-4,0,8,0,-4},{-4,8,24,8,-4},{-4,0,8,0,-4},{-2,-4,-4,-4,-2}};  
        int sum=0;  
        for(int i=0;i<3;i++)  
            for(int j=0;j<3;j++)  
                sum=sum+M[i][j];  
        //  tempR=tempG=tempG=0;   
        //说明:将生产的图像作为24位图处理。
  
        for (int y=2; y<maxY-2; y++) {  
            for (int x=2; x<maxX-2; x++) {  
                tempR=  
                    *(pRealData+pit*(y-2)+(x-2)*bitCount)*M[0][0]+*(pRealData+pit*(y-2)+(x-1)*bitCount)*M[0][1]+*(pRealData+pit*(y-2)+(x)*bitCount)*M[0][2]+*(pRealData+pit*(y-2)+(x+1)*bitCount)*M[0][3]+*(pRealData+pit*(y-2)+(x+2)*bitCount)*M[0][4]  
                +   *(pRealData+pit*(y-1)+(x-2)*bitCount)*M[1][0]+*(pRealData+pit*(y-1)+(x-1)*bitCount)*M[1][1]+*(pRealData+pit*(y-1)+(x)*bitCount)*M[1][2]+*(pRealData+pit*(y-1)+(x+1)*bitCount)*M[1][3]+*(pRealData+pit*(y-1)+(x+2)*bitCount)*M[1][4]  
                +   *(pRealData+pit*(y)+(x-2)*bitCount)*M[2][0]+*(pRealData+pit*(y)+(x-1)*bitCount)*M[2][1]+*(pRealData+pit*(y)+(x)*bitCount)*M[2][2]+*(pRealData+pit*(y)+(x+1)*bitCount)*M[2][3]+*(pRealData+pit*(y)+(x+2)*bitCount)*M[2][4]  
                +*(pRealData+pit*(y+1)+(x-2)*bitCount)*M[3][0]+*(pRealData+pit*(y+1)+(x-1)*bitCount)*M[3][1]+*(pRealData+pit*(y+1)+(x)*bitCount)*M[3][2]+*(pRealData+pit*(y+1)+(x+1)*bitCount)*M[3][3]+*(pRealData+pit*(y+1)+(x+2)*bitCount)*M[3][4]      
                +*(pRealData+pit*(y+2)+(x-2)*bitCount)*M[4][0]+*(pRealData+pit*(y+2)+(x-1)*bitCount)*M[4][1]+*(pRealData+pit*(y+2)+(x)*bitCount)*M[4][2]+*(pRealData+pit*(y+2)+(x+1)*bitCount)*M[4][3]+*(pRealData+pit*(y+2)+(x+2)*bitCount)*M[4][4]  
                ;  
                tempR=abs(tempR);  
                if(tempR>255)  
                    tempR=255;  
  
  
                if(bitCount==1)  
                {  
                    tempG=tempR;  
                    tempB=tempR;  
                }  
                else  
                {  
                    tempG=  
                        *(pRealData+pit*(y-2)+(x-2)*bitCount+1)*M[0][0]+*(pRealData+pit*(y-2)+(x-1)*bitCount+1)*M[0][1]+*(pRealData+pit*(y-2)+(x)*bitCount+1)*M[0][2]+*(pRealData+pit*(y-2)+(x+1)*bitCount+1)*M[0][3]+*(pRealData+pit*(y-2)+(x+2)*bitCount+1)*M[0][4]  
                    +   *(pRealData+pit*(y-1)+(x-2)*bitCount+1)*M[1][0]+*(pRealData+pit*(y-1)+(x-1)*bitCount+1)*M[1][1]+*(pRealData+pit*(y-1)+(x)*bitCount+1)*M[1][2]+*(pRealData+pit*(y-1)+(x+1)*bitCount+1)*M[1][3]+*(pRealData+pit*(y-1)+(x+2)*bitCount+1)*M[1][4]  
                    +   *(pRealData+pit*(y)+(x-2)*bitCount+1)*M[2][0]+*(pRealData+pit*(y)+(x-1)*bitCount+1)*M[2][1]+*(pRealData+pit*(y)+(x)*bitCount+1)*M[2][2]+*(pRealData+pit*(y)+(x+1)*bitCount+1)*M[2][3]+*(pRealData+pit*(y)+(x+2)*bitCount+1)*M[2][4]  
                    +*(pRealData+pit*(y+1)+(x-2)*bitCount+1)*M[3][0]+*(pRealData+pit*(y+1)+(x-1)*bitCount+1)*M[3][1]+*(pRealData+pit*(y+1)+(x)*bitCount+1)*M[3][2]+*(pRealData+pit*(y+1)+(x+1)*bitCount+1)*M[3][3]+*(pRealData+pit*(y+1)+(x+2)*bitCount+1)*M[3][4]    
                    +*(pRealData+pit*(y+2)+(x-2)*bitCount+1)*M[4][0]+*(pRealData+pit*(y+2)+(x-1)*bitCount+1)*M[4][1]+*(pRealData+pit*(y+2)+(x)*bitCount+1)*M[4][2]+*(pRealData+pit*(y+2)+(x+1)*bitCount+1)*M[4][3]+*(pRealData+pit*(y+2)+(x+2)*bitCount+1)*M[4][4]  
                    ;  
                    tempG=abs(tempG);  
                    if(tempG>255)  
                        tempG=255;  
  
                    ///   
                    tempB=  
                        *(pRealData+pit*(y-2)+(x-2)*bitCount+2)*M[0]
a86e
[0]+*(pRealData+pit*(y-2)+(x-1)*bitCount+2)*M[0][1]+*(pRealData+pit*(y-2)+(x)*bitCount+2)*M[0][2]+*(pRealData+pit*(y-2)+(x+1)*bitCount+2)*M[0][3]+*(pRealData+pit*(y-2)+(x+2)*bitCount+2)*M[0][4]  
                    +   *(pRealData+pit*(y-1)+(x-2)*bitCount+2)*M[1][0]+*(pRealData+pit*(y-1)+(x-1)*bitCount+2)*M[1][1]+*(pRealData+pit*(y-1)+(x)*bitCount+2)*M[1][2]+*(pRealData+pit*(y-1)+(x+1)*bitCount+2)*M[1][3]+*(pRealData+pit*(y-1)+(x+2)*bitCount+2)*M[1][4]  
                    +   *(pRealData+pit*(y)+(x-2)*bitCount+2)*M[2][0]+*(pRealData+pit*(y)+(x-1)*bitCount+2)*M[2][1]+*(pRealData+pit*(y)+(x)*bitCount+2)*M[2][2]+*(pRealData+pit*(y)+(x+1)*bitCount+2)*M[2][3]+*(pRealData+pit*(y)+(x+2)*bitCount+2)*M[2][4]  
                    +*(pRealData+pit*(y+1)+(x-2)*bitCount+2)*M[3][0]+*(pRealData+pit*(y+1)+(x-1)*bitCount+2)*M[3][1]+*(pRealData+pit*(y+1)+(x)*bitCount+2)*M[3][2]+*(pRealData+pit*(y+1)+(x+1)*bitCount+2)*M[3][3]+*(pRealData+pit*(y+1)+(x+2)*bitCount+2)*M[3][4]    
                    +*(pRealData+pit*(y+2)+(x-2)*bitCount+2)*M[4][0]+*(pRealData+pit*(y+2)+(x-1)*bitCount+2)*M[4][1]+*(pRealData+pit*(y+2)+(x)*bitCount+2)*M[4][2]+*(pRealData+pit*(y+2)+(x+1)*bitCount+2)*M[4][3]+*(pRealData+pit*(y+2)+(x+2)*bitCount+2)*M[4][4]  
                    ;  
                    tempB=abs(tempB);  
                    if(tempB>255)  
                        tempB=255;  
  
                }  
  
                *(pRealData2+pit2*y+x*bitCount2)=tempR;  
                *(pRealData2+pit2*y+x*bitCount2+1)=tempG;  
                *(pRealData2+pit2*y+x*bitCount2+2)=tempB;  
            }  
        }  
        Invalidate();  
    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: