高斯拉普拉斯锐化(边缘检测)vc实现 -LoG锐化,边缘检测。
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][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();
}
更多详细信息请查看
java教程网 http://www.itchm.com/forum-59-1.html
分享到:
相关推荐
总之,拉普拉斯锐化是数字图像处理中一种基本的边缘检测技术,通过在Visual C++中实现这一算法,我们可以对图像进行边缘检测,从而提取出图像的重要结构信息。理解并掌握这一技术对于深入学习图像处理和计算机视觉至...
拉普拉斯算子是一种二阶导数算子,它通过计算图像像素的邻域内灰度值的变化率来检测边缘。在二维图像中,拉普拉斯算子通常表示为一个3x3的掩模,其元素如下: ``` 0 1 0 1 -4 1 0 1 0 ``` 拉普拉斯算子对每个像素...
通过实际操作和实践,你将能够熟练地在VC中实现图像的锐化和边缘检测,为后续更复杂的图像处理任务打下坚实的基础。 总的来说,图像处理中的锐化和边缘检测是基础但至关重要的技术,它们在很多领域都有着广泛的应用...
这些代码可能涵盖了如何应用上述算子进行图像处理,包括读取图像、应用滤波器、检测边缘以及显示结果等步骤。通过这些代码,您可以理解算法的工作流程,同时也能动手实践,加深理解。 锐化和边缘检测在许多领域都有...
在图像处理领域,VC(Visual C++)是一种常用的编程环境,可以用来实现各种图像操作,如图像平滑、边缘检测、边缘增强、锐化、腐蚀和开运算等。这些技术在计算机视觉、图像分析和模式识别中都有着广泛的应用。下面...
例如,可以使用`GaussianBlur`函数实现高斯滤波,使用`Laplacian`函数进行拉普拉斯锐化,或者使用`Sobel`函数实现索贝尔算子。 在项目中,源代码可能会包含以下几个关键部分: 1. 图像读取:使用OpenCV的`imread`...
拉普拉斯锐化(边缘检测).rar 方块编码.rar 梯度锐化.rar 灰度均衡.rar 用Canny算子提取边缘.rar 直方图均衡.rar 离散余弦变换.rar 维纳滤波处理.rar 逆滤波处理.rar 阈值变换.rar 高斯平滑.rar
拉普拉斯锐化是利用拉普拉斯算子进行图像增强的一种技术。拉普拉斯算子是对图像进行二阶导数运算,能有效地检测图像的边缘和细节,通过对其结果进行适当阈值处理,可以达到锐化图像的效果。 最后,亮度增减是直接...
例如,可以使用高斯滤波器去除噪声,使用拉普拉斯算子进行边缘检测。 3. 图像变换:包括灰度变换、直方图均衡化、傅里叶变换等。灰度变换可以改变图像的亮度和对比度;直方图均衡化能增强图像的对比度;傅里叶变换...
9. **拉普拉斯锐化**:拉普拉斯算子是一种检测图像边缘的算子,它对图像进行二阶微分运算,可以突出边缘,但可能引入噪声。锐化可以通过将拉普拉斯结果与原图相加来实现。 10. **边缘检测**:边缘检测是图像分析的...
在这个“图像的增强处理 VC opencv”主题中,我们将深入探讨如何使用OpenCV库在Visual C++环境下进行图像增强操作,主要包括图像平滑、中值滤波以及拉普拉斯锐化。 首先,我们来了解图像平滑。图像平滑,又称为图像...
例如,高斯模糊可以降低噪声,中值滤波器可以有效去除椒盐噪声,而拉普拉斯锐化可以增强图像边缘。 5. 几何变换:除了平移和旋转,还包括仿射变换、透视变换等,用于将图像从一个几何空间转换到另一个,如扭曲、...
考虑到噪声点可能对边沿检测产生干扰,高斯拉普拉斯算子通过结合高斯平滑和拉普拉斯锐化,先平滑图像以消除噪声,然后进行边沿检测,从而提供更好的效果。5x5的LOG模板和其位置加权系数关系曲线类似墨西哥草帽,故...
当然,实际应用中可能需要根据具体需求调整滤波器的参数,例如改变高斯核的标准差以控制模糊程度,或者调整拉普拉斯核的权重以改变边缘检测的敏感性。此外,还可以结合其他图像处理技术,如噪声去除、直方图均衡化等...
30个图像处理的VC++ 源代码,包括256色转灰度图,Hough变换,image_j1,PCA,Walsh变换,对比度拉伸,二值化变换,反色, 方块编码,傅立叶变换,高斯平滑,灰度均衡,均值滤波,拉普拉斯锐化(边缘检测), 离散余弦变换,亮度增减...
注意,本目录中大部分程序只能对256色图像进行操作。 对比度拉伸 二值化 变换反色 亮度增减 取对数取指数 直方图均衡 阈值变换 图像镜像 图像平移 ...拉普拉斯锐化(边缘检测) 离散余弦变换 Walsh变换 维纳滤波处理
4. **拉普拉斯锐化(边缘检测)**:拉普拉斯算子是一种微分算子,用于检测图像的边缘。它是二阶导数的一种表示,能够突出图像中像素强度变化大的区域,即图像边缘。在VC++中,拉普拉斯锐化通常涉及计算图像的梯度和...
源码目录结构图、256色转灰度图、Hough变换、Walsh变换、二值化变换、亮度增减、傅立叶变换、反色、取对数、取指数、图像平移、图像旋转、图像细化、图像缩放、图像镜像、均值滤波、对比度拉伸、拉普拉斯锐化(边缘...
在图像处理领域,VC++(Visual C++)是一种...通过学习和掌握这些技术,可以实现从边缘检测到模板匹配等一系列复杂的图像处理任务。在实际项目中,开发者需要根据需求选择合适的算法和优化策略,以达到最佳的处理效果。
锐化使用拉普拉斯算子或高斯差分算子来突出边缘;去噪则常采用中值滤波器或高斯滤波器消除椒盐噪声或高斯噪声。 3. **图像恢复**:恢复图像的原始信息,如逆滤波、自适应滤波等方法,用于修复失真或降质的图像。 4...