www.pudn.com > spacial.rar > MyDib.cpp
#include "StdAfx.h"
#include ".\mydib.h"
#include"MyDib.h"
#include "operator.h"
CMyDib::CMyDib(void)
: haarcount(0)
{
}
CMyDib::CMyDib(CSize size, int nBitCount) //构造函数
:CDib(size, nBitCount)
{
haarcount=0;
}
CMyDib::~CMyDib(void)
{
}
/********************************************************************************
* 函数名称:
* Negatives
* 描述:
* 图像反色操作
* 参数:
* 无
* 返回类型:
* void
********************************************************************************/
void CMyDib::Negatives()
{
int L, i, j;
int nRowByteCount = GetDibSaveDim().cx;//图像每一行的字节数
for(i = 0; i < m_lpBMIH->biHeight; i++)
{
for(j = 0; j < m_lpBMIH->biWidth; j++)
{
L = i * nRowByteCount + j * 3;
m_lpImage[L] = 255 - m_lpImage[L];
m_lpImage[L + 1] = 255 - m_lpImage[L + 1];
m_lpImage[L + 2] = 255 - m_lpImage[L + 2];
}
}
}
/********************************************************************************
* 函数名称:
* GamaTrans
* 描述:
* 图像灰度指数(伽马)变换操作
* 参数:
* double r:幂次,为大于0的正数
* 返回类型:
* void
********************************************************************************/
/*void CMyDib::GamaTrans(double r)
{
int L, i, j;
if(r <= 0)
return;
nRowByteCount = GetDibSaveDim().cx;//图像每一行的字节数
for(i = 0; i < m_lpBMIH->biHeight; i++)
{
for(j = 0; j < m_lpBMIH->biWidth; j++)
{
L = i * nRowByteCount + j * 3;
m_lpImage[L] = (BYTE)(255 * pow(m_lpImage[L] / 255.0, r));
m_lpImage[L+1] = (BYTE)(255 * pow(m_lpImage[L+1] / 255.0, r));
m_lpImage[L+2] = (BYTE)(255 * pow(m_lpImage[L+2] / 255.0, r));
}
}
}*/
/********************************************************************************
* 函数名称:
* HistEq
* 描述:
* 对图像进行直方图均衡化
* 参数:
* 无
* 返回类型:
* void
********************************************************************************/
void CMyDib::HistEq()
{
int dwSizeImage, i, j, L;
BYTE pixel, newPixel; //像素点灰度级
int n[256]; //个灰度级的像素个数
double s[256];
//图像每一行的字节数
int nRowByteCount = GetDibSaveDim().cx;
dwSizeImage = m_lpBMIH->biWidth * m_lpBMIH->biHeight;
//初始化
for(i = 0; i <= 255; i++)
{
n[i] = 0;
s[i] = 0.0;
}
//求n[i], i = 0, 1, 2, ..., 255
for(i = 0; i < m_lpBMIH->biHeight; i++)
for(j = 0; j < m_lpBMIH->biWidth; j++)
{
pixel = *(m_lpImage + i * nRowByteCount + j * 3);
n[pixel] += 1;
}
//求s[i], i = 0 --- 255, 即灰度级不大于i的概率
s[0] = (double)((double)n[0] / dwSizeImage);
for( i = 1; i <= 255; i++)
{
s[i] = s[i -1] + (double)((double)n[i] / dwSizeImage);
}
//将转化后的数据写入图像
for(i = 0; i < m_lpBMIH->biHeight; i++)
{
for(j = 0; j < m_lpBMIH->biWidth; j++)
{
L = i * nRowByteCount + j * 3;
pixel = *(m_lpImage + L);
newPixel = (BYTE)(255 * s[pixel]);
*(m_lpImage + L) = newPixel;
*(m_lpImage + L + 1) = newPixel;
*(m_lpImage + L + 2) = newPixel;
}
}
}
void CMyDib::Haar()
{
haarcount++;
BYTE** image;
BYTE** originimage;
LPBYTE temp;
int m=0,n=0;
int i;
int linewidth;
/* if(temp!=NULL)
HeapFree(GetProcessHeap(),0,temp);*/
temp=(BYTE*)HeapAlloc(GetProcessHeap(),0,m_dwSizeImage);
linewidth=(m_lpBMIH->biWidth*m_lpBMIH->biBitCount+31)/32*4;
image=new BYTE*[m_lpBMIH->biHeight];
originimage=new BYTE*[m_lpBMIH->biHeight];
for(i=0;ibiHeight;i++)
originimage[i]=m_lpImage+i*linewidth;
for(i=0;ibiHeight;i++)
// image[i]=temp+i*m_lpBMIH->biSizeImage/m_lpBMIH->biHeight;
image[i]=temp+i*linewidth;
int startline=m_lpBMIH->biHeight-(m_lpBMIH->biHeight>>(haarcount-1));
int endline=m_lpBMIH->biWidth>>(haarcount-1);
if(m_lpBMIH->biBitCount==24)
{
int x=(m_lpBMIH->biHeight-startline)/2+startline;
int y= endline/2;
for(i=startline,m=0;ibiHeight;i+=2,m++)
for(int j=0,n=0;jbiHeight;i++)
for(int j=0;jbiHeight-startline)/2+startline;
int y= endline/2;
for(i=startline,m=0;ibiHeight;i+=2,m++)
for(int j=0,n=0;jbiHeight;i++)
for(int j=0;jnow.x?now.x:origin.x;
x2=origin.xnow.y?now.y:origin.y;
y2=origin.ybiWidth*m_lpBMIH->biBitCount+31)/32*4;
image=new BYTE*[m_lpBMIH->biHeight];
originimage=new BYTE*[m_lpBMIH->biHeight];
for(i=0;ibiHeight;i++)
originimage[i]=m_lpImage+i*linewidth;
for(i=0;ibiHeight;i++)
image[i]=temp+i*linewidth;
int startline=m_lpBMIH->biHeight-(m_lpBMIH->biHeight>>(haarcount-1));
int endline=m_lpBMIH->biWidth>>(haarcount-1);
if(m_lpBMIH->biBitCount==24)
{
int x=(m_lpBMIH->biHeight-startline)/2+startline;
int y= endline/2;
if(x1<=0||x1>=y)x1=0;
if(x1>y)x1=y;
if(x2<=0||x2>=y)x2=y;
int p2=m_lpBMIH->biHeight-y2;
int p1=m_lpBMIH->biHeight-y1;
if(y2<=0&&y1<=0)p2=0;
if(p1biHeight;
if(p2biHeight;i+=2,m++)
for(int j=0,n=0;j=p2&&(x+m)<=p1&&n>=x1&&n<=x2)
{
image[i][j*3]=FloatToByte((originimage[x+m][n*3]*2.0+originimage[x+m][y*3+n*3]-originimage[startline+m][n*3]-originimage[startline+m][y*3+n*3]+127.5)/2.0);
image[i][j*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0+originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
image[i][j*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0+originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
image[i][(j+1)*3]=FloatToByte((originimage[x+m][n*3]*2.0-originimage[x+m][y*3+n*3]-originimage[startline+m][n*3]+originimage[startline+m][y*3+n*3]+127.5)/2.0);
image[i][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
image[i][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
image[i+1][j*3]=FloatToByte((originimage[x+m][y*3+n*3]+originimage[x+m][n*3]*2.0+originimage[startline+m][n*3]+originimage[startline+m][y*3+n*3]-382.5)/2.0);
image[i+1][j*3+1]=FloatToByte((originimage[x+m][y*3+n*3+1]+originimage[x+m][n*3+1]*2.0+originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]-382.5)/2.0);
image[i+1][j*3+2]=FloatToByte((originimage[x+m][y*3+n*3+2]+originimage[x+m][n*3+2]*2.0+originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]-382.5)/2.0);
image[i+1][(j+1)*3]=FloatToByte((originimage[x+m][n*3]*2.0-originimage[x+m][y*3+n*3]+originimage[startline+m][n*3]-originimage[startline+m][y*3+n*3]+127.5)/2.0);
image[i+1][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]+originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
image[i+1][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]+originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
}
else{
image[i][j*3]=0;
image[i][j*3+1]=0;
image[i][j*3+2]=0;
image[i][(j+1)*3]=0;
image[i][(j+1)*3+1]=0;
image[i][(j+1)*3+2]=0;
image[i+1][j*3]=0;
image[i+1][j*3+1]=0;
image[i+1][j*3+2]=0;
image[i+1][(j+1)*3]=0;
image[i+1][(j+1)*3+1]=0;
image[i+1][(j+1)*3+2]=0;
}
}
for(i=startline;ibiHeight;i++)
for(int j=0;jbiHeight-startline)/2+startline;
int y= endline/2;
if(x1<=0||x1>=y)x1=0;
if(x1>y)x1=y;
if(x2<=0||x2>=y)x2=y;
int p2=m_lpBMIH->biHeight-y2;
int p1=m_lpBMIH->biHeight-y1;
if(y2<=0&&y1<=0)p2=0;
if(p1biHeight;
if(p2biHeight;i+=2,m++)
for(int j=0,n=0;j=p2&&(x+m)<=p1&&n>=x1&&n<=x2)
{
image[i][j]=FloatToByte((originimage[x+m][n]*2.0+originimage[x+m][y+n]-originimage[startline+m][n]-originimage[startline+m][y+n]+127.5)/2.0);
//image[i][j*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0+originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
//image[i][j*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0+originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
image[i][j+1]=FloatToByte((originimage[x+m][n]*2.0-originimage[x+m][y+n]-originimage[startline+m][n]+originimage[startline+m][y+n]+127.5)/2.0);
//image[i][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]-originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
//image[i][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]-originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
image[i+1][j]=FloatToByte((originimage[x+m][y+n]+originimage[x+m][n]*2.0+originimage[startline+m][n]+originimage[startline+m][y+n]-382.5)/2.0);
//image[i+1][j*3+1]=FloatToByte((originimage[x+m][y*3+n*3+1]+originimage[x+m][n*3+1]*2.0+originimage[startline+m][n*3+1]+originimage[startline+m][y*3+n*3+1]-382.5)/2.0);
//image[i+1][j*3+2]=FloatToByte((originimage[x+m][y*3+n*3+2]+originimage[x+m][n*3+2]*2.0+originimage[startline+m][n*3+2]+originimage[startline+m][y*3+n*3+2]-382.5)/2.0);
image[i+1][j+1]=FloatToByte((originimage[x+m][n]*2.0-originimage[x+m][y+n]+originimage[startline+m][n]-originimage[startline+m][y+n]+127.5)/2.0);
//image[i+1][(j+1)*3+1]=FloatToByte((originimage[x+m][n*3+1]*2.0-originimage[x+m][y*3+n*3+1]+originimage[startline+m][n*3+1]-originimage[startline+m][y*3+n*3+1]+127.5)/2.0);
//image[i+1][(j+1)*3+2]=FloatToByte((originimage[x+m][n*3+2]*2.0-originimage[x+m][y*3+n*3+2]+originimage[startline+m][n*3+2]-originimage[startline+m][y*3+n*3+2]+127.5)/2.0);
}
else{
image[i][j]=0;
//image[i][j*3+1]=0;
//image[i][j*3+2]=0;
image[i][(j+1)]=0;
//image[i][(j+1)*3+1]=0;
//image[i][(j+1)*3+2]=0;
image[i+1][j]=0;
//image[i+1][j*3+1]=0;
//image[i+1][j*3+2]=0;
image[i+1][(j+1)]=0;
//image[i+1][(j+1)*3+1]=0;
//image[i+1][(j+1)*3+2]=0;
}
}
for(i=startline;ibiHeight;i++)
for(int j=0;j0)
haarcount--;
}
BYTE CMyDib::FloatToByte(double f)
{
if (f<=0) return (BYTE)0;
else if (f>=255) return (BYTE)255;
else return (BYTE)(f+0.5);
}
void it()
{
AfxMessageBox("dk");
}