?? zaoshengxiaochudib.cpp
字號:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "ZaoShengXiaoChuDib.h"
#include "MainFrm.h"
#include "DSplitView.h"
ZaoShengXiaoChuDib::ZaoShengXiaoChuDib()
{
}
ZaoShengXiaoChuDib::~ZaoShengXiaoChuDib()
{
}
/***************************************************************/
/*函數名稱:GuDing() */
/*函數類型:void */
/*參數:int Yuzhi,設定的閾值 */
/*功能:對圖像使用固定閾值法進行二值化。 */
/***************************************************************/
void ZaoShengXiaoChuDib::GuDing(int YuZhi)
{
LPBYTE p_data; //原圖數據區指針
int wide,height; //原圖長、寬
p_data=this->GetData (); //取得原圖的數據區指針
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
wide=this->GetWidth ();
height=this->GetHeight ();
for(int j=0;j<height;j++)
{
for(int i=0;i<wide;i++)
{
if(*p_data>YuZhi) //灰度值大于給定閾值,置為255
*p_data=255;
else
*p_data=0; //不大于置為0
p_data++;
}
}
}
else //24位彩色
{
wide=this->GetWidth();
height=this->GetHeight ();
for(int j=0;j<height;j++)
{
for(int i=0;i<wide;i++) //所有像素依次循環
{
if(*p_data>YuZhi) //若像素值不為0
*p_data=255; //將其置為255
else
*p_data=0; //不大于置為0
p_data++;
}
}
}
}
/***************************************************************/
/*函數名稱:HeiBaiFanZhuan() */
/*函數類型:void */
/*功能:對二值圖像的黑白點噪聲消除。 */
/***************************************************************/
void ZaoShengXiaoChuDib::HeiBaiFanZhuan()
{
int averg,averg2,averg3;
BYTE *p_data; //原圖數據區指針
int wide,height; //原圖長、寬
p_data=this->GetData ();//取得原圖的數據區指針
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
wide=this->GetWidth (); //取得原圖的數據區寬
height=this->GetHeight (); //取得原圖的數據區高
GuDing(100); //進行二值化
BYTE* p_temp=new BYTE[wide*height];// 申請并分配中間緩存
memcpy(p_temp,m_pData,wide*height);// 復制圖象數據到中間緩存
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周圍8近鄰均值
averg=(int)((p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8);
if(abs(averg-p_temp[j*wide+i])>127.5)
p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);
delete p_temp;
}
else //24位彩色
{
wide=this->GetWidth(); //取得原圖的數據區寬
height=this->GetHeight (); //取得原圖的數據區高
GuDing(100); //進行二值化
BYTE* p_temp=new BYTE[wide*height*3];// 申請并分配中間緩存
memcpy(p_temp,m_pData,wide*height*3);// 復制圖象數據到中間緩存
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
averg2=0;
averg3=0;
//求周圍8近鄰均值
averg=(int)((p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide*3+i*3]
+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide*3+(i-1)*3]
+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide*3+(i-1)*3]
+p_data[(j+1)*wide*3+i*3]+p_data[(j+1)*wide*3+(i+1)*3])/8);
averg2=(int)((p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide*3+i*3+1]
+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide*3+(i-1)*3+1]
+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide*3+(i-1)*3+1]
+p_data[(j+1)*wide*3+i*3+1]+p_data[(j+1)*wide*3+(i+1)*3+1])/8);
averg3=(int)((p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide*3+i*3+2]
+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide*3+(i-1)*3+2]
+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide*3+(i-1)*3+2]
+p_data[(j+1)*wide*3+i*3+2]+p_data[(j+1)*wide*3+(i+1)*3+2])/8);
if(abs(averg-p_temp[j*wide*3+i*3])>127.5)
p_temp[j*wide*3+i*3]=averg;
if(abs(averg2-p_temp[j*wide*3+i*3+1])>127.5)
p_temp[j*wide*3+i*3+1]=averg2;
if(abs(averg3-p_temp[j*wide*3+i*3+2])>127.5)
p_temp[j*wide*3+i*3+2]=averg3;
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數名稱:black(int connec) */
/*函數類型:void */
/*參數:int connec,設定的連通選擇 */
/*功能:對二值圖像進行消除孤立黑像素點。 */
/***************************************************************/
void ZaoShengXiaoChuDib::black(int connec)
{
// 指向DIB象素指針
BYTE *p_data;
p_data=this->GetData(); //取得原圖的數據區指針
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
int wide=this->GetWidth(); //取得原圖的數據區寬
int height=this->GetHeight(); //取得原圖的數據區高
//二值化
GuDing(100);
// 申請并分配中間緩存
BYTE* p_temp=new BYTE[wide*height];
// 復制圖象數據到中間緩存
memcpy(p_temp,p_data,wide*height);
// 4連接的情況下,消去上下左右都為255(白點)的孤立黑點
if (connec==4)
{
for (int j=1;j<height-1;j++)
{
for (int i=1;i<wide-1;i++)
{
if (*(p_temp + wide * j + i)==255)
continue;
if((*(p_temp + wide * (j-1) + i)+
*(p_temp + wide * (j+1) + i)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * j + i+1))==255*4)
{
*(p_data + wide * j + i)=255;
}
}
}
delete p_temp;
}
// 8連接的情況下,消去周圍都為255(白點)的孤立黑點
if (connec==8)
{
for (int j = 1; j < height-1; j ++)
{
for (int i = 1; i < wide-1; i ++)
{
if (*(p_temp + wide * j + i)==255)
continue;
if((*(p_temp + wide * (j-1) + i)+
*(p_temp + wide * (j+1) + i)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * (j-1) + i-1)+
*(p_temp + wide * (j+1) + i+1)+
*(p_temp + wide * (j-1) + i+1)+
*(p_temp + wide * (j+1) + i-1))==255*8)
{
*(p_data + wide * j + i)=255;
}
}
}
delete p_temp;
}
}
/* else //24位彩色
{
int wide= this->GetWidth(); //取得原圖的數據區寬
int height=this->GetHeight(); //取得原圖的數據區高
//二值化
GuDing(100);
// 申請并分配中間緩存
BYTE* p_temp=new BYTE[wide*height*3];
// 復制圖象數據到中間緩存
memcpy(p_temp,p_data,wide*height*3);
// 4連接的情況下,消去上下左右都為255(白點)的孤立黑點
if (connec==4)
{
for (int j=1;j<height-1;j++)
{
for (int i=1;i<wide-1;i++)
{
if ((*(p_temp + wide * j*3 + i*3)==255)&&
(*(p_temp + wide * j*3 + i*3+1)==255) &&
(*(p_temp + wide * j*3 + i*3+2)==255))
continue;
if(((*(p_temp + wide * (j-1)*3 + i*3)+
*(p_temp + wide * (j+1)*3 + i*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * j*3 + (i+1)*3))==255*4)&&
((*(p_temp + wide * (j-1)*3 + i*3+1)+
*(p_temp + wide * (j+1)*3 + i*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * j*3 + (i+1)*3+1))==255*4)&&
((*(p_temp + wide * (j-1)*3 + i*3+2)+
*(p_temp + wide * (j+1)*3 + i*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * j*3 + (i+1)*3+2))==255*4))
{
*(p_data + wide * j*3 + i*3)=255;
*(p_data + wide * j*3 + i*3+1)=255;
*(p_data + wide * j*3 + i*3+2)=255;
}
}
}
delete p_temp;
}
// 8連接的情況下,消去周圍都為255(白點)的孤立黑點
if (connec==8)
{
for (int j = 1; j < height-1; j ++)
{
for (int i = 1; i < wide-1; i ++)
{
if ((*(p_temp + wide * j*3 + i*3)==255)&&
(*(p_temp + wide * j*3 + i*3+1)==255)&&
(*(p_temp + wide * j*3 + i*3+2)==255))
continue;
if(((*(p_temp + wide * (j-1)*3 + i*3)+
*(p_temp + wide * (j+1)*3 + i*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * (j-1)*3 + (i-1)*3)+
*(p_temp + wide * (j+1)*3 + (i+1)*3)+
*(p_temp + wide * (j-1)*3 + (i+1)*3)+
*(p_temp + wide * (j+1)*3 + (i-1)*3))==255*8)&&
((*(p_temp + wide * (j-1)*3 + i*3+1)+
*(p_temp + wide * (j+1)*3 + i*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * (j-1)*3 + (i-1)*3+1)+
*(p_temp + wide * (j+1)*3 + (i+1)*3+1)+
*(p_temp + wide * (j-1)*3 + (i+1)*31+1)+
*(p_temp + wide * (j+1)*3 + (i-1)*3+1))==255*8)&&
((*(p_temp + wide * (j-1)*3 + i*3+2)+
*(p_temp + wide * (j+1)*3 + i*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * (j-1)*3 + (i-1)*3+2)+
*(p_temp + wide * (j+1)*3 + (i+1)*3+2)+
*(p_temp + wide * (j-1)*3 + (i+1)*3+2)+
*(p_temp + wide * (j+1)*3 + (i-1)*3+2))==255*8))
{
*(p_data + wide * j*3 + i*3)=255;
*(p_data + wide * j*3 + i*3+1)=255;
*(p_data + wide * j*3 + i*3+2)=255;
}
}
}
delete p_temp;
}
}*/
}
/***************************************************************/
/*函數名稱:threethree() */
/*函數類型:void */
/*功能:對圖像進行3*3均值濾波處理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::threethree()
{
float averg,averg2,averg3;
BYTE *p_data; //原圖數據區指針
int wide,height; //原圖長、寬
p_data=this->GetData ();//取得原圖的數據區指針
wide=this->GetWidth (); //取得原圖的數據區寬
height=this->GetHeight (); //取得原圖的數據區高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
BYTE* p_temp=new BYTE[wide*height];
int size=wide*height;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周圍8近鄰均值
averg=(int)(p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8;
p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);
delete p_temp;
}
else //24位彩色
{
BYTE* p_temp=new BYTE[wide*height*3];
int size=wide*height*3;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
averg2=0;
averg3=0;
//求周圍8近鄰均值
averg=(int)(p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide*3+i*3]
+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide*3+(i-1)*3]
+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide*3+(i-1)*3]
+p_data[(j+1)*wide+i*3]+p_data[(j+1)*wide+(i+1)*3])/8;
averg2=(int)(p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide*3+i*3+1]
+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide*3+(i-1)*3+1]
+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide*3+(i-1)*3+1]
+p_data[(j+1)*wide+i*3+1]+p_data[(j+1)*wide+(i+1)*3+1])/8;
averg3=(int)(p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide*3+i*3+2]
+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide*3+(i-1)*3+2]
+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide*3+(i-1)*3+2]
+p_data[(j+1)*wide+i*3+2]+p_data[(j+1)*wide+(i+1)*3+2])/8;
p_temp[j*wide*3+i*3]=(int)averg;
p_temp[j*wide*3+i*3+1]=(int)averg2;
p_temp[j*wide*3+i*3+2]=(int)averg3;
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數名稱:Chaoxian(int T) */
/*函數類型:void */
/*參數:int T,設定的閾值 */
/*功能:超限鄰域平均法。 */
/***************************************************************/
void ZaoShengXiaoChuDib::Chaoxian(int T)
{
int averg,averg2,averg3;
BYTE *p_data; //原圖數據區指針
int wide,height; //原圖長、寬
p_data=this->GetData ();//取得原圖的數據區指針
wide=this->GetWidth (); //取得原圖的數據區寬
height=this->GetHeight (); //取得原圖的數據區高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
BYTE* p_temp=new BYTE[wide*height];
int size=wide*height;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周圍8近鄰均值
averg=(int)(p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8;
if(abs(p_temp[j*wide+i]-averg)>T)
p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);
delete p_temp;
}
else //24位彩色
{
BYTE* p_temp=new BYTE[wide*height*3];
int size=wide*height*3;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近鄰均值進行濾波
for(int j=1;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -