⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydib.cpp

📁 读入一个标准图像格式文件(JPG,BMP,TIFF等)并显示出来。利用直方图技术实现图像的增强并存储这幅图像。比较与原图像的区别
💻 CPP
字号:
#include "stdafx.h"
#include "mydib.h"

/*************************************************************************
					      方块编码子程序
*************************************************************************/
void rectcoding(HDIB hDIB,int wRect,int hRect)
{
	// 指向源图像象素的指针
	unsigned char *	lpSrc;
	
	// 指向DIB的指针
	LPSTR	lpDIB;

	// 指向DIB象素指针
	LPSTR   lpDIBBits;
	
	//锁定并获得位图句柄的地址
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的模糊操作,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		::AfxMessageBox ("目前只支持256色位图的运算!");
		
		// 返回
		return;
	}

	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	//图像处理操作

	//方块编码

	//获得图像的宽度和高度
	LONG lWidth=::DIBWidth ((char*)lpDIB);
	LONG lHeight=::DIBHeight ((char*)lpDIB);

	// 计算图像每行的字节数
	LONG lLineBytes = WIDTHBYTES(lWidth * 8);

	if(lWidth!=lHeight)
	{
		// 提示用户
		::AfxMessageBox("只能对宽度和高度相等的图像进行方块编码!");

		// 返回
		return;
	}

	//编码过程

	//循环变量
	LONG i,j,k;
	int ii,jj;
	double* Xt=new double [lWidth*lHeight/(hRect*wRect)];
	int Xi;
	int* a0=new int [lWidth*lHeight/(hRect*wRect)];
	int* a1=new int [lWidth*lHeight/(hRect*wRect)];
	int* N0=new int [lWidth*lHeight/(hRect*wRect)];
	int* N1=new int [lWidth*lHeight/(hRect*wRect)];

	//计算阈值
	k=0;
	for (i = 0; i < lHeight; i =i+hRect)
	{
		for (j = 0; j < lWidth; j =j+wRect)
		{
			Xt[k]=0;
			//计算Xt
			for(ii=0;ii<hRect;ii++)
				for(jj=0;jj<wRect;jj++)
				{   // 指向图像指针
					lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
					Xi=*lpSrc;
					Xt[k]+=Xi;
				}	
			Xt[k]/=hRect*wRect;
			k++;	
		}		
	}

	//计算N0、N1
	k=0;
	for (i = 0; i < lHeight; i =i+hRect)
	{
		for (j = 0; j < lWidth; j =j+wRect)
		{
			N0[k]=0;
			N1[k]=0;
			//计算N0、N1
			for(ii=0;ii<hRect;ii++)
				for(jj=0;jj<wRect;jj++)
				{   // 指向图像指针
					lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
					Xi=*lpSrc;
					if(Xi<Xt[k]) N0[k]++;
					else N1[k]++;
				}	
			k++;	
		}	
	}

	//计算a0、a1
	k=0;
	for (i = 0; i < lHeight; i =i+hRect)
	{
		for (j = 0; j < lWidth; j =j+wRect)
		{
			a0[k]=0;
			a1[k]=0;
			//计算N0、N1
			for(ii=0;ii<hRect;ii++)
				for(jj=0;jj<wRect;jj++)
				{   // 指向图像指针
					lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
					Xi=*lpSrc;
					if(Xi<Xt[k]) a0[k]+=Xi;
					else a1[k]+=Xi;
				}	
			if(N0[k]!=0&&N1[k]!=0)
			{	a0[k]/=N0[k];
				a1[k]/=N1[k];
			}	
			k++;	
		}		
	}

	//二值化编码过程
	k=0;
	for (i = 0; i < lHeight; i =i+hRect)
	{
		for (j = 0; j < lWidth; j =j+wRect)
		{
			for(ii=0;ii<hRect;ii++)
				for(jj=0;jj<wRect;jj++)
				{   // 指向图像指针
					lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
					Xi=*lpSrc;
					if(Xi<Xt[k]) Xi=a0[k];
					else Xi=a1[k];
					//赋新的像素值给像素
					*lpSrc=Xi;
				}		
			k++;	
		}		
	}
	::GlobalUnlock((HGLOBAL) hDIB);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -