?? makecolordib.cpp
字號:
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 */
/*功能:圖像擴散處理。 */
/***************************************************************/
void MakeColorDib::Spread() //擴散處理
{
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; //取得行隨機數(shù)
n=rand()%5; //取得列隨機數(shù)
int pby_pt=0;
pby_pt=*(p_data+(height-j-1-m)*DibWidth+i+3*n);//得到對應(yīng)隨機像素值
*(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,用戶給定的閾值來選擇矩陣 */
/*功能:對圖像使用閾值法進行高通濾波。 */
/***************************************************************/
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))
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -