灰度图像二值化-----c++实现
2013-08-13 19:38
246 查看
前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣。。所以现在没事,继续更新。。这次简单的写了灰度图像二值化。。这是什么概念呢?
相信大家看到这里应该觉得很简单吧。。二值化就是把原来灰度图像中每个像素的值要么变成255(白色),要么变为0(黑色)。(
代码:
这里我就不解释了。看了前几篇文章肯定觉的very easy....
效果:
原图:
二值图:
MY QUESTION:上面说了二值化就是变成二值化图像,而我在网上查了资料说二值化图像像素的大小是1位,这就和上面说的不符合了,应该上面介绍的是还是8位。所以我就有些不懂了。。希望大神可以给我解释解释....
图像的二值化的基本原理
图像的二值化处理就是将图像上的点的灰度置为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 ,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位。所以我就有些不懂了。。希望大神可以给我解释解释....
相关文章推荐
- 灰度图像二值化-----c++实现
- Opencv实现图像的灰度处理,二值化,阀值选择
- C++基于Directx MMX实现的图像灰度转换代码
- 基于c#图像灰度化、灰度反转、二值化的实现方法详解
- C++ OpenCV 实现RGB彩色图像转化成灰度图像再转换成二值图像
- MFC下实现 灰度图像显示函数代码 C++
- Opencv实现图像的灰度处理,二值化,阀值选择
- 利用数组操作实现灰度图像放大两倍(C++&opencv)
- 最近邻图像旋转代码 灰度图像 c++实现
- 利用最大熵进行阈值分割从而实现灰度图像的二值化的原理概要及OpenCV代码
- 经典的变分法图像去噪的C++实现
- 灰度图像形状的识别分类算法实现matlab
- 利用opencv2和c++实现视频与图像的互相转换
- 【IOS】OpenCV摄像头实时图像处理(灰度,二值化,轮廓检测)
- 数字图像处理,自适应中值滤波的C++实现
- 图像的高斯平滑C++实现
- [转]opencv3 图像处理 之 图像缩放( python与c++实现 )
- Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现
- 图像旋转c++实现
- 【图像特征提取12】OpenCv的SIFT图像局部特征提取描述算法C++代码的实现