?? makecolordib.cpp
字號:
+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
//對應的第0行的值乘以矩陣對應值,再相加
+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); // 復制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:LowLVBObig() */
/*函數(shù)類型:void */
/*功能:實現(xiàn)圖像低通濾波(5x5)。 */
/***************************************************************/
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;
//對應的第0行的值乘以矩陣對應值,再相加
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))
//對應的第1行的值乘以矩陣對應值,再相加
+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))
//對應的第2行的值乘以矩陣對應值,再相加
+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))
//對應的第3行的值乘以矩陣對應值,再相加
+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))
//對應的第4行的值乘以矩陣對應值,再相加
+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); // 復制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ShuiPingGROW() */
/*函數(shù)類型:void */
/*功能:使圖像水平增強。 */
/***************************************************************/
void MakeColorDib::ShuiPingGROW() //水平增強
{
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;
//對應的3行的值乘分別以矩陣對應值,再相加
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); // 復制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ChuiZhiGROW() */
/*函數(shù)類型:void */
/*功能:使圖像垂直增強。 */
/***************************************************************/
void MakeColorDib::ChuiZhiGROW() //垂直增強
{
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;
//對應的第0行的值乘以矩陣對應值,再相加
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); // 復制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
/***************************************************************/
/*函數(shù)名稱:ShuangXiangGROW() */
/*函數(shù)類型:void */
/*功能:使圖像雙向增強。 */
/***************************************************************/
void MakeColorDib::ShuangXiangGROW() //雙向增強
{
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;
//對應的第0行的值乘以矩陣對應值,再相加
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))
//對應的第1行的值乘以矩陣對應值,再相加
+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))
//對應的第2行的值乘以矩陣對應值,再相加
+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); // 復制處理后的圖像
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) // 每列
{ //對應周圍(5x5)矩陣藍色值求和平均
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);
}
//對應周圍(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);
}
//對應周圍(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); // 復制處理后的圖像
delete []p_temp; //刪除暫時分配內(nèi)存
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -