void CSDIELSView::OnSharpeningEnhance()
{
//程序编制:李立宗 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;
int tempX,tempY;
int temp;
float tempA;
//int M[3][3]={{1,2,1},{2,4,2},{1,2,1}};
int t=100; //门限
int f=1; //参数,原图像的比例值
float maxR,minR,maxG,minG,maxB,minB;
float spanR,spanG,spanB;
static int tempArray[1000][1000][3]={0}; //必须定义为static,否则无法支持大数组
// tempR=tempG=tempG=0;
//说明:将生产的图像作为24位图处理。
for (int y=1; y<maxY-1; y++) {
for (int x=1; x<maxX-1; x++) {
temp=
*(pRealData+pit*(y-1)+(x-1)*bitCount)+*(pRealData+pit*(y-1)+(x)*bitCount)+*(pRealData+pit*(y-1)+(x+1)*bitCount)
+*(pRealData+pit*(y)+(x-1)*bitCount)-8*(*(pRealData+pit*(y)+(x)*bitCount))+*(pRealData+pit*(y)+(x+1)*bitCount)
+*(pRealData+pit*(y+1)+(x-1)*bitCount)+*(pRealData+pit*(y+1)+(x)*bitCount)+*(pRealData+pit*(y+1)+(x+1)*bitCount);
if(temp>255)
temp=255;
if(temp<-255)
temp=-255;
tempArray[y][x][0]=f*(*(pRealData+pit*(y)+(x)*bitCount))+temp+0.5;
if(bitCount==1)
{
/*tempG=tempR;
tempB=tempR;*/
tempArray[y][x][1]=tempArray[y][x][0];
tempArray[y][x][2]=tempArray[y][x][0];
}
else
{
temp=
*(pRealData+pit*(y-1)+(x-1)*bitCount+1)+*(pRealData+pit*(y-1)+(x)*bitCount+1)+*(pRealData+pit*(y-1)+(x+1)*bitCount+1)
+*(pRealData+pit*(y)+(x-1)*bitCount+1)-8*(*(pRealData+pit*(y)+(x)*bitCount+1))+*(pRealData+pit*(y)+(x+1)*bitCount+1)
+*(pRealData+pit*(y+1)+(x-1)*bitCount+1)+*(pRealData+pit*(y+1)+(x)*bitCount+1)+*(pRealData+pit*(y+1)+(x+1)*bitCount+1);
if(temp>255)
temp=255;
if(temp<-255)
temp=-255;
tempArray[y][x][1]=f*(*(pRealData+pit*(y)+(x)*bitCount+1))+temp+0.5;
temp=
*(pRealData+pit*(y-1)+(x-1)*bitCount+2)+*(pRealData+pit*(y-1)+(x)*bitCount+2)+*(pRealData+pit*(y-1)+(x+1)*bitCount+2)
+*(pRealData+pit*(y)+(x-1)*bitCount+2)-8*(*(pRealData+pit*(y)+(x)*bitCount+2))+*(pRealData+pit*(y)+(x+1)*bitCount+2)
+*(pRealData+pit*(y+1)+(x-1)*bitCount+2)+*(pRealData+pit*(y+1)+(x)*bitCount+2)+*(pRealData+pit*(y+1)+(x+1)*bitCount+2);
if(temp>255)
temp=255;
if(temp<-255)
temp=-255;
tempArray[y][x][2]=f*(*(pRealData+pit*(y)+(x)*bitCount+2))+temp+0.5;
}
}
}
maxR=maxG=maxB=0;
minR=minG=minB=65535;
for (int y=1; y<maxY-1; y++) {
for (int x=1; x<maxX-1; x++) {
if(maxR<(tempArray[y][x][0]))
maxR=tempArray[y][x][0];
if(maxG<(tempArray[y][x][1]))
maxG=tempArray[y][x][1];
if(maxB<(tempArray[y][x][2]))
maxB=tempArray[y][x][2];
if(minR>(tempArray[y][x][0]))
minR=tempArray[y][x][0];
if(minG>(tempArray[y][x][1]))
minG=tempArray[y][x][1];
if(minB>(tempArray[y][x][2]))
minB=tempArray[y][x][2];
}
}
spanR=maxR-minR;
spanG=maxG-minG;
spanB=maxB-minB;
for (int y=1; y<maxY-1; y++) {
for (int x=1; x<maxX-1; x++) {
if(spanR>0)
tempR=(int)(tempArray[y][x][0]-minR)*255/spanR;
else if(tempArray[y][x][0]<=255)
tempR=tempArray[y][x][0];
else
tempR=255;
if(spanG>0)
tempG=(int)(tempArray[y][x][1]-minR)*255/spanR;
else if(tempArray[y][x][1]<=255)
tempG=tempArray[y][x][1];
else
tempG=255;
if(spanB>0)
tempB=(int)(tempArray[y][x][2]-minR)*255/spanR;
else if(tempArray[y][x][2]<=255)
tempB=tempArray[y][x][2];
else
tempB=255;
*(pRealData2+pit2*y+x*bitCount2)=tempR;
*(pRealData2+pit2*y+x*bitCount2+1)=tempG;
*(pRealData2+pit2*y+x*bitCount2+2)=tempB;
}
}
Invalidate();
}
分享到:
相关推荐
总的来说,“image process.zip”是一个综合性的图像处理工具,利用C++和VC环境,实现了匹配滤波和多种图像滤波方法。对于学习图像处理的开发者,这个项目提供了一个很好的实践平台,有助于理解并掌握这些关键算法。
在给定的“图像平滑滤波VC源代码”中,我们可以了解到这是一份使用Visual C++(简称VC)编写的程序,适用于图像平滑处理的初学者。下面将详细解释图像平滑、滤波以及在VC环境下实现这些功能的关键知识点。 1. 图像...
卡尔曼滤波是一种在噪声环境下估计系统状态的数学方法,由鲁道夫·卡尔曼于1960年提出,广泛应用于导航、控制理论、信号处理、图像处理、金融预测等多个领域。VC(Visual C++)是微软开发的一款C++编程环境,常用于...
在图像处理领域,滤波是一种常见的技术,用于改善图像质量,消除噪声,或者突出特定的图像特征。均值滤波和中值滤波是两种基本的...在VC环境下,利用OpenCV库可以方便地实现这些功能,从而提升图像处理的效率和效果。
"图像处理vc源码,涉及图像平滑,滤波,细化处理"这个标题揭示了我们将在这一话题中探讨的核心技术:图像平滑、滤波和细化。这些是图像处理中的基本操作,对于改善图像质量、提取特征或识别模式至关重要。 图像平滑...
本文将深入探讨标题“成像雷达数据滤波VC”所涵盖的知识点,包括雷达数据的读取、Lee滤波、Frost滤波、Kuan滤波以及斜坡校正。 首先,雷达数据的读取是处理的第一步。雷达,全称为合成孔径雷达(Synthetic Aperture...
本项目主要探讨了如何使用VC++实现图像显示、预处理、滤波以及边缘检测等一系列操作。以下是对这些知识点的详细阐述: 一、图像显示 在VC++中,显示数字图像通常涉及到Windows图形设备接口(GDI)或DirectX等库。...
自适应中值滤波是一种高效的图像处理技术,主要用于去除图像...通过这个项目,你可以学习到如何利用C++和MFC创建一个图形用户界面,以及如何实现自适应中值滤波算法,这对于提升图像处理技能和软件开发能力都十分有益。
在给定的“zhongzhilvbo.rar”压缩包中,包含了一个VC++实现的图像处理项目,重点是应用中值滤波算法来改善图像质量。 中值滤波器的基本思想是用像素邻域内像素值的中值来代替该像素的原始值。相比于均值滤波,中值...
在图像处理领域,VC(Visual C++)是一种常用的编程环境,用于实现各种图像处理算法。...通过学习和理解这些内容,开发者将能够运用VC实现自己的图像处理工具或系统,进一步提升在图像处理领域的技能。
在`VC_卡尔曼滤波`这个文件中,可能包含了这些函数的实现,以及主函数`main()`,其中调用这些函数来运行滤波器并处理数据。 **6. 扩展与优化** 实际应用中,卡尔曼滤波器可能需要进行扩展,如扩展卡尔曼滤波(EKF)...
压缩包中的"VC源代码"表明这些是用C++编程语言编写的源代码,可能包含了实现小波变换、图像融合、滤波、复原和增强功能的算法。学习和理解这些代码可以帮助开发者深入理解小波理论,并能够在实际项目中应用这些技术...
针对“图像缩放毕业设计VC实现源代码”这个项目,我们可以深入探讨以下几个核心概念: 1. 图像缩放:图像缩放是调整图像大小的过程,可以放大或缩小图像。常见的算法有最近邻插值、双线性插值和三次卷积插值等,每...
在VC(Visual C++)中实现各种滤波技术是一项重要的任务,特别是在数字信号处理和通信系统领域。这个项目提供了一套完整的源代码,可以帮助开发者掌握如何在VC环境中编写滤波器,并且这些代码具有良好的可移植性,...
【描述】提到的“在VC平台上实现”意味着该程序是在Microsoft Visual C++环境下编译和运行的,这通常涉及到设置项目配置、链接OpenCV库以及编写C++代码。在运行前“一定要安装opencv”,这是必要的前提条件,因为...
在这个“图像的增强处理 VC opencv”主题中,我们将深入探讨如何使用OpenCV库在Visual C++环境下进行图像增强操作,主要包括图像平滑、中值滤波以及拉普拉斯锐化。 首先,我们来了解图像平滑。图像平滑,又称为图像...
**锐化处理**是提升图像边缘对比度的过程,常用于突出图像细节。**SOBEL算子**是一种常用的边缘检测算子,它结合了水平和垂直方向的梯度来估计图像的边缘。在图像的每个像素处,SOBEL算子分别计算水平和垂直方向的...
这个名为"VC图像编程.zip"的压缩包文件显然包含了关于如何在Visual C++(简称VC)环境下进行图像处理和识别的相关资料。下面将详细讨论这些知识点。 首先,我们要了解VC++图像编程的基础。VC++是Microsoft公司开发...
总的来说,VC实现的数字图像处理是一个包含广泛技术和理论的领域。从基本的像素操作到复杂的滤波算法,再到高效的压缩技术,每一步都需要扎实的理论基础和实践经验。通过深入学习和实践,我们可以利用VC开发出高效、...
《数字图像处理与机器视觉》一书的VC实现是一个宝贵的资源,它涵盖了图像处理和机器视觉领域的诸多核心算法。这个压缩包包含了一系列由VC(Visual C++)编写的代码示例,旨在帮助读者深入理解并实际操作这些算法,...