📄 envyimage.cpp
字号:
}
}
}
break;
case 0:
{
double max,min,a;
max=0;min=2;
LPBYTE lpSource;
lpSource = lpImageSource+3*col*row;
/*
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if((*(lpSource+i*col+j)+*(lpImageSource+i*col+j))==0)
{
*(lpImageTarget+(row-1-i)*saveCol+j)=0;
}
else{
a=sqrt((double(*(lpSource+i*col+j)-*(lpImageSource+i*col+j))/double(*(lpImageSource+3*col*row+i*col+j)+*(lpImageSource+i*col+j))+0.5));
if(a>max)
max=a;
else if(a<min)
min=a;
}
}
}*/
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if((*(lpSource+i*col+j)+*(lpImageSource+i*col+j))==0)
*(lpImageTarget+(row-1-i)*saveCol+j)=0;
else{
a=0;
a=sqrt((double(*(lpSource+i*col+j)-*(lpImageSource+i*col+j))/double(*(lpSource+i*col+j)+*(lpImageSource+i*col+j))+0.5));
if(a<0.7)
*(lpImageTarget+(row-1-i)*col+j)=0;
/*
else if(a<1&&a>=0.5)
*(lpImageTarget+(row-1-i)*saveCol+j)=128;*/
else
*(lpImageTarget+(row-1-i)*saveCol+j)=*(lpSource+i*col+j);
}
}
}
/*
CFile file("c:\\test.raw",CFile::modeCreate|CFile::modeWrite);
file.Write(lpImageTarget,row*col*sizeof(BYTE));
file.Close();*/
}
break;
default:
return -1;
}
}
else
return -1;
return 1;
}
void CEnvyImage::CreateDisplaTVIImage(int red, int green, int blue, int gray)
{
if(m_lpData==0) return;
// 检查是否需要重新分配存储空间内存
if(m_gray!=gray)
{
m_gray = gray;
m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
}
CreatTVIImage((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol);
}
int CEnvyImage::Sharpen(LPBYTE lpImageSource,LPBYTE lpImageTarget,BITMAPINFO* bitmap,int red,int green,int blue,int band,int order,int gray,int row,int col,int saveCol)
{
int i,j;
CreatRawHeader(col,row,saveCol,gray,m_hpalette,m_bitmapInfo);
// 指向梯度数据的指针
double* pdGrad;
pdGrad=new double[row*col];//
// 初始化
for(i=0; i<row ; i++ )
{ for(j=0 ; j<col ; j++ )
{
*(pdGrad+i*col+j)=0;
}
}
// 设置模板系数
/*
static int nWeight[3][3] ;
nWeight[0][0] = -1 ;
nWeight[0][1] = -1 ;
nWeight[0][2] = -1 ;
nWeight[1][0] = -1 ;
nWeight[1][1] = 8 ;
nWeight[1][2] = -1 ;
nWeight[2][0] = -1 ;
nWeight[2][1] = -1 ;
nWeight[2][2] = -1 ; */
static int nWeight[2][3][3] ;
nWeight[0][0][0] = -1 ;
nWeight[0][0][1] = 0 ;
nWeight[0][0][2] = 1 ;
nWeight[0][1][0] = -1 ;
nWeight[0][1][1] = 0 ;
nWeight[0][1][2] = 1 ;
nWeight[0][2][0] = -1 ;
nWeight[0][2][1] = 0 ;
nWeight[0][2][2] = 1 ;
nWeight[1][0][0] = 1 ;
nWeight[1][0][1] = 1 ;
nWeight[1][0][2] = 1 ;
nWeight[1][1][0] = 0 ;
nWeight[1][1][1] = 0 ;
nWeight[1][1][2] = 0 ;
nWeight[1][2][0] = -1 ;
nWeight[1][2][1] = -1 ;
nWeight[1][2][2] = -1 ;
//这个变量用来表示Laplacian算子象素值
int nTmp[3][3];
// 临时变量
double dGrad;
double dGradOne;
double dGradTwo;
// 模板循环控制变量
int x,y;
// 下面开始利用Laplacian算子进行计算
if(gray==1)
{
memset(lpImageTarget,0L,row*saveCol);
for(i=1; i<row-2; i++)
{
for(j=1; j<col-2; j++)
{
dGrad =0;dGradOne=0;
dGradTwo=0;
// Laplacian算子需要的各点象素值
// 模板第一行
nTmp[0][0] = *(lpImageSource+(i-1)*col+j-1);
nTmp[0][1] = *(lpImageSource+(i-1)*col+j);
nTmp[0][2] = *(lpImageSource+(i-1)*col+j+1) ;
// 模板第二行
nTmp[1][0] = *(lpImageSource+i*col+j-1);
nTmp[1][1] = *(lpImageSource+i*col+j) ;
nTmp[1][2] = *(lpImageSource+i*col+j+1) ;
// 模板第三行
nTmp[2][0] = *(lpImageSource+(i+1)*col+j-1) ;
nTmp[2][1] = *(lpImageSource+(i+1)*col+j) ;
nTmp[2][2] = *(lpImageSource+(i+1)*col+j+1) ;
// 计算梯度
for(x=0;x<3;x++)
{ for(y=0;y<3;y++)
{
dGradOne += nTmp[x][y] * nWeight[0][x][y];
dGradTwo += nTmp[x][y] * nWeight[1][x][y];
}
}
dGrad=dGradOne*dGradOne+dGradTwo*dGradTwo;
dGrad=sqrt(dGrad);
*(pdGrad+i*col+j)=dGrad;
}
}
for(i=0; i<row; i++ )
{
for(j=0 ; j<col ; j++ )
{
if(*(pdGrad+i*col+j)>50)
*(lpImageTarget+i*saveCol+j )=0;
else
*(lpImageTarget+i*saveCol+j)=255;
}
}
//转换坐标
BYTE* lpData=new BYTE[col*row];
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
*(lpData+i*col+j)=*(lpImageTarget+i*col+j);
}
}
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
*(lpImageTarget+i*col+j)=*(lpData+col*(row-i-1)+j);
}
}
/*
CFile file("c:\\test.raw",CFile::modeCreate|CFile::modeWrite);
file.Write(pdGrad,row*col*sizeof(BYTE));
file.Close();*/
delete []pdGrad;pdGrad=NULL;
return 1;
}
else return -1;
}
void CEnvyImage::CreateDisplaSharpenImage(int red, int green, int blue, int gray)
{
if(m_lpData==0) return;
// 检查是否需要重新分配存储空间内存
if(m_gray!=gray)
{
m_gray = gray;
m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
}
Sharpen((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol);
}
int CEnvyImage::RegionGrow(LPBYTE lpImageSource,LPBYTE lpImageTarget,BITMAPINFO* bitmap,int red,int green,int blue,int band,int order,int gray,int row,int col,int saveCol,CPoint point,int nThreshold)
{
CreatRawHeader(col,row,saveCol,gray,m_hpalette,m_bitmapInfo);
static int nDx[]={-1,-1,0,1,1,1,0,-1};
static int nDy[]={0,-1,-1,-1,0,1,1,1};
int SeedX=point.x;
int SeedY=point.y;
// 定义堆栈,存储坐标
int * pnGrowQueX ;
int * pnGrowQueY ;
// 分配空间
pnGrowQueX = new int [col*row];
pnGrowQueY = new int [col*row];
// 当nStart=nEnd, 表示堆栈中只有一个点
int nStart ;
int nEnd ;
//初始化
nStart = 0 ;
nEnd = 0 ;
LPBYTE lpUnRegion;
lpUnRegion=new unsigned char [row*col];
int i,j;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
*(lpUnRegion+i*col+j)=0;
}
memset(lpImageTarget,0L,row*saveCol);
// 把种子点的坐标压入栈
pnGrowQueX[nEnd] = SeedX;
pnGrowQueY[nEnd] = SeedY;
// 当前正在处理的象素
int nCurrX ;
int nCurrY ;
int k ;
int xx;
int yy;
while (nStart<=nEnd)
{
// 当前种子点的坐标
nCurrX = pnGrowQueX[nStart];
nCurrY = pnGrowQueY[nStart];
// 对当前点的8邻域进行遍历
for (k=0; k<8; k++)
{
// 8邻域象素的坐标
xx = nCurrX+nDx[k];
yy = nCurrY+nDy[k];
// 判断象素(xx,yy) 是否在图像内部
// 判断象素(xx,yy) 是否已经处理过
// pUnRegion[yy*nWidth+xx]==0 表示还没有处理
// 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值
if ((xx < row) && (xx>=0) && (yy<col) && (yy>=0)
&& (*(lpUnRegion+yy*col+xx)==0) )
{
if(abs( *(lpImageSource+yy*col+xx)-*(lpImageSource+nCurrY*col+nCurrX))<nThreshold )
{
nEnd++;
// 象素(xx,yy) 压入栈
pnGrowQueX[nEnd] = xx;
pnGrowQueY[nEnd] = yy;
// 把象素(xx,yy)设置成255
// 同时也表明该象素处理过
*(lpImageTarget+yy*saveCol+xx) = 128;
*(lpUnRegion+yy*col+xx)=255;
}
else
*(lpImageTarget+yy*saveCol+xx)=*(lpImageSource+yy*col+xx);
}
}
nStart++;
}
//转换坐标
BYTE* lpData=new BYTE[row*col];
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
*(lpData+i*col+j)=*(lpImageTarget+i*col+j);
}
}
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
*(lpImageTarget+i*col+j)=*(lpData+col*(row-i-1)+j);
}
}
// 释放内存
delete []lpUnRegion;
delete []pnGrowQueX;
delete []pnGrowQueY;
delete []lpData;
pnGrowQueX = NULL ;
pnGrowQueY = NULL ;
lpUnRegion = NULL;
lpData=NULL;
return 1;
}
void CEnvyImage::CreateDisplaRegionGrowImage(int red, int green, int blue, int gray,CPoint point,int nThreshold)
{
if(m_lpData==0) return;
// 检查是否需要重新分配存储空间内存
if(m_gray!=gray)
{
m_gray = gray;
m_imageSaveCol = (m_imageCol*gray*8+31)/32*4;
}
RegionGrow((LPBYTE)m_lpData,m_lpImage,m_bitmapInfo,red,green,blue,m_band,m_pixelOrder,gray,m_imageRow,m_imageCol,m_imageSaveCol,point,nThreshold);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -