灰度图像二值化-----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位。所以我就有些不懂了。。希望大神可以给我解释解释....
灰度图像二值化-----c++实现的更多相关文章
- c#数字图像处理(二)彩色图像灰度化,灰度图像二值化
为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上.24位彩色图像每个像素用3个字节表示,每个字节对应着R.G.B分量的亮度(红.绿 ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- c#图像灰度化、灰度反转、二值化
图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*25 ...
- day5 二值化
1.otsu二值化 # coding=utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt #1.读入图像 ...
- 实现图像的二值化(java+opencv)
书里的解释: 其他的没找到什么资料,直接参考百度百科 https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E4%BA%8C%E5%80%BC%E5%8C%9 ...
- [iOS OpenCV的使用,灰度和二值化]
看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使 ...
- 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字
用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...
- 图像处理------基于Otsu阈值二值化
一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值 ...
随机推荐
- Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
E. Bear and Square Grid 题目连接: http://www.codeforces.com/contest/680/problem/E Description You have a ...
- 从零开始搭建linux下laravel 5.5所需环境(三)
好的,我们已经安装好了nginx+mysql+php了,打开[ Laravel 5.5 文档 ] 快速入门 —— 安装配置篇 我们看到这里需要安装Composer,好的,我们现在就来安装Compose ...
- 2007 Audi A4 INSTRUMENT CLUSTER WIRING DIAGRAM
BOSCH RB8 8E0920 951G I found the answer by myself...... Here is what it's work for me. GREEN CONNEC ...
- PHP中的 变量 与 常量 详解
几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不 ...
- ARCGIS将WGS84坐标投影到高斯平面
将WGS84坐标投影到平面,一般採用的是UTM(通用横轴莫卡托投影).该方式多用于美国地区,而我国多用北京54和西安80高斯克吕格投影坐标.假如我们想把影像採用高斯克吕格投影到在平面上,而ARCGIS ...
- Spring-Bean配置-使用外部属性文件(转)
Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...
- Linux 防火墙 iptables基本操作
1:临时性关闭开启防火墙,重启后失效开启service iptables start关闭service iptables stop/etc/rc.d/init.d/iptables stop 2:永久 ...
- JS动态改变select选择变更option的index值
document.getElementById("louyuming").options[0].selected=true; function jsSelectIsExitItem ...
- java 数据流的处理
字节流类 功能简单介绍 DataInputStream 包含了读取Java标准数据类型的输入流 DataOutputStream 包含了写Java标准数据类型的输出流 ByteArrayInputSt ...
- JQuery实战--能够编辑的表格
廊坊下雪了.15年的第二场雪.比14的来的稍晚一些.停靠在11教门前的自行车.成了廊坊师范学院最漂亮的风景线.还记得以前学习css的时候.就以前接触过怎样编写设计一些表格和表单的样式,比如怎样设计表格 ...