查資料時看到的一篇博文,轉(zhuǎn)下來先,原文:http://gaojinpeng1129.blog.163.com/blog/static/141659068201321194552695/
/*函數(shù)名稱:MakegGray() */
/*函數(shù)類型:void */
/*功能:真彩色轉(zhuǎn)化成256色灰度圖像。 */
/***************************************************************/
void MakeColorDib::MakegGray() //灰度變化
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //得到藍(lán)色值
BYTE* pbyGreen = p_data++; //得到綠色值
BYTE* pbyRed = p_data++; //得到紅色值
BYTE r = *pbyRed;
BYTE g = *pbyGreen;
BYTE b = *pbyBlue;
//取到原r,g,b中的最大值作為像素三分量值的新值
int gray=0;
if(r>g)
gray=r;
else
gray=g;
if(gray<b)
gray=b;
*pbyBlue = gray; //將取到的最大值賦給像素的藍(lán)分量
*pbyGreen = gray; //將取到的最大值賦給像素的綠分量
*pbyRed = gray; //將取到的最大值賦給像素的紅分量
}
}
/***************************************************************/
/*函數(shù)名稱:LightAlter(int m_Light) */
/*函數(shù)類型:void */
/*參數(shù):int m_Light,用戶給定的閾值 */
/*功能:對圖像使用閾值法進(jìn)行亮度調(diào)整。 */
/***************************************************************/
void MakeColorDib::LightAlter(int m_Light) //亮度調(diào)整
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=0;
a=int(*p_data*m_Light/100); //調(diào)整當(dāng)前點的亮度
*p_data=a;
//判斷范圍,取得合理的值
if(a<0)
*p_data=0;
if(a>255)
*p_data=255;
p_data++; //指向下一指針
}
}
/***************************************************************/
/*函數(shù)名稱:LightReverse() */
/*函數(shù)類型:void */
/*功能:圖像的亮度取反。 */
/***************************************************************/
void MakeColorDib::LightReverse() //亮度取反
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=*p_data; //取得當(dāng)前點的值
*p_data=255-a; //取反
p_data++; //指向下一指針
}
}
/***************************************************************/
/*函數(shù)名稱:ContrastAlter(int m_Increment) */
/*函數(shù)類型:void */
/*參數(shù):int m_Increment,用戶給定的閾值 */
/*功能:對圖像使用閾值法調(diào)整對比度處理。 */
/***************************************************************/
void MakeColorDib::ContrastAlter(int m_Increment) ///對比度處理
{
int nHigh = 255 - m_Increment;
//對于極端情況加以處理
if(nHigh < m_Increment)
{
nHigh = 127;
m_Increment = 120;
}
if(m_Increment < -127)
m_Increment = -120;
//擴(kuò)展或壓縮區(qū)間的長度
int nStretch = 255;
if(m_Increment >= 0)
nStretch = 255 - 2 * m_Increment;
else
nStretch = 255 + 2 * m_Increment;
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
if(m_Increment >= 0) // m_Increment>=0時
{
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth-3;i+=3) // 每列
{
//取得當(dāng)前點(藍(lán)色)的值,調(diào)整
BYTE* pbyBlue = p_data++;
if(*pbyBlue<=m_Increment)
*pbyBlue=0;
else if(*pbyBlue>nHigh)
*pbyBlue=255;
else
*pbyBlue=(BYTE)((((int)*pbyBlue - m_Increment) * 255) / nStretch );
//取得當(dāng)前點(綠色)的值,調(diào)整
BYTE* pbyGreen = p_data++;
if(*pbyGreen<=m_Increment)
*pbyGreen=0;
else if(*pbyGreen>nHigh)
*pbyGreen=255;
else
*pbyGreen=(BYTE)((((int)*pbyGreen - m_Increment) * 255) / nStretch );
//取得當(dāng)前點(紅色)的值,調(diào)整
BYTE* pbyRed = p_data++;
if(*pbyRed<=m_Increment)
*pbyRed=0;
else if(*pbyRed>nHigh)
*pbyRed=255;
else
*pbyRed=(BYTE)((((int)*pbyRed - m_Increment) * 255) / nStretch );
}
}
else // m_Increment < 0 時
{
for(int j=0;j<height;j++)
for(int i=0;i<DibWidth-3;i+=3)
{ //取得當(dāng)前點(藍(lán)色)的值,調(diào)整
BYTE* pbyBlue = p_data++;
*pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);
//取得當(dāng)前點(紅色)的值,調(diào)整
BYTE* pbyGreen = p_data++;
*pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);
//取得當(dāng)前點(紅色)的值,調(diào)整
BYTE* pbyRed = p_data++;
*pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment);
}
}
}
/***************************************************************/
/*函數(shù)名稱:Exposal() */
/*函數(shù)類型:void */
/*功能:圖像曝光處理。 */
/***************************************************************/
void MakeColorDib::Exposal() //曝光處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
BYTE* pbydata = p_data++; //取得當(dāng)前點的值
BYTE a=*pbydata; //傳給臨時變量
*pbydata=(a>128)?a:(255-a); //調(diào)整
}
}
/***************************************************************/
/*函數(shù)名稱:PaintColor(int m_Red,int m_Green,int m_Blue) */
/*函數(shù)類型:void */
/*參數(shù):int m_Red、m_Green、m_Blue,用戶給定的紅綠藍(lán)值 */
/*功能:對圖像使用閾值法進(jìn)行著色處理。 */
/***************************************************************/
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //著色處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //取得當(dāng)前點(藍(lán)色)的值
BYTE* pbyGreen = p_data++; //取得當(dāng)前點(綠色)的值
BYTE* pbyRed = p_data++; //取得當(dāng)前點(紅色)的值
BYTE r = *pbyRed;
BYTE g = *pbyGreen;
BYTE b = *pbyBlue;
BYTE gray=(BYTE)(((WORD)r * 59 + (WORD)g * 30 + (WORD)b * 11) / 100);
*pbyBlue = (BYTE)((m_Blue * gray) / 255);
*pbyGreen = (BYTE)((m_Green * gray) / 255);
*pbyRed = (BYTE)((m_Red * gray) / 255);
}
}
/***************************************************************/
/*函數(shù)名稱:NeonLight() */
/*函數(shù)類型:void */
/*功能:使圖像產(chǎn)生霓虹處理效果。 */
/***************************************************************/
void MakeColorDib::NeonLight() //霓虹處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-4;j++) // 每行
{
for(int i=0;i<DibWidth-1;i++) // 每列
{
int pby_pt=0;
//對像素執(zhí)行算法
pby_pt=(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
*(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
+(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i))
*(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i));
*(p_temp+(height-j-1)*DibWidth+i)=2*int(sqrt(pby_pt));
//判斷合法性
if(*(p_temp+(height-j-1)*DibWidth+i)<0)
*(p_temp+(height-j-1)*DibWidth+i)=0;
if(*(p_temp+(height-j-1)*DibWidth+i)>255)
*(p_temp+(height-j-1)*DibWidth+i)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:Smoothness() */
/*函數(shù)類型:void */
/*功能:使圖像平滑處理。 */
/***************************************************************/
void MakeColorDib::Smoothness() //平滑處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[3][3];////定義(3x3)矩陣
h[0][0] = 1; h[0][1] = 1; h[0][2] = 1;
h[1][0] = 1; h[1][1] = 1; h[1][2] = 1;
h[2][0] = 1; h[2][1] = 1; h[2][2] = 1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
double pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
*(p_temp+(height-j-2)*DibWidth+i+3)=abs(int(pby_pt/9));//取總和的的平均值
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp;//刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:Embossment() */
/*函數(shù)類型:void */
/*功能:產(chǎn)生圖像浮雕處理效果。 */
/***************************************************************/
void MakeColorDib::Embossment() //浮雕處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height;j++) // 每行
{
for(int i=0;i<DibWidth-4;i++) // 每列
{
int pby_pt=0;
//對像素得每個分量執(zhí)行算法
pby_pt=*(p_data+(height-j-1)*DibWidth+i)
-*(p_data+(height-j-1)*DibWidth+i+3)+128;
*(p_temp+(height-j-1)*DibWidth+i+3)=pby_pt;
//檢驗合法性
if(*(p_temp+(height-j-1)*DibWidth+i+3)<0)
*(p_temp+(height-j-1)*DibWidth+i+3)=0;
else if(*(p_temp+(height-j-1)*DibWidth+i+3)>255)
*(p_temp+(height-j-1)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:Spread() */
/*函數(shù)類型:void */
/*功能:圖像擴(kuò)散處理。 */
/***************************************************************/
void MakeColorDib::Spread() //擴(kuò)散處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-4;j++) // 每行
{
for(int i=0;i<DibWidth-14;i++) // 每列
{
int m=0,n=0;
m=rand()%5; //取得行隨機(jī)數(shù)
n=rand()%5; //取得列隨機(jī)數(shù)
int pby_pt=0;
pby_pt=*(p_data+(height-j-1-m)*DibWidth+i+3*n);//得到對應(yīng)隨機(jī)像素值
*(p_temp+(height-j-3)*DibWidth+i+6)=pby_pt;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:Sharp() */
/*函數(shù)類型:void */
/*功能:圖像銳化處理。 */
/***************************************************************/
void MakeColorDib::Sharp() //圖像銳化
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth];
for(int j=0;j<height-1;j++) // 每行
{
for(int i=0;i<DibWidth-5;i++) // 每列
{
int pby_pt=0;
pby_pt= *(p_data+(height-j-2)*DibWidth+i+3)
-*(p_data+(height-j-1)*DibWidth+i);
*(p_temp+(height-j-2)*DibWidth+i+3)=*(p_data+(height-j-2)*DibWidth+i+3)
+abs(int(pby_pt/4));
if(*(p_temp+(height-j-2)*DibWidth+i+3)>255)
*(p_temp+(height-j-2)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:HighLVBO(int m_GaoTong) */
/*函數(shù)類型:void */
/*參數(shù):int m_GaoTong,用戶給定的閾值來選擇矩陣 */
/*功能:對圖像使用閾值法進(jìn)行高通濾波。 */
/***************************************************************/
void MakeColorDib::HighLVBO(int m_GaoTong) //高通濾波
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[3][3]; ////定義(3x3)矩陣
if(m_GaoTong==1)
{ //矩陣1(基本高通)
h[0][0] =1; h[0][1] =-2; h[0][2] =1;
h[1][0] =-2; h[1][1] =5; h[1][2] =-2;
h[2][0] =1; h[2][1] =-2; h[2][2] =1;
}
else if(m_GaoTong==2)
{ //矩陣2(中等高通)
h[0][0] = 0; h[0][1] = -1; h[0][2] = 0;
h[1][0] = -1; h[1][1] = 5; h[1][2] = -1;
h[2][0] = 0; h[2][1] = -1; h[2][2] = 0;
}
else
{ //矩陣3(過量高通)
h[0][0] = -1; h[0][1] = -1; h[0][2] = -1;
h[1][0] = -1; h[1][1] = 9; h[1][2] = -1;
h[2][0] = -1; h[2][1] = -1; h[2][2] = -1;
}
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
int pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
*(p_temp+(height-j-2)*DibWidth+i+3)=abs(pby_pt);
if(pby_pt>255) //判斷是否越界
*(p_temp+(height-j-2)*DibWidth+i+3)=255;
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:LowLVBO() */
/*函數(shù)類型:void */
/*功能:實現(xiàn)圖像低通濾波(3x3)。 */
/***************************************************************/
void MakeColorDib::LowLVBO() //低通濾波(3x3)
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
double h[3][3];////定義(3x3)矩陣
h[0][0] = 0.1; h[0][1] = 0.1; h[0][2] = 0.1;
h[1][0] = 0.1; h[1][1] = 0.2; h[1][2] = 0.1;
h[2][0] = 0.1; h[2][1] = 0.1; h[2][2] = 0.1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
double pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
*(p_temp+(height-j-2)*DibWidth+i+3)=abs(int(pby_pt));
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
函數(shù)名稱:LowVBObig()
函數(shù)類型:void
功能:實現(xiàn)函數(shù)低通濾波(5*5)
/***************************************************************/
void MakeColorDib::LowLVBObig() //低通濾波(5x5)
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[5][5];//定義(5x5)矩陣
h[0][0] = 1; h[0][1] = 1; h[0][2] = 1; h[0][3] = 1; h[0][4] = 1;
h[1][0] = 1; h[1][1] = 2; h[1][2] = 2; h[1][3] = 2; h[1][4] = 1;
h[2][0] = 1; h[2][1] = 2; h[2][2] = 3; h[2][3] = 2; h[2][4] = 1;
h[3][0] = 1; h[3][1] = 2; h[3][2] = 2; h[3][3] = 2; h[3][4] = 1;
h[4][0] = 1; h[4][1] = 1; h[4][2] = 1; h[4][3] = 1; h[4][4] = 1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-4;j++) // 每行
{
for(int i=0;i<DibWidth-14;i++) // 每列
{
int pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt=h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
+h[0][3]*(*(p_data+(height-j-1)*DibWidth+i+9))
+h[0][4]*(*(p_data+(height-j-1)*DibWidth+i+12))
//對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
+h[1][3]*(*(p_data+(height-j-2)*DibWidth+i+9))
+h[1][4]*(*(p_data+(height-j-2)*DibWidth+i+12))
//對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6))
+h[2][3]*(*(p_data+(height-j-3)*DibWidth+i+9))
+h[2][4]*(*(p_data+(height-j-3)*DibWidth+i+12))
//對應(yīng)的第3行的值乘以矩陣對應(yīng)值,再相加
+h[3][0]*(*(p_data+(height-j-4)*DibWidth+i))
+h[3][1]*(*(p_data+(height-j-4)*DibWidth+i+3))
+h[3][2]*(*(p_data+(height-j-4)*DibWidth+i+6))
+h[3][3]*(*(p_data+(height-j-4)*DibWidth+i+9))
+h[3][4]*(*(p_data+(height-j-4)*DibWidth+i+12))
//對應(yīng)的第4行的值乘以矩陣對應(yīng)值,再相加
+h[4][0]*(*(p_data+(height-j-5)*DibWidth+i))
+h[4][1]*(*(p_data+(height-j-5)*DibWidth+i+3))
+h[4][2]*(*(p_data+(height-j-5)*DibWidth+i+6))
+h[4][3]*(*(p_data+(height-j-5)*DibWidth+i+9))
+h[4][4]*(*(p_data+(height-j-5)*DibWidth+i+12));
//為了計算方便我們把除以35(矩陣權(quán)和)放在求總和之后
*(p_temp+(height-j-3)*DibWidth+i+6)=abs(int(pby_pt/35));
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ShuiPingGROW() */
/*函數(shù)類型:void */
/*功能:使圖像水平增強(qiáng)。 */
/***************************************************************/
void MakeColorDib::ShuiPingGROW() //水平增強(qiáng)
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[3][1];//定義(3x1)矩陣
h[0][0] = -1;
h[1][0] = 2;
h[2][0] = -1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
int pby_pt=0;
//對應(yīng)的3行的值乘分別以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i));
if(pby_pt>20)
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
else
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ChuiZhiGROW() */
/*函數(shù)類型:void */
/*功能:使圖像垂直增強(qiáng)。 */
/***************************************************************/
void MakeColorDib::ChuiZhiGROW() //垂直增強(qiáng)
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[1][3];//定義(1x3)矩陣
h[0][0] = -1;
h[0][1] = 2;
h[0][2] = -1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
int pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6));
if(pby_pt>20)
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
else
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ShuangXiangGROW() */
/*函數(shù)類型:void */
/*功能:使圖像雙向增強(qiáng)。 */
/***************************************************************/
void MakeColorDib::ShuangXiangGROW() //雙向增強(qiáng)
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
int h[3][3];//定義(3x3)矩陣
h[0][0] = -1; h[0][1] = -1; h[0][2] = -1;
h[1][0] = -1; h[1][1] = 8; h[1][2] = -1;
h[2][0] = -1; h[2][1] = -1; h[2][2] = -1;
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-2;j++) // 每行
{
for(int i=0;i<DibWidth-8;i++) // 每列
{
int pby_pt=0;
//對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
//對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
if(pby_pt>20)
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
else
*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:Mosaic() */
/*函數(shù)類型:void */
/*功能:使圖像產(chǎn)生馬賽克效果。 */
/***************************************************************/
void MakeColorDib::Mosaic() //馬賽克
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
for(int j=0;j<height-4;j+=5) // 每行
{
for(int i=0;i<DibWidth-14;i+=15) // 每列
{ //對應(yīng)周圍(5x5)矩陣藍(lán)色值求和平均
int pby_pt=0;
for(int m=0;m<5;m++)
for(int n=0;n<15;n+=3)
{
pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n);
}
for(m=0;m<5;m++)
for(int n=0;n<14;n+=3)
{
*(p_temp+(height-j-1-m)*DibWidth+i+n)=int(pby_pt/25);
}
//對應(yīng)周圍(5x5)矩陣綠色值求和平均
pby_pt=0;
for(m=0;m<5;m++)
for(int n=0;n<15;n+=3)
{
pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+1);
}
for(m=0;m<5;m++)
for(int n=0;n<14;n+=3)
{
*(p_temp+(height-j-1-m)*DibWidth+i+n+1)=int(pby_pt/25);
}
//對應(yīng)周圍(5x5)矩陣紅色值求和平均
pby_pt=0;
for(m=0;m<5;m++)
for(int n=0;n<15;n+=3)
{
pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+2);
}
for(m=0;m<5;m++)
for(int n=0;n<14;n+=3)
{
*(p_temp+(height-j-1-m)*DibWidth+i+n+2)=int(pby_pt/25);
}
}
}
memcpy(p_data,p_temp,height*DibWidth); // 復(fù)制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}