opencv图片保存0字节_openCV将8bit(1像素对应8bit)图像保存为1bit(1像素对应1bit)...
前言
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)...相关推荐
- python保存图片到指定路径_python将处理好的图像保存到指定目录下的方法
原始图像绝对路径的图像名存储在一个txt文件中,下面的程序实现的功能是按照txt文件的顺序,依次将图片读取然后进行处理,最后将处理之后的图像保存在指定的路径下: # Read in the image ...
- java 获取图片像素_转:java提取图片中的像素
本文转自:http://www.infosys.tuwien.ac.at/teaching/courses/WebEngineering/References/java/docs/api/java/a ...
- 把python tkinter canvas中的图形图像保存为通用格式文件的5种方法
在计算机上画图未完成,需要保存未完成图形以便以后继续,或者完成画图,要保存为通用格式文件,方便浏览.如使用python tkinter Canvas画图,其好像没有将图像保存通用格式文件的方法,但可以 ...
- opencv方框内图像保存_opencv 图像滤波(均值,方框,高斯,中值)
为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...
- OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...
- opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
本文来自于段力辉 译<OpenCV-Python 中文教程> 文章目录 一.图片 + 读入.显示.写出 1.cv2.imread() 2.cv2.imshow() 3.cv2.imwrit ...
- opencv 图片读取和视频读取(一)
环境搭建 一 图片读取 1代码 import cv2 as cv #读取图片 src=cv.imread('./yiner.jpg') #cv.WINDOW_AUTOSIZE 表示自动窗口 cv.na ...
- (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 ...
- opencv入门基础——图像读取,图像显示,图像保存
一,图像读取 如上图所示,从文件中导入图像用这个函数 retval=cv.imread(文件名,[,显示控制参数]) 显示控制参数,主要是这几个: cv.IMREAD_UNCHANGED cv.IMR ...
最新文章
- netflow报文格式与数据处理流程分析_RTK、三维激光扫描、无人机倾斜摄影在大比例尺地形图测绘的对比分析...
- java语言使用箭头键画线_Java:使用带箭头键的按键
- 启用了不安全的HTTP方法
- php生成文章页,php结合smarty生成静态页面php文章内分页代码
- 高情商的人都是怎么求人办事的?
- php数组排序语言,php数组排序函数有哪些
- 【学习OpenCV4】在OpenCV中响应键盘与鼠标操作
- Day4:html和css
- WinRAR v5.90 正式版简体中文汉化特别版本
- 安卓代码设置系统时间
- 网页如何转pdf并实现下载
- 维宏控制卡win7 驱动_ncstudio(维宏控制系统)64位下载v5.4.86[百度网盘资源] - 软件学堂...
- 数据分析学习记录--用EXCEL完成简单的单因素方差分析
- 一纬度横直线等于多公里_【地理】高中地理必修一知识点总结,考前必看
- 学计算机的怎样提升打字速度,如何提高打字速度:电脑键盘指法练习
- 鸿蒙系统1004无标题,win10 10041更新提示错误怎么处理
- 国际上炒黄金平台有哪些
- day91~93-Paas云平台_docker容器
- 开发微信小程序推荐使用phpstorm进行开发
- 数字抽奖小程序_发挥想象力,用 PowerBI 做抽奖小程序
热门文章
- python 如何实现依据依存关系构造邻接矩阵(有向图)
- 快递100企业版接口(API)实时查询、订阅推送、云打印、电子面单实现.Net版
- 进行小红书营销,怎样拉入更多的客户?
- 解决虚拟机下光标闪烁问题
- SpringBoot项目解决@ResponseBody注解返回xml格式数据而不是json格式的问题
- el-table 大数据量渲染,页面卡顿的解决方案
- Ubuntu——终端多窗口分屏工具Terminator
- 17.项目开发中遇到的问题(this.$parent.$parent子组件调父组件的父组件的方法不可用问题)
- Vue组件之间的通信-父传子-子传父
- i7 12650h参数 酷睿i712650h属于什么档次