morphologicalprocessing.cpp

来自「matlab版图像数字处理这本书的配套代码」· C++ 代码 · 共 136 行

CPP
136
字号
#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 + =
减小字号Ctrl + -
显示快捷键?