文章参考网址:http://www.voidcn.com/blog/suifeng50/article/p-4907477.html

#include "opencv2\highgui\highgui.hpp"

#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\core\core.hpp"
#include <Windows.h>
 #include<fstream>
#include<iostream>
#include <ctime>
using namespace cv;
using namespace std;

int  mat_to_binary( const  cv::Mat img,  int  line_byte,  char * data)
{
int  width = img.cols;
int  height = img.rows;
size_t  line_size = line_byte * 8;
size_t  bit_size = line_size * height;

char  *p = data;  int  offset, v; unsigned  char  temp;
for ( int  row=height-1; row>=0; row-- ) {       
for  ( int  col=0; col<width; col++ ) {  
offset = col % 8;
v = img.at<uchar>(row, col);
temp = 1;
temp = temp << (8 - offset -1);
if (v == 255 ) {                
*(p + col/8) |= temp;
}  else  {
temp = ~temp;
*(p + col/8) &= temp;
}
}
for ( int  j = width/8 ; j < line_byte; j++)
p[j] = 0;
p = p + line_byte;
}
return  0;
}

int  save_bmp_image( const  cv::Mat img, std::string dst) 
{
int  width = img.cols;
int  height = img.rows;
const  int  biBitCount = 1;

//颜色表大小,以字节为单位,灰度图像颜色表为256*4字节,彩色图像颜色表大小为0,二值图为2*4
int  color_type_num = 2;
int  colorTablesize = color_type_num *  sizeof (RGBQUAD);
RGBQUAD *pColorTable =  new  RGBQUAD[color_type_num];
for ( int  i = 0; i < color_type_num; i++) {
pColorTable[i].rgbBlue = i*255;
pColorTable[i].rgbRed  = i*255;
pColorTable[i].rgbGreen= i*255;
pColorTable[i].rgbReserved = 0;
}

//待存储图像数据每行字节数为4的倍数
int  line_byte = (width * biBitCount/8+3)/4*4;
char * p_data = ( char *) malloc (line_byte*height);
mat_to_binary(img, line_byte, p_data);

std::ofstream fp(dst.c_str(), std::ios::binary | std::ios::out);

if (!fp.is_open()) {
// cout <<  "open "  << dst << " failed!"  << endl;
return  -1;
}

//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;   //bmp类型

fileHead.bfSize=  sizeof (BITMAPFILEHEADER) +  sizeof (BITMAPINFOHEADER)\
+ colorTablesize + line_byte*height;               //bfSize是图像文件4个组成部分之和
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;    
fileHead.bfOffBits = 54+colorTablesize;               //bfOffBits是图像文件前3个部分所需空间之和

fp.write(( char *)&fileHead,  sizeof (BITMAPFILEHEADER)); //写文件头进文件

//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head; 
head.biBitCount = biBitCount;
head.biClrImportant = 0;
head.biClrUsed = 0;
head.biCompression = 0;
head.biHeight = height;
head.biPlanes = 1;
head.biSize = 40;
head.biSizeImage = line_byte*height;
head.biWidth = width;
head.biXPelsPerMeter = 0;
head.biYPelsPerMeter = 0;

//写位图信息头进内存  
fp.write(( char *)&head,  sizeof (BITMAPINFOHEADER));

//颜色表,写入文件 
fp.write(( char *)pColorTable,  sizeof (RGBQUAD)*color_type_num);

//写位图数据进文件pBmpBuf
fp.write(( char *)p_data, height*line_byte);
fp.close();

delete  []pColorTable;
delete  []p_data;
return  0;
}

int main()
{

clock_t start,finish;  
start=clock();  
//cout << "HW .... " << endl;  
 
Mat src=imread("E:\\Image\\0_1.bmp",0);//加载图像
   
string dst="E:\\Image\\2.bmp";//存放生成1位位图的路径

int a;

a=save_bmp_image( src, dst) ;
finish=clock(); 
cout << finish-start   << "/" << CLOCKS_PER_SEC  << " (s) "<< endl;

cout <<a<<endl;
cout <<dst<<endl;

}

将图像转换为1位位图 (1像素对应1bit)相关推荐

  1. 将图像转换为8位单通道_数字图像存储

    微信公众号:枫叶AI,专注计算机视觉,机器学习,人工智能等 数字化图像数据有两种存储方式:位图存储(Bitmap)和矢量存储(Vector).位图图像又称作点阵图像.位映射图像,它是由一系列像素组成的 ...

  2. labelme 标注生成24位深度图像转换为8位

    新版本的 labelme 标注完成图像后,将 json 文件转换为图像时已经转换为 8 通道图像,如下图所示: 最近在看别人程序时发现经过图像标注生成的 label 一片黑,且图像深度为 24 位,如 ...

  3. python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...

    语义.实例分割数据集的标注图像以及一些深度图像等都是由单通道16位整型图像存储的,我们通常需要读取这种图像并显示出来,由于OpenCV一般只能够对8位图像进行显示,也就是像素范围在0-255的图像,而 ...

  4. python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...

    上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...

  5. python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片

    本文介绍如何使用python将图片转换为纯黑白的单通道图片.文中用到的脚本支持彩色.灰度.带alpha通道的输入图片以及SVG矢量图,支持调整输出图片大小以及设置灰度阈值. 最后介绍如何输出SSD13 ...

  6. 【笔记】位图(.bmp)和矢量图(Vector):位图是点阵图或光栅图,使用像素的一格一格来描述图像,放大以后每一个像素看就像是一个个的马赛克;矢量图是使用直线和曲线来描述图形,可以无限方法,不会失真

    一.什么是位图 计算机能以位图和矢量图格式显示图像. 1.位图(Bitmap): 图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像.计算机屏幕其实就是一张包含大 ...

  7. 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色

    12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 import sys import pygame def run_game():pygame.init()screen = pygame. ...

  8. python将png图像RGB模式转换为L模式(24位转换为8位)

    我的目的是想要把P模式的图像转换为L模式,那么必须先转换为RGB模式,再转换为L模式. P模式为2位深度,RGB为24位深度,L为8位深度. 以下是转换的代码: im = Image.open(tes ...

  9. 使用GDI+将24位真彩色图像转换为8位灰度图像

    在图像处理中,我们经常需要将真彩色图像转换为黑白图像.黑白图像即为灰度图,即只有纯黑,纯白两种颜色. 计算机中的图像大致可以分为两类:位图(Bitmap)和矢量图(Metafile).位图可以视为一个 ...

最新文章

  1. 在ASP.NET中值得注意的两个地方
  2. Java基础-Java中的堆内存和离堆内存机制
  3. LaTex 变形的字母
  4. terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr
  5. js 导出pdf上传至oss_js实现oss文件上传及一些问题
  6. 动态规划——数塔问题
  7. 第十一节课 课堂总结
  8. 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解
  9. LVS--NAT模型
  10. 进程栈大小 与 线程栈大小-转
  11. Intel Edison学习笔记(二)—— 入门环境配置
  12. python实现决策树ID3算法
  13. JAR运行出现ClassNotFoundException异常的解决办法
  14. 计算机pc610台湾研华,IPC610-研华610工控机配置
  15. 重装系统原来这么简单,最详细的win7安装教程
  16. 毕业生自传---(蝶变亚信)
  17. 20年以后的科技发展小短文计算机,20年后的我小学想象作文
  18. 完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务
  19. zynq获取程序运行时间
  20. VMware中GPU虚拟化的三种模式(1)–vSGA

热门文章

  1. 瑞星微RK3288 开发板(ARM Cortex-A17架构)
  2. 如何安全登陆邮箱?这些邮箱登陆入口你知道吗?
  3. 全新的备份利器推荐:Duplicity使用评测
  4. 四、s3c2440 裸机开发 通用异步收发器UARN
  5. 计算机语言怎么学,教你如何学习计算机编程语言
  6. App 界的一股清流 音视频应有尽有 完全按照 Material design 规范设计的 App
  7. 6.Striped64源码解析
  8. IIS 编译器错误消息: CS0016未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\roo
  9. 大数据面前,统计学的价值在哪里
  10. 【思前享后】区块链架构与特点