灰度图像二值化-----c++实现

前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣。。所以现在没事,继续更新。。这次简单的写了灰度图像二值化。。这是什么概念呢?

图像的二值化的基本原理

   图像的二值化处理就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。

 

相信大家看到这里应该觉得很简单吧。。二值化就是把原来灰度图像中每个像素的值要么变成255(白色),要么变为0(黑色)。(

代码:

#include<iostream>
#include <Windows.h>

using namespace std;


void main()
{
	int threshold=200;
	FILE* stream=fopen("D:\\6.bmp","rb");
	if(stream==NULL)
	{
		cout<<"文件不存在"<<endl;
		return;
	}
	
	int sizeFileHeader=sizeof(BITMAPFILEHEADER);
	int sizeInfoHeader=sizeof(BITMAPINFOHEADER);
	
	BITMAPFILEHEADER* bitmapFileHeader=new BITMAPFILEHEADER[sizeFileHeader+1];
	
	BITMAPINFOHEADER* bitmapInfoHeader=new BITMAPINFOHEADER[sizeInfoHeader+1];
	
	memset(bitmapFileHeader,0,sizeFileHeader+1);
	memset(bitmapInfoHeader,0,sizeInfoHeader+1);
	fread(bitmapFileHeader,sizeof(char),sizeFileHeader,stream);
	fseek(stream,sizeFileHeader,0);
	fread(bitmapInfoHeader,sizeof(char),sizeInfoHeader,stream);
	fseek(stream,sizeInfoHeader+sizeFileHeader,0);
	RGBQUAD* pRgbQuards=new RGBQUAD[256];
	for (int k=0;k<256;k++)
	{
		fread(&pRgbQuards[k],sizeof(RGBQUAD),1,stream);
	}
	
	int count=(((bitmapInfoHeader->biWidth)*8+31)/32)*4-bitmapInfoHeader->biWidth*(bitmapInfoHeader->biBitCount/8);
	BYTE* tempData=new BYTE[count+1];
	memset(tempData,0,count+1);
	fseek(stream,sizeFileHeader+sizeInfoHeader+256*sizeof(RGBQUAD),0);
	BYTE** data=new BYTE*[bitmapInfoHeader->biHeight];
	for(int i=0;i<bitmapInfoHeader->biHeight;i++)
	{
		data[i]=new BYTE[bitmapInfoHeader->biWidth];
		for (int j=0;j<bitmapInfoHeader->biWidth;j++)
		{
			fread(&data[i][j],sizeof(char),1,stream);
			if(data[i][j]>threshold)
				data[i][j]=255;
			else
				data[i][j]=0;
		}
		for (int n=0;n<count;n++)
		{
			fread(&tempData[n],sizeof(char),1,stream);
		}
	}
	
	fclose(stream);
	


	//写入。。
	FILE* fileWrite=fopen("D:\\9.bmp","a+");
	fwrite(bitmapFileHeader,sizeof(char),sizeof(BITMAPFILEHEADER),fileWrite);
	fwrite(bitmapInfoHeader,sizeof(char),sizeof(BITMAPINFOHEADER),fileWrite);
	fwrite(pRgbQuards,sizeof(RGBQUAD),256,fileWrite);

	for(int i=0;i<bitmapInfoHeader->biHeight;i++)
	{
		for(int j=0;j<bitmapInfoHeader->biWidth;j++)
		{
			fwrite(&data[i][j],sizeof(BYTE),1,fileWrite);
		}
		for(int m=0;m<count;m++)
			fwrite(&tempData[m],sizeof(char),1,fileWrite);
	}
	fclose(fileWrite);

	cout<<"success"<<endl;
}


这里我就不解释了。看了前几篇文章肯定觉的very easy....

效果:

原图:

二值图:

 

MY QUESTION:上面说了二值化就是变成二值化图像,而我在网上查了资料说二值化图像像素的大小是1位,这就和上面说的不符合了,应该上面介绍的是还是8位。所以我就有些不懂了。。希望大神可以给我解释解释....
  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值