将图像转换为1位位图 (1像素对应1bit)
文章参考网址: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)相关推荐
- 将图像转换为8位单通道_数字图像存储
微信公众号:枫叶AI,专注计算机视觉,机器学习,人工智能等 数字化图像数据有两种存储方式:位图存储(Bitmap)和矢量存储(Vector).位图图像又称作点阵图像.位映射图像,它是由一系列像素组成的 ...
- labelme 标注生成24位深度图像转换为8位
新版本的 labelme 标注完成图像后,将 json 文件转换为图像时已经转换为 8 通道图像,如下图所示: 最近在看别人程序时发现经过图像标注生成的 label 一片黑,且图像深度为 24 位,如 ...
- python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...
语义.实例分割数据集的标注图像以及一些深度图像等都是由单通道16位整型图像存储的,我们通常需要读取这种图像并显示出来,由于OpenCV一般只能够对8位图像进行显示,也就是像素范围在0-255的图像,而 ...
- python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...
上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...
- python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片
本文介绍如何使用python将图片转换为纯黑白的单通道图片.文中用到的脚本支持彩色.灰度.带alpha通道的输入图片以及SVG矢量图,支持调整输出图片大小以及设置灰度阈值. 最后介绍如何输出SSD13 ...
- 【笔记】位图(.bmp)和矢量图(Vector):位图是点阵图或光栅图,使用像素的一格一格来描述图像,放大以后每一个像素看就像是一个个的马赛克;矢量图是使用直线和曲线来描述图形,可以无限方法,不会失真
一.什么是位图 计算机能以位图和矢量图格式显示图像. 1.位图(Bitmap): 图像又称点阵图或光栅图,它使用我们称为像素(象素,Pixel)的一格一格的小点来描述图像.计算机屏幕其实就是一张包含大 ...
- 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色
12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 import sys import pygame def run_game():pygame.init()screen = pygame. ...
- python将png图像RGB模式转换为L模式(24位转换为8位)
我的目的是想要把P模式的图像转换为L模式,那么必须先转换为RGB模式,再转换为L模式. P模式为2位深度,RGB为24位深度,L为8位深度. 以下是转换的代码: im = Image.open(tes ...
- 使用GDI+将24位真彩色图像转换为8位灰度图像
在图像处理中,我们经常需要将真彩色图像转换为黑白图像.黑白图像即为灰度图,即只有纯黑,纯白两种颜色. 计算机中的图像大致可以分为两类:位图(Bitmap)和矢量图(Metafile).位图可以视为一个 ...
最新文章
- 在ASP.NET中值得注意的两个地方
- Java基础-Java中的堆内存和离堆内存机制
- LaTex 变形的字母
- terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr
- js 导出pdf上传至oss_js实现oss文件上传及一些问题
- 动态规划——数塔问题
- 第十一节课 课堂总结
- 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解
- LVS--NAT模型
- 进程栈大小 与 线程栈大小-转
- Intel Edison学习笔记(二)—— 入门环境配置
- python实现决策树ID3算法
- JAR运行出现ClassNotFoundException异常的解决办法
- 计算机pc610台湾研华,IPC610-研华610工控机配置
- 重装系统原来这么简单,最详细的win7安装教程
- 毕业生自传---(蝶变亚信)
- 20年以后的科技发展小短文计算机,20年后的我小学想象作文
- 完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务
- zynq获取程序运行时间
- VMware中GPU虚拟化的三种模式(1)–vSGA
热门文章
- 瑞星微RK3288 开发板(ARM Cortex-A17架构)
- 如何安全登陆邮箱?这些邮箱登陆入口你知道吗?
- 全新的备份利器推荐:Duplicity使用评测
- 四、s3c2440 裸机开发 通用异步收发器UARN
- 计算机语言怎么学,教你如何学习计算机编程语言
- App 界的一股清流 音视频应有尽有 完全按照 Material design 规范设计的 App
- 6.Striped64源码解析
- IIS 编译器错误消息: CS0016未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\roo
- 大数据面前,统计学的价值在哪里
- 【思前享后】区块链架构与特点