📄 morphologicalprocessing.cpp
字号:
#include"stdAfx.h"
#include"MorphologicalProcessing.h"
void MorphologicalOpen(LPSTR lpDIBBits,LONG width,LONG height)
{
LPSTR lpDst;
LONG LineBytes=(width*8+31)/32*4;
LONG i,j,m,n;
BYTE max,min;
HLOCAL hNewDIB=LocalAlloc(LHND,LineBytes*height);
lpDst=(LPSTR)LocalLock(hNewDIB);
memcpy(lpDst,lpDIBBits,LineBytes*height);
int diameter,radius;
diameter=30;
radius=diameter/2;
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
min=lpDIBBits[i*LineBytes+j];
for(m=-radius;m<radius+1;m++)
for(n=-radius;n<radius+1;n++)
{
if(m*m+n*n<=radius*radius)
{
if(i+m>-1&&i+m<height)
{
if(j+n>-1&&j+n<width)
{
if(min>lpDIBBits[(i+m)*LineBytes+(j+n)])
min=lpDIBBits[(i+m)*LineBytes+(j+n)];
}
}
}
}
lpDst[i*LineBytes+j]=min;
}
}
/* for(i=0;i<height;i++)
for(j=0;j<width;j++)
lpDIBBits[i*LineBytes+j]=lpDst[i*LineBytes+j];
*/
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
max=lpDst[i*LineBytes+j];
for(m=-radius;m<radius+1;m++)
for(n=-radius;n<radius+1;n++)
{
if(m*m+n*n<=radius*radius)
{
if(i+m>=0&&i+m<height)
if(j+n>=0&&j+n<width)
{
if(max<lpDst[(i+m)*LineBytes+(j+n)])
max=lpDst[(i+m)*LineBytes+(j+n)];
}
}
}
lpDIBBits[i*LineBytes+j]=max;
}
}
void MorphologicalClose(LPSTR lpDIBBits,LONG width,LONG height)
{
LPSTR lpDst;
LONG LineBytes=(width*8+31)/32*4;
LONG i,j,m,n;
BYTE max,min;
HLOCAL hNewDIB=LocalAlloc(LHND,LineBytes*height);
lpDst=(LPSTR)LocalLock(hNewDIB);
memcpy(lpDst,lpDIBBits,LineBytes*height);
int diameter,radius;
diameter=50;
radius=diameter/2;
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
max=lpDIBBits[i*LineBytes+j];
for(m=-radius;m<radius+1;m++)
for(n=-radius;n<radius+1;n++)
{
if(m*m+n*n<=radius*radius)
{
if(i+m>=0&&i+m<height)
{
if(j+n>=0&&j+n<width)
{
if(max<lpDIBBits[(i+m)*LineBytes+(j+n)])
max=lpDIBBits[(i+m)*LineBytes+(j+n)];
}
}
}
}
lpDst[i*LineBytes+j]=max;
}
}
/* for(i=0;i<height;i++)
for(j=0;j<width;j++)
lpDIBBits[i*LineBytes+j]=lpDst[i*LineBytes+j];
*/
for(i=0;i<height;i++)
for(j=0;j<width;j++)
{
min=lpDst[i*LineBytes+j];
for(m=-radius;m<radius+1;m++)
for(n=-radius;n<radius+1;n++)
{
if(m*m+n*n<=radius*radius)
{
if(i+m>=0&&i+m<height)
if(j+n>=0&&j+n<width)
{
if(min>lpDst[(i+m)*LineBytes+(j+n)])
min=lpDst[(i+m)*LineBytes+(j+n)];
}
}
}
lpDIBBits[i*LineBytes+j]=min;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -