前言

openCV处理的图像最小的位深度都是8,即每个像素的灰度值要用8bit存储,二值化处理的图像也是用8bit来存储每个像素的灰度值(0代表黑色,255代表白色),为什么不能用0和1表示呢,即每个像素用1bit存储。这样保存的图像占用的存储空间更小,在某些场合下会发挥重大的作用,下面直接上代码,将位深8bit的图像保存为位深1bit图像。

代码实现

将位深8bit的图像Mat img转化为位深1bit图像数据。

int 8Bit2Binary(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.data[row * width + 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;

}

将位深8bit的图像保存为位深1bit图像。

int save1BitImage(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 >> 3 + 3) / 4 * 4;

char * p_data = (char *)malloc(line_byte*height);

//统计算法执行时间

double start = static_cast(cv::getTickCount());

8Bit2Binary(img, line_byte, p_data);

//统计算法运行时间

double end = static_cast(cv::getTickCount());

double run_time = (end - start) / cv::getTickFrequency();

std::cout << "Run Time1:" << run_time * 1000 << "ms" << std::endl;

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;

}

测试效果

//测试8bit转1bit图像

void test_8Bit2OneBit()

{

Mat src = imread(".\\test.bmp", 0);//加载图像

string dst = ".\\result.bmp";//存放生成1位位图的路径

int a;

//统计算法执行时间

double start = static_cast(cv::getTickCount());

a = save1BitImage(src, dst);

//统计算法运行时间

double end = static_cast(cv::getTickCount());

double run_time = (end - start) / cv::getTickFrequency();

std::cout << "Run Time:" << run_time * 1000 << "ms" << std::endl;

system("pause");

}

最后

如果觉得文章对您有帮助的话,别忘了给我个赞,谢谢!,顺便推荐OpenCV学习资料!!!

opencv图片保存0字节_openCV将8bit(1像素对应8bit)图像保存为1bit(1像素对应1bit)...相关推荐

  1. python保存图片到指定路径_python将处理好的图像保存到指定目录下的方法

    原始图像绝对路径的图像名存储在一个txt文件中,下面的程序实现的功能是按照txt文件的顺序,依次将图片读取然后进行处理,最后将处理之后的图像保存在指定的路径下: # Read in the image ...

  2. java 获取图片像素_转:java提取图片中的像素

    本文转自:http://www.infosys.tuwien.ac.at/teaching/courses/WebEngineering/References/java/docs/api/java/a ...

  3. 把python tkinter canvas中的图形图像保存为通用格式文件的5种方法

    在计算机上画图未完成,需要保存未完成图形以便以后继续,或者完成画图,要保存为通用格式文件,方便浏览.如使用python tkinter Canvas画图,其好像没有将图像保存通用格式文件的方法,但可以 ...

  4. opencv方框内图像保存_opencv 图像滤波(均值,方框,高斯,中值)

    为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...

  5. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

  6. opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍

    本文来自于段力辉 译<OpenCV-Python 中文教程> 文章目录 一.图片 + 读入.显示.写出 1.cv2.imread() 2.cv2.imshow() 3.cv2.imwrit ...

  7. opencv 图片读取和视频读取(一)

    环境搭建 一 图片读取 1代码 import cv2 as cv #读取图片 src=cv.imread('./yiner.jpg') #cv.WINDOW_AUTOSIZE 表示自动窗口 cv.na ...

  8. (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功

    (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功 Visual Studio 2015下载地址:https://msdn.itellyo ...

  9. opencv入门基础——图像读取,图像显示,图像保存

    一,图像读取 如上图所示,从文件中导入图像用这个函数 retval=cv.imread(文件名,[,显示控制参数]) 显示控制参数,主要是这几个: cv.IMREAD_UNCHANGED cv.IMR ...

最新文章

  1. netflow报文格式与数据处理流程分析_RTK、三维激光扫描、无人机倾斜摄影在大比例尺地形图测绘的对比分析...
  2. java语言使用箭头键画线_Java:使用带箭头键的按键
  3. 启用了不安全的HTTP方法
  4. php生成文章页,php结合smarty生成静态页面php文章内分页代码
  5. 高情商的人都是怎么求人办事的?
  6. php数组排序语言,php数组排序函数有哪些
  7. 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
  8. Day4:html和css
  9. WinRAR v5.90 正式版简体中文汉化特别版本
  10. 安卓代码设置系统时间
  11. 网页如何转pdf并实现下载
  12. 维宏控制卡win7 驱动_ncstudio(维宏控制系统)64位下载v5.4.86[百度网盘资源] - 软件学堂...
  13. 数据分析学习记录--用EXCEL完成简单的单因素方差分析
  14. 一纬度横直线等于多公里_【地理】高中地理必修一知识点总结,考前必看
  15. 学计算机的怎样提升打字速度,如何提高打字速度:电脑键盘指法练习
  16. 鸿蒙系统1004无标题,win10 10041更新提示错误怎么处理
  17. 国际上炒黄金平台有哪些
  18. day91~93-Paas云平台_docker容器
  19. 开发微信小程序推荐使用phpstorm进行开发
  20. 数字抽奖小程序_发挥想象力,用 PowerBI 做抽奖小程序

热门文章

  1. python 如何实现依据依存关系构造邻接矩阵(有向图)
  2. 快递100企业版接口(API)实时查询、订阅推送、云打印、电子面单实现.Net版
  3. 进行小红书营销,怎样拉入更多的客户?
  4. 解决虚拟机下光标闪烁问题
  5. SpringBoot项目解决@ResponseBody注解返回xml格式数据而不是json格式的问题
  6. el-table 大数据量渲染,页面卡顿的解决方案
  7. Ubuntu——终端多窗口分屏工具Terminator
  8. 17.项目开发中遇到的问题(this.$parent.$parent子组件调父组件的父组件的方法不可用问题)
  9. Vue组件之间的通信-父传子-子传父
  10. i7 12650h参数 酷睿i712650h属于什么档次