📄 spacefilter.cpp
字号:
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
// 计数清零
R = G = B = 0;
// 进行小区域模版滤波
for (k = i - (int)(lpKernel->Dimention / 2); k < i + (int)(lpKernel->Dimention / 2) + 1; k++)
{
for(l = j - (int)(lpKernel->Dimention / 2); l < j + (int)(lpKernel->Dimention / 2) + 1; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
unsigned char TR = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
R += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TR;
unsigned char TG = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
G += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TG;
unsigned char TB = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
B += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TB;
}
}
}
// 进行模版平均
R /= lpKernel->Divisor;
G /= lpKernel->Divisor;
B /= lpKernel->Divisor;
// 存储计算结果到中间缓存
*(m_temp + j * lLineBytes + i * 3) = R;
*(m_temp + j * lLineBytes + i * 3 + 1) = G;
*(m_temp + j * lLineBytes + i * 3 + 2) = B;
}
}
// 将转换后的中间缓存数据回存到DIB
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
LocalUnlock(hLocal);
LocalFree(hLocal);
// 恢复光标
EndWaitCursor();
}
/*************************************************************************
*
* 函数名称:
* MedianFilter()
*
* 参数:
* HDIB hDIB - 待处理的DIB
*
* 返回值:
* 无返回值
*
* 说明:
* 该函数将彩色位图进行中值滤波处理
*
************************************************************************/
void CSpaceFilter::MedianFilter(HDIB hDIB)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 掩码模版
unsigned char mask_r[9];
unsigned char mask_g[9];
unsigned char mask_b[9];
COLORREF mask[9];
// 指向DIB的指针
LPBYTE lpDIB;
// 指向DIB象素指针
LPBYTE lpDIBBits;
// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);
// 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB);
// 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24);
// 申请并分配中间缓存
HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
if (hLocal == NULL)
return;
LPBYTE m_temp = (LPBYTE)LocalLock(hLocal);
// 复制图象数据到中间缓存
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
}
}
// 模版滤波
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
// 索引
int id = 0;
// 进行小区域模版滤波
for (k = i - 1; k < i + 2; k++)
{
for(l = j - 1; l < j + 2; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
mask_r[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
mask_g[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
mask_b[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
mask[id] = RGB(mask_r[id], mask_g[id], mask_b[id]);
id++;
}
}
}
// 中间变量
unsigned char T;
// 冒泡排序法
for (k = 0; k < 8; k++)
{
for (l = 8; l > k; l--)
{
if (mask_r[l] < mask_r[l - 1])
{
T = mask_r[l];
mask_r[l] = mask_r[l - 1];
mask_r[l - 1] = T;
}
if (mask_g[l] < mask_g[l - 1])
{
T = mask_g[l];
mask_g[l] = mask_g[l - 1];
mask_g[l - 1] = T;
}
if (mask_b[l] < mask_b[l - 1])
{
T = mask_b[l];
mask_b[l] = mask_b[l - 1];
mask_b[l - 1] = T;
}
}
}
m_temp[j * lLineBytes + i * 3] = mask_r[4];
m_temp[j * lLineBytes + i * 3 + 1] = mask_g[4];
m_temp[j * lLineBytes + i * 3 + 2] = mask_b[4];
}
}
// 将转换后的中间缓存数据回存到DIB
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
LocalUnlock(hLocal);
LocalFree(hLocal);
// 恢复光标
EndWaitCursor();
}
/*************************************************************************
*
* 函数名称:
* OverRun()
*
* 参数:
* HDIB hDIB - 待处理的DIB
* LPKERNEL lpKernel - 获取指向KERNEL结构对象的指针
* int T - 超限阀值
*
* 返回值:
* 无返回值
*
* 说明:
* 该函数位图进行超限模版滤波处理
*
************************************************************************/
void CSpaceFilter::OverRun(HDIB hDIB, LPKERNEL lpKernel, int T)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 临时变量
LONG R, G, B;
LONG MR, MG, MB;
// 指向DIB的指针
LPBYTE lpDIB;
// 指向DIB象素指针
LPBYTE lpDIBBits;
// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);
// 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB);
// 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24);
// 申请并分配中间缓存
HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
if (hLocal == NULL)
return;
LPBYTE m_temp = (LPBYTE)LocalLock(hLocal);
// 复制图象数据到中间缓存
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
}
}
// 模版滤波
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
// 计数清零
R = G = B = 0;
// 进行小区域模版滤波
for (k = i - (int)(lpKernel->Dimention / 2); k < i + (int)(lpKernel->Dimention / 2) + 1; k++)
{
for(l = j - (int)(lpKernel->Dimention / 2); l < j + (int)(lpKernel->Dimention / 2) + 1; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
unsigned char TR = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
unsigned char TG = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
unsigned char TB = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
if (k == i && l == j)
{
MR = TR;
MG = TG;
MB = TB;
}
R += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TR;
G += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TG;
B += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TB;
}
}
}
// 进行模版平均
R /= lpKernel->Divisor;
G /= lpKernel->Divisor;
B /= lpKernel->Divisor;
// 进行超闲限判断
if (abs(MR - R) > T)
MR = R;
if (abs(MG - G) > T)
MG = G;
if (abs(MB - B) > T)
MB = B;
// 存储计算结果到中间缓存
*(m_temp + j * lLineBytes + i * 3) = MR;
*(m_temp + j * lLineBytes + i * 3 + 1) = MG;
*(m_temp + j * lLineBytes + i * 3 + 2) = MB;
}
}
// 将转换后的中间缓存数据回存到DIB
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
j++;
*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
}
}
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
LocalUnlock(hLocal);
LocalFree(hLocal);
// 恢复光标
EndWaitCursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -