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

本文介绍了一种基于高斯拉普拉斯(LoG)的图像锐化方法,通过5x5核矩阵进行边缘检测,适用于24位图像处理。代码详细展示了如何通过C++实现LoG锐化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高斯拉普拉斯锐化(边缘检测)vc实现  -LoG锐化,边缘检测。



  1. void CSDIELSView::OnSharpeningGaussianAndLaplace()  
  2.     {  
  3. //程序编制:李立宗  lilizong@gmail.com  
  4. //2012-8-12   
  5.             if(myImage1.IsNull())  
  6.             OnOpenResourceFile();  
  7.         if(!myImage2.IsNull())  
  8.             myImage2.Destroy();  
  9.         if(myImage2.IsNull()){  
  10.             myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);  
  11.         }  
  12.         //COLORREF pixel;    
  13.         int maxY = myImage1.GetHeight();  
  14.         int maxX=myImage1.GetWidth();  
  15.         byte* pRealData;  
  16.         byte* pRealData2;  
  17.         pRealData=(byte*)myImage1.GetBits();  
  18.         pRealData2=(byte*)myImage2.GetBits();  
  19.         int pit=myImage1.GetPitch();  
  20.         int pit2=myImage2.GetPitch();  
  21.         //需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现  
  22.         //CString str;   
  23.         //str.Format(TEXT("%d"),pit);  
  24.         //MessageBox(str);   
  25.         //str.Format(TEXT("%d"),pit2);  
  26.         //MessageBox(str);   
  27.         int bitCount=myImage1.GetBPP()/8;  
  28.         int bitCount2=myImage2.GetBPP()/8;  
  29.         int tempR,tempG,tempB;  
  30.         float temp,tempX,tempY;  
  31.   
  32.         //int M[3][3]={{1,2,1},{2,4,2},{1,2,1}};  
  33.         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}};  
  34.         int sum=0;  
  35.         for(int i=0;i<3;i++)  
  36.             for(int j=0;j<3;j++)  
  37.                 sum=sum+M[i][j];  
  38.         //  tempR=tempG=tempG=0;   
  39.         //说明:将生产的图像作为24位图处理。   
  40.         for (int y=2; y<maxY-2; y++) {  
  41.             for (int x=2; x<maxX-2; x++) {  
  42.                 tempR=  
  43.                     *(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]  
  44.                 +   *(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]  
  45.                 +   *(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]  
  46.                 +*(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]      
  47.                 +*(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]  
  48.                 ;  
  49.                 tempR=abs(tempR);  
  50.                 if(tempR>255)  
  51.                     tempR=255;  
  52.   
  53.   
  54.                 if(bitCount==1)  
  55.                 {  
  56.                     tempG=tempR;  
  57.                     tempB=tempR;  
  58.                 }  
  59.                 else  
  60.                 {  
  61.                     tempG=  
  62.                         *(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]  
  63.                     +   *(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]  
  64.                     +   *(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]  
  65.                     +*(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]    
  66.                     +*(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]  
  67.                     ;  
  68.                     tempG=abs(tempG);  
  69.                     if(tempG>255)  
  70.                         tempG=255;  
  71.   
  72.                     ///   
  73.                     tempB=  
  74.                         *(pRealData+pit*(y-2)+(x-2)*bitCount+2)*M[0][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]  
  75.                     +   *(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]  
  76.                     +   *(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]  
  77.                     +*(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]    
  78.                     +*(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]  
  79.                     ;  
  80.                     tempB=abs(tempB);  
  81.                     if(tempB>255)  
  82.                         tempB=255;  
  83.   
  84.                 }  
  85.   
  86.                 *(pRealData2+pit2*y+x*bitCount2)=tempR;  
  87.                 *(pRealData2+pit2*y+x*bitCount2+1)=tempG;  
  88.                 *(pRealData2+pit2*y+x*bitCount2+2)=tempB;  
  89.             }  
  90.         }  
  91.         Invalidate();  
  92.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值