?? biantidib.cpp
字號:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "BianTiDib.h"
#include "MainFrm.h"
#include "DynSplitView2.h"
BianTiDib::BianTiDib()
{
}
BianTiDib::~BianTiDib()
{
}
///***************************************************************/
/*函數名稱:Xihua()
/*函數類型:void
/*功能:對圖像進行細化處理。
/***************************************************************/
void BianTiDib::Xihua()
{
// 循環變量
LONG i;
LONG j;
LONG m;
LONG n;
// 5×5相鄰區域像素值
unsigned char S[5][5];
// 計數器
unsigned char Num;
// 循環跳出標志
BOOL fp=TRUE;
// 指向DIB象素指針
LPBYTE p_data;
// 指向源圖像的指針
LPBYTE lpSrc;
// 指向緩存圖像的指針
LPBYTE lpDst;
// 指向緩存DIB圖像的指針
LPBYTE temp;
// 找到DIB圖像象素起始位置
p_data = this->GetData ();
if(m_pBitmapInfoHeader->biBitCount<9)//灰度圖像
{
// DIB的寬度
LONG wide = this->GetWidth ();
// DIB的高度
LONG height = this->GetHeight ();
// 暫時分配內存,以保存新圖像
temp = new BYTE [wide *height];
// 初始化新分配的內存,設定初始值為255
lpDst = temp;
memset(lpDst, (BYTE)255, wide * height);
while (fp)
{
fp = FALSE;
// 初始化新分配的內存,設定初始值為255
lpDst = temp;
memset(lpDst, (BYTE)255, wide * height);
// 由于使用5×5的結構元素,為防越界,不處理外圍的2行、2列像素
for (j = 2; j < height - 2; j++)
{
for (i = 2 ; i < wide - 2 ; i ++)
{
// 指向源圖像倒數第j行,第i個象素的指針
lpSrc = (LPBYTE)(p_data + wide *j + i);
// 指向目標圖像倒數第j行,第i個象素的指針
lpDst = (LPBYTE)(temp + wide * j + i);
// 如果源圖像中當前點為白色,則跳過
if (*lpSrc > 127)
continue;
// 獲得當前點相鄰的5×5區域內像素值,白色用0代表,黑色用1代表
for (m = 0; m < 5; m++)
{
for (n = 0; n < 5; n++)
{
if (*(lpSrc + (2- m) * wide + (n - 2)*2 ) > 127)
S[m][n] = 0;
else
S[m][n] = 1;
}
}
// 判斷條件一是否成立:
Num = S[1][1] + S[1][2] + S[1][3] + S[2][1]
+ S[2][3] + S[3][1] + S[3][2] + S[3][3];
if (Num < 2 || Num >6)
{
*lpDst = 0;
continue;
}
// 判斷條件二是否成立:
Num = 0;
if (S[1][2] == 0 && S[1][1] == 1)
Num++;
if (S[1][1] == 0 && S[2][1] == 1)
Num++;
if (S[2][1] == 0 && S[3][1] == 1)
Num++;
if (S[3][1] == 0 && S[3][2] == 1)
Num++;
if (S[3][2] == 0 && S[3][3] == 1)
Num++;
if (S[3][3] == 0 && S[2][3] == 1)
Num++;
if (S[2][3] == 0 && S[1][3] == 1)
Num++;
if (S[1][3] == 0 && S[1][2] == 1)
Num++;
if (Num != 1)
{
*lpDst = 0;
continue;
}
// 判斷條件三是否成立;
if (S[1][2] * S[2][1] * S[2][3] != 0)
{
Num = 0;
if (S[0][2] == 0 && S[0][1] == 1)
Num++;
if (S[0][1] == 0 && S[1][1] == 1)
Num++;
if (S[1][1] == 0 && S[2][1] == 1)
Num++;
if (S[2][1] == 0 && S[2][2] == 1)
Num++;
if (S[2][2] == 0 && S[2][3] == 1)
Num++;
if (S[2][3] == 0 && S[1][3] == 1)
Num++;
if (S[1][3] == 0 && S[0][3] == 1)
Num++;
if (S[0][3] == 0 && S[0][2] == 1)
Num++;
if (Num == 1)
{
*lpDst = 0;
continue;
}
}
// 判斷條件四是否成立:
if (S[1][2] * S[2][1] * S[3][2] != 0)
{
Num = 0;
if (S[1][1] == 0 && S[1][0] == 1)
Num++;
if (S[1][0] == 0 && S[2][0] == 1)
Num++;
if (S[2][0] == 0 && S[3][0] == 1)
Num++;
if (S[3][0] == 0 && S[3][1] == 1)
Num++;
if (S[3][1] == 0 && S[3][2] == 1)
Num++;
if (S[3][2] == 0 && S[2][2] == 1)
Num++;
if (S[2][2] == 0 && S[1][2] == 1)
Num++;
if (S[1][2] == 0 && S[1][1] == 1)
Num++;
if (Num == 1)
{
*lpDst = 0;
continue;
}
}
// 如果條件均滿足則刪除該點
*lpDst = 255;
fp = TRUE;
}
}
// 復制細化后的圖像
memcpy(p_data, temp, wide * height);
}
// 復制細化后的圖像
memcpy(p_data, temp, wide * height);
// 釋放內存
delete temp ;
}
else//24位真彩色
{
// DIB的寬度
LONG wide = this->GetDibWidthBytes();
// DIB的高度
LONG height = this->GetHeight ();
// 暫時分配內存,以保存新圖像
temp = new BYTE [wide *height];
// 初始化新分配的內存,設定初始值為255
lpDst = temp;
memset(lpDst, (BYTE)255, wide * height);
while (fp)
{
fp = FALSE;
// 初始化新分配的內存,設定初始值為255
lpDst = temp;
memset(lpDst, (BYTE)255, wide * height);
// 由于使用5×5的結構元素,為防越界,不處理外圍的2行、2列像素
for (j = 2; j < height - 2; j++)
{
for (i = 2 *3; i < wide - 2 *3; i=i +3)
{
// 指向源圖像倒數第j行,第i個象素的指針
lpSrc = (LPBYTE)(p_data + wide *j + i);
// 指向目標圖像倒數第j行,第i個象素的指針
lpDst = (LPBYTE)(temp + wide * j + i);
// 如果源圖像中當前點為白色,則跳過
if (*lpSrc > 245)
continue;
// 獲得當前點相鄰的5×5區域內像素值,白色用0代表,黑色用1代表
for (m = 0; m < 5; m++)
{
for (n = 0; n < 5; n++)
{
if (*(lpSrc + (2- m) * wide + (n - 2)*3 ) > 245)
S[m][n] = 0;
else
S[m][n] = 1;
}
}
// 判斷條件一是否成立:
Num = S[1][1] + S[1][2] + S[1][3] + S[2][1]
+ S[2][3] + S[3][1] + S[3][2] + S[3][3];
if (Num < 2 || Num >6)
{
*lpDst = 0;
*(lpDst+1) = 0;
*(lpDst+2) = 0;
continue;
}
// 判斷條件二是否成立:
Num = 0;
if (S[1][2] == 0 && S[1][1] == 1)
Num++;
if (S[1][1] == 0 && S[2][1] == 1)
Num++;
if (S[2][1] == 0 && S[3][1] == 1)
Num++;
if (S[3][1] == 0 && S[3][2] == 1)
Num++;
if (S[3][2] == 0 && S[3][3] == 1)
Num++;
if (S[3][3] == 0 && S[2][3] == 1)
Num++;
if (S[2][3] == 0 && S[1][3] == 1)
Num++;
if (S[1][3] == 0 && S[1][2] == 1)
Num++;
if (Num != 1)
{
*lpDst = 0;
*(lpDst+1) = 0;
*(lpDst+2) = 0;
continue;
}
// 判斷條件三是否成立;
if (S[1][2] * S[2][1] * S[2][3] != 0)
{
Num = 0;
if (S[0][2] == 0 && S[0][1] == 1)
Num++;
if (S[0][1] == 0 && S[1][1] == 1)
Num++;
if (S[1][1] == 0 && S[2][1] == 1)
Num++;
if (S[2][1] == 0 && S[2][2] == 1)
Num++;
if (S[2][2] == 0 && S[2][3] == 1)
Num++;
if (S[2][3] == 0 && S[1][3] == 1)
Num++;
if (S[1][3] == 0 && S[0][3] == 1)
Num++;
if (S[0][3] == 0 && S[0][2] == 1)
Num++;
if (Num == 1)
{
*lpDst = 0;
*(lpDst+1) = 0;
*(lpDst+2) = 0;
continue;
}
}
// 判斷條件四是否成立:
if (S[1][2] * S[2][1] * S[3][2] != 0)
{
Num = 0;
if (S[1][1] == 0 && S[1][0] == 1)
Num++;
if (S[1][0] == 0 && S[2][0] == 1)
Num++;
if (S[2][0] == 0 && S[3][0] == 1)
Num++;
if (S[3][0] == 0 && S[3][1] == 1)
Num++;
if (S[3][1] == 0 && S[3][2] == 1)
Num++;
if (S[3][2] == 0 && S[2][2] == 1)
Num++;
if (S[2][2] == 0 && S[1][2] == 1)
Num++;
if (S[1][2] == 0 && S[1][1] == 1)
Num++;
if (Num == 1)
{
*lpDst = 0;
*(lpDst+1) = 0;
*(lpDst+2) = 0;
continue;
}
}
// 如果條件均滿足則刪除該點
*lpDst = 255;
*(lpDst+1) = 255;
*(lpDst+2) = 255;
fp = TRUE;
}
}
// 復制細化后的圖像
memcpy(p_data, temp, wide * height);
}
// 復制細化后的圖像
memcpy(p_data, temp, wide * height);
// 釋放內存
delete temp ;
}
}
///***************************************************************/
/*函數名稱:Cuhua()
/*函數類型:void
/*功能:對圖像進行粗化處理。
/***************************************************************/
void BianTiDib::Cuhua()
{
// 循環變量
LONG i;
LONG j;
// 指向DIB象素指針
LPBYTE p_data;
// 找到DIB圖像象素起始位置
p_data = this->GetData();
if(m_pBitmapInfoHeader->biBitCount<9)//灰度圖像
{
// DIB的寬度
LONG wide = GetWidth();
// DIB的高度
LONG height = GetHeight();
// 對各像素進行灰度轉換
for (j = 0; j < height; j ++)
{
for (i = 0; i < wide; i ++)
{
// 對像素各顏色分量進行二值化求補處理
unsigned char temp = *((unsigned char *)p_data + wide * j +i);
if (temp > 127)
*((unsigned char *)p_data + wide * j + i) = 0;
else
*((unsigned char *)p_data + wide * j + i) = 255;
}
}
// 在求補后再對圖象進行細化
Xihua();
}
else//24位真彩色
{
// DIB的寬度
LONG wide = GetDibWidthBytes();
// DIB的高度
LONG height = GetHeight();
// 對各像素進行灰度轉換
for (j = 0; j < height; j ++)
{
for (i = 0; i < wide; i ++)
{
// 對像素各顏色分量進行二值化求補處理
unsigned char temp = *((unsigned char *)p_data + wide * j +i);
if (temp > 127)
*((unsigned char *)p_data + wide * j + i) = 0;
else
*((unsigned char *)p_data + wide * j + i) = 255;
}
}
// 在求補后再對圖象進行細化
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -