📄 图像增强技术doc.cpp
字号:
// TODO: Add your command handler code here
//该函数用于实现对图像进行拉普拉斯锐化
LPBYTE Temp;
HLOCAL New;
long Width=(m_size.cx*8+31)/32*4;
New=LocalAlloc(LHND,Width*m_size.cy);
if(New==NULL)
{
MessageBox(NULL,"False!","flase",MB_OK);
}
Temp=(BYTE*)LocalLock(New);
memcpy(Temp,lpBits,Width*m_size.cy);
long i,j;
float ave;
int M_iYinzi[3][3]={-1,-1,-1,-1,9,-1,-1,-1,-1},m,n;
for(i=1;i<m_size.cy-1;i++)
{
for(j=1;j<Width-1;j++)
{
ave=0;
for(n=0;n<3;n++)
{
for(m=0;m<3;m++)
{
ave+=M_iYinzi[n][m]*Temp[(i-1+n)*Width+(j-1)+m];
}
}
if(abs((int)(ave+0.5))>255)
{
lpBits[i*m_size.cx+j]=255;
}
else
{
lpBits[i*m_size.cx+j]=abs((int)(ave+0.5));
}
}
}
UpdateAllViews(NULL);
SetModifiedFlag();
LocalUnlock(Temp);
LocalFree(Temp);
}
//15.对图像进行拉普拉斯锐化函数代码完毕
void CMyDoc::OnCopynonoiseimage()
{
// TODO: Add your command handler code here
//该函数用于复制无噪图像
//循环变量
long i,j;
lpTempDIB=new unsigned char[m_size.cy*(8*m_size.cx+31)/32*4];
for(j=0;j<m_size.cy;j++)
{
for(i=0;i<(8*m_size.cx+31)/32*4;i++)
{
lpTempDIB[j*(8*m_size.cx+31)/32*4+i]=lpBits[j*(8*m_size.cx+31)/32*4+i];
}
}
}
//16.复制无噪图像函数代码完毕
void CMyDoc::FFT(double *TD1, double *TD2, double *FD1, double *FD2, int r)
{
//该函数用于对图像进行傅立叶变换
// 付立叶变换点数
LONG count=1<<r;
// 循环变量
int i,j,k;
// 中间变量
int bfsize,p;
// 角度
double angle;
double *W1,*W2,*X11,*X12,*X21,*X22,*X1,*X2;
// 分配运算所需存储器
W1 = new double[count / 2];
W2 = new double[count / 2];
X11 = new double[count];
X12 = new double[count];
X21 = new double[count];
X22 = new double[count];
// 计算加权系数
for(i = 0; i < count / 2; i++)
{
angle = -i * 3.1415926535 * 2 / count;
W1[i]=double(cos(angle));
W2[i]=double(sin(angle));
}
// 将时域点写入X1
memcpy(X11, TD1, sizeof(double) * count);
memcpy(X12, TD2, sizeof(double) * count);
// 采用蝶形算法进行快速付立叶变换
for(k = 0; k < r; k++)
{
for(j = 0; j < 1 << k; j++)
{
bfsize = 1 << (r-k);
for(i = 0; i < bfsize / 2; i++)
{
p = j * bfsize;
X21[i + p] = X11[i + p] + X11[i + p + bfsize / 2];
X22[i + p] = X12[i + p] + X12[i + p + bfsize / 2];
X21[i + p + bfsize / 2] = (X11[i + p] - X11[i + p + bfsize / 2]) * W1[i * (1<<k)]
-(X12[i + p] - X12[i + p + bfsize / 2]) * W2[i * (1<<k)];
X22[i + p + bfsize / 2] = (X11[i + p] - X11[i + p + bfsize / 2]) * W2[i * (1<<k)]
+(X12[i + p] - X12[i + p + bfsize / 2]) * W1[i * (1<<k)];
}
}
X1 = X11;
X2 = X12;
X11 = X21;
X12 = X22;
X21 = X1;
X22 = X2;
}
// 重新排序
for(j = 0; j < count; j++)
{
p = 0;
for(i = 0; i < r; i++)
{
if (j&(1<<i))
{
p+=1<<(r-i-1);
}
}
FD1[j]=X11[p];
FD2[j]=X12[p];
}
// 释放内存
delete W1;
delete W2;
delete X11;
delete X12;
delete X21;
delete X22;
}
//17.对图像进行傅立叶变换函数代码完毕
void CMyDoc::OnFft()
{
// TODO: Add your command handler code here
//该函数用于调用傅立叶变换函数
// 中间变量
double dTemp;
// 循环变量
LONG i,j;
// 进行付立叶变换的宽度和高度(2的整数次方)
LONG w,h;
int wp,hp;
// 图像每行的字节数
LONG lLineBytes=(8*m_size.cx+31)/32*4;
// 赋初值
w = 1;
h = 1;
wp = 0;
hp = 0;
// 计算进行付立叶变换的宽度和高度(2的整数次方)
while(w * 2 <= m_size.cx)
{
w *= 2;
wp++;
}
while(h * 2 <= m_size.cy)
{
h *= 2;
hp++;
}
// 分配内存
double *TD1 = new double[w * h];
double *TD2 = new double[w * h];
double *FD1 = new double[w * h];
double *FD2 = new double[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
// 给时域赋值
TD1[j + w * i] = lpBits[i*lLineBytes+j];
TD2[j + w * i] = 0;
}
}
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶变换
FFT(&TD1[w * i], &TD2[w * i],&FD1[w * i],&FD2[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
TD1[i + h * j] = FD1[j + w * i];
TD2[i + h * j] = FD2[j + w * i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立叶变换
FFT(&TD1[i * h],&TD2[i * h],&FD1[i * h], &FD2[i * h], hp);
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
// 计算频谱
dTemp = sqrt(FD1[j * h + i] * FD1[j * h + i] +
FD2[j * h + i] * FD2[j * h + i]) / 100;
// 判断是否超过255
if (dTemp > 255)
{
// 对于超过的,直接设置为255
dTemp = 255;
}
// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
// 此处不直接取i和j,是为了将变换后的原点移到中心
// 更新源图像
lpBits[(i<h/2 ? i+h/2 : i-h/2)/*)*/*lLineBytes
+ (j<w/2 ? j+w/2 : j-w/2)] = (BYTE)(dTemp);
// lpBits[i*lLineBytes+j]=(BYTE)(dTemp);
}
}
FFD1=FD1;
FFD2=FD2;
// 删除临时变量
delete TD1;
delete TD2;
// delete FD1;
// delete FD2;
UpdateAllViews(NULL);
SetModifiedFlag();
}
//18.调用傅立叶变换函数代码完毕
void CMyDoc::IFFT(double *FD1, double *FD2, double *TD1, double *TD2, int r)
{
//该函数用于对傅立叶变换后的图像进行反变换
// 付立叶变换点数
LONG count=1<<r;
// 循环变量
int i;
double *X1,*X2;
// 分配运算所需存储器
X1 = new double[count];
X2 = new double[count];
// 将频域点写入X
memcpy(X1, FD1, sizeof(double) * count);
memcpy(X2, FD2, sizeof(double) * count);
// 求共轭
for(i = 0; i < count; i++)
{
X1[i] = X1[i];
X2[i] = -X2[i];
}
// 调用快速付立叶变换
FFT(X1,X2,TD1,TD2, r);
// 求时域点的共轭
for(i = 0; i < count; i++)
{
TD1[i] = TD1[i] / count;
TD2[i] = -TD2[i] / count;
}
// 释放内存
delete X1;
delete X2;
}
//19.对傅立叶变换后的图像进行反变换函数代码完毕
void CMyDoc::OnIfft()
{
// TODO: Add your command handler code here
//该函数用于调用傅立叶反变换
// 中间变量
double dTemp;
// 循环变量
LONG i,j;
// 进行付立叶变换的宽度和高度(2的整数次方)
LONG w,h;
int wp,hp;
// 图像每行的字节数
LONG lLineBytes=(8*m_size.cx+31)/32*4;
// 赋初值
w = 1;
h = 1;
wp = 0;
hp = 0;
// 计算进行付立叶变换的宽度和高度(2的整数次方)
while(w * 2 <= m_size.cx)
{
w *= 2;
wp++;
}
while(h * 2 <= m_size.cy)
{
h *= 2;
hp++;
}
// 分配内存
double *TD1 = new double[w * h];
double *TD2 = new double[w * h];
double *FD1 = new double[w * h];
double *FD2 = new double[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
// 给频域赋值
FD1[j + w * i] = FFD1[j+w*i];
FD2[j + w * i] = FFD2[j+w*i];
}
}
for(i = 0; i < w; i++)
{
// 对x方向进行快速付立叶反变换
IFFT(&FD1[h * i], &FD2[h * i],&TD1[h * i],&TD2[h * i], hp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
FD1[i + h * j] = TD1[j + w * i];
FD2[i + h * j] = TD2[j + w * i];
}
}
for(i = 0; i < h; i++)
{
// 对x方向进行快速付立叶反变换
IFFT(&FD1[i * w],&FD2[i * w],&TD1[i * w], &TD2[i * w], wp);
}
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
//计算灰度值
dTemp = sqrt(TD1[j * h + i] * TD1[j * h + i] +
TD2[j * h + i] * TD2[j * h + i]);
// 判断是否超过255
if (dTemp > 255)
{
// 对于超过的,直接设置为255
dTemp = 255;
}
// 更新源图像
lpBits[j*lLineBytes+i/*i*lLineBytes + j*/] = (BYTE)(dTemp);
}
}
delete TD1;
delete TD2;
delete FD1;
delete FD2;
UpdateAllViews(NULL);
SetModifiedFlag();
}
//20.调用傅立叶反变换函数代码完毕
void CMyDoc::OnInteequalize()
{
// TODO: Add your command handler code here
//Db=最大灰度值/图象面积*((i=0~Da)∑各灰度值个数);Da代表灰度级。
long i,j;//循环变量;
int bMap[256];//存放灰度的映射表;
long lCount[256];//存放各个灰度值个数;
long width;//图象的宽度;
width=(m_size.cx*8+31)/32*4;
//计算各个灰度值个数;
for(i=0;i<256;i++)
{
lCount[i]=0;
}
for(i=0;i<m_size.cy;i++)
{
for(j=0;j<width;j++)
lCount[lpBits[i*width+j]]++;
}
//求映射表中各个灰度的值;
long temp;
for(i=0;i<256;i++)
{
temp=0;
for(j=0;j<i;j++)
{
temp+=lCount[j];
}
bMap[i]=(int)(temp*255/width/m_size.cy);
}
//重新赋值;
for(i=0;i<m_size.cy;i++)
{
for(j=0;j<width;j++)
{
lpBits[i*width+j]=bMap[lpBits[i*width+j]];
}
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
//21.灰度均衡代码完毕。
void CMyDoc::HightFilterFFT()
{
//该函数用于对图像进行高通傅立叶变换
// 中间变量
double dTemp;
// 循环变量
LONG i,j;
// 进行付立叶变换的宽度和高度(2的整数次方)
LONG w,h;
int wp,hp;
// 图像每行的字节数
LONG lLineBytes=(8*m_size.cx+31)/32*4;
// 赋初值
w = 1;
h = 1;
wp = 0;
hp = 0;
// 计算进行付立叶变换的宽度和高度(2的整数次方)
while(w * 2 <= m_size.cx)
{
w *= 2;
wp++;
}
while(h * 2 <= m_size.cy)
{
h *= 2;
hp++;
}
// 分配内存
double *TD1 = new double[w * h];
double *TD2 = new double[w * h];
double *FD1 = new double[w * h];
double *FD2 = new double[w * h];
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
// 给时域赋值
TD1[j + w * i] = lpBits[i*lLineBytes+j];
TD2[j + w * i] = 0;
}
}
for(i = 0; i < h; i++)
{
// 对y方向进行快速付立叶变换
FFT(&TD1[w * i], &TD2[w * i],&FD1[w * i],&FD2[w * i], wp);
}
// 保存变换结果
for(i = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -