开源库nothings/stb的介绍及使用(图像方面)

2023-11-05

GitHub上有个开源的stb库,Star数已过万,地址为https://github.com/nothings/stb,为何叫stb,是用的作者名字的缩写Sean T. Barrett。此库仅包含头文件,除stretchy_buffer.h外,其它所有文件以前缀stb开头,每个头文件的作用及用法在每个头文件的开始部分都作了介绍。此开源库的license为public domain或MIT。下面仅对与图像相关的头文件的作用及使用进行简单的说明,当仅需要将图像数据载入内存、或进行缩放操作、或保存图像时使用stb会非常方便,因为仅需要include一个或三个头文件即可,不需要额外图像处理库的依赖,如libjpeg、libpng、opencv等:

1. stb_image.h:载入图像,支持的图像文件格式包括JPEG、PNG、TGA、BMP、PSD、GIF、HDR、PIC、PNM,使用到的函数主要为:stbi_load,参数依次为:图像文件名(filename),获取图像宽(x),获取图像高(x),获取图像通道数(channels_in_file)、指定期望的通道数(desired_channels,若为0则不做颜色空间变换),此函数正常返回图像数据指针,否则返回NULL;

2. stb_image_resize.h:图像缩放,使用到的函数主要为stbir_resize_uint8,参数依次为:输入图像数据指针(input_pixels)、输入图像宽(input_w)、输入图像高(input_h)、输入图像步长(input_stride_in_bytes,若为0则为宽x通道数)、输出图像数据指针(output_pixels)、输出图像宽(output_w)、输出图像高(output_h)、输出图像步长(output_stride_in_bytes,若为0则为宽*通道数)、图像通道数(num_channels,输入与输出一致),此函数正常返回1,否则返回0;

3. stb_image_write.h:保存图像,支持的图像文件格式包括PNG、BMP、TGA、JPG、HDR,使用到的函数主要为stbi_write_xxx,其中xxx可以为png、bmp、tga、hdr、jpg,参数依次为:保存图像名(filename)、图像宽(w)、图像高(h)、图像通道数(comp)、图像数据指针(data),步长(stride_in_bytes,若为0则为宽*通道数,仅限png)、图像质量(quality,取值范围1~100,仅限jpg),此函数正常返回非0值,否则返回0。

以下为测试代码(test_stb.cpp):

#include "funset.hpp"
#include <iostream>
#include <vector>
#include <string>

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#define STB_IMAGE_RESIZE_STATIC
#include "stb_image_resize.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#define STB_IMAGE_WRITE_STATIC
#include "stb_image_write.h"


int test_stb_image()
{
#ifdef _MSC_VER
	const std::string files_path {"E:/GitCode/OCR_Test/test_data/"};
#else
	const std::string files_path {"test_data/"};
#endif

	const std::vector<std::string> images_name{"marge.jpg", "lena.png"};

	for (auto name : images_name) {
		const std::string image = files_path + name;

		// load image
		int x, y, channels_in_file, desired_channels = 3;
		unsigned char* data = stbi_load(image.c_str(), &x, &y, &channels_in_file, desired_channels);
		if (!data) {
			fprintf(stderr, "fail to read image: %s\n", image.c_str());
			return -1;
		}
		fprintf(stdout, "image: %s, x: %d, y: %d, channels_in_file: %d, desired_channels: %d\n", name.c_str(), x, y, channels_in_file, desired_channels);

		// resize image
		int width_resize = x * 1.5, height_resize = y * 1.4;
		unsigned char* output_pixels = (unsigned char*)malloc(width_resize * height_resize * desired_channels);
		int ret = stbir_resize_uint8(data, x, y, 0, output_pixels, width_resize, height_resize, 0, desired_channels);
		if (ret == 0) {
			fprintf(stderr, "fail to resize image: %s\n", image.c_str());
			return -1;
		}

		// write(save) image
		const std::string save_name_png = image + ".png";
		const std::string save_name_jpg = image + ".jpg";

		ret = stbi_write_png(save_name_png.c_str(), width_resize, height_resize, desired_channels, output_pixels, 0);
		if (ret == 0) {
			fprintf(stderr, "fail to write image png: %s\n", image.c_str());
			return -1;
		}

		ret = stbi_write_jpg(save_name_jpg.c_str(), width_resize, height_resize, desired_channels, output_pixels, 90);
		if (ret == 0) {
			fprintf(stderr, "fail to write image jpg: %s\n", image.c_str());
			return -1;
		}

		free(data);
		free(output_pixels);
	}

	return 0;
}

执行结果如下图所示:

GitHubhttps://github.com/fengbingchun/OCR_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源库nothings/stb的介绍及使用(图像方面) 的相关文章

  • vtkImageData算法坐标计算取整处理

    医学影像处理项目中 处理vtkImageData数据时经常涉及到一类问题 给了一个空间坐标或者位置 如何计算对应像素索引或者距离 从原理上 是这样一个公式 pixel num floor postion1 postion0 spacing
  • 海思3559A上编译libjpeg-turbo源码操作步骤

    1 从https github com libjpeg turbo libjpeg turbo releases tag 2 0 2 下载libjpeg turbo 2 0 2版本 2 脚本build sh内容如下 cmake DCMAKE
  • 边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪

    转自 http blog sina com cn s blog 6c083cdd0100nm4s html 7 1 边沿检测 我们给出一个模板 和一幅图象 不难发现原图中左边暗 右边亮 中间存在着一条明显的边界 进行模板操作后的结果如下 可
  • 数字水印简介

    转自 http baike baidu com view 39205 htm 数字水印 Digital Watermarking 技术是将一些标识信息 即数字水印 直接嵌入数字载体当中 包括多媒体 文档 软件等 或是间接表示 修改特定区域的
  • 图片像素、英寸、厘米之间的单位换算

    转自 http hi baidu com cjg501 blog item f040fc0898d5379f0b7b8244 html 今天朋友用photoshop处理图片时要把图片保存指定的大小 但她只对厘米要形像感 可是在软件里保存的图
  • 图像处理库(fbc_cv):源自OpenCV代码提取

    在实际项目中会经常用到一些基本的图像处理操作 而且经常拿OpenCV进行结果对比 因此这里从OpenCV中提取了一些代码组织成fbc cv库 项目fbc cv所有的代码已放到GitHub中 地址为 https github com feng
  • CImg库介绍

    转自 http www cppprog com 2009 0424 106 html CImg是一个跨平台的C 的图像处理库 提供了加载 处理 显示 保存等一系列功能 其中的图像处理功能尤其强大 首先 建议先到这里欣赏一下使用CImg代码做
  • 如何运行ImageMagick的命令行工具

    在http www imagemagick org script index php网站下载相应的执行文件 这里以下载ImageMagick 6 6 5 10 Q16 windows static exe为例说明 将ImageMagick
  • 颜色空间YUV简介

    YUV概念 YUV是被欧洲电视系统所采用的一种颜色编码方法 属于PAL Phase Alternation Line 是PAL和SECAM模拟彩色电视制式采用的颜色空间 其中的Y U V几个字母不是英文单词的组合词 Y代表亮度 其实Y就是图
  • 开源库nothings/stb的介绍及使用(图像方面)

    GitHub上有个开源的stb库 Star数已过万 地址为https github com nothings stb 为何叫stb 是用的作者名字的缩写Sean T Barrett 此库仅包含头文件 除stretchy buffer h外
  • 灰度图像直方图均衡化公式及实现

    图像的直方图 直方图是图像中像素强度分布的图形表达方式 它统计了每一个强度值所具有的像素个数 直方图均衡化 是通过拉伸像素强度分布范围来增强图像对比度的一种方法 是图像处理领域中利用图像直方图对对比度进行调整的方法 均衡化指的是把一个分布
  • Spline interpolation and Savitzki-Golay smoothing

    转自 http octave 1599824 n4 nabble com Spline interpolation and Savitzki Golay smoothing td1675136 html natural cubic spli
  • Radon变换

    转自 http baike baidu com view 2435650 htm 两维情况下radon变换大致可以这样理解 一个平面内沿不同的直线 直线与原点的距离为d 方向角为alfa 对f x y 做线积分 得到的像F d alfa 就
  • windows7 64位机上,libjpeg-turbo的安装和使用

    libjpeg turbo是对libjpeg的扩展 支持SIMD指令 如X86架构的MMX SSE SSE2 3DNOW ARM架构的NEON 在对jpeg进行编码和解码的过程中能提高速度 MMX 多媒体扩展的缩写 第六代CPU芯片重要特点
  • JavaScript图像处理(5) - 曲线操作(Curve Manipulation)

    直方图均衡作为一个自动的方法虽然可以在大多数情况下获得不错的效果 但是很多时候也受限于其单一的功能而无法满足多样化的图像处理需求 尤其是在图像的艺术处理方面 直方图均衡往往并不能达到期望的效果 有时候我们需要增强图像中的高光或者是明亮的背景
  • vtk表面提取参数研究

    marching cubes是三维图形处理中常见的算法 实际使用中 对一个影像数据做表面提取 然后平滑得到一个组织表面是一个常用功能 下面这段代码是参考3d slicer的分割流程的代码 boneExtractor vtkMarchingC
  • Leptonica在VS2010中的编译及简单使用举例

    在tesseract ocr中会用到leptonica库 这里对leptonica简单介绍下 Leptonica是一个开源的图像处理和图像分析库 它的license是BSD 2 clause 它主要包括的操作有 位图操作 仿射变换 形态学操
  • 海思3559A上编译libyuv源码操作步骤

    1 下载libyuv源代码 执行 git clone https chromium googlesource com libyuv libyuv 2 通过CMakeLists txt编译生成库 build sh脚本内容如下 cmake DC
  • 图像相似度计算之直方图方法OpenCV实现

    操作步骤 1 载入图像 灰度图或者彩色图 并使其大小一致 2 若为彩色图 增进行颜色空间变换 从RGB转换到HSV 若为灰度图则无需变换 3 若为灰度图 直接计算其直方图 并进行直方图归一化 4 若为彩色图 则计算其彩色直方图 并进行彩色直
  • CxImage的编译及简单使用举例

    1 从http sourceforge net projects cximage 下载最新的CxImage 702源码 2 解压缩后 以管理员身份打开CxImageFull vc10 sln工程 在编译之前先将每个工程属性的Characte

随机推荐

  • Ubuntu 终端常用命令(持续更新)

    文章目录 1 查找 1 grep 在命令行中查找 曾经使用过的命令 2 find 3 which 2 编辑文件 1 vim 2 vi 3 gedit 建议新手使用 3 清除命令 1 clear 2 reset 4 磁盘管理 1 df dis
  • 修改windows控制台编码

    代码页code page UTF 8 65001 简体中文 GB2312 936 繁体中文BIG5 950 日文 932 美国 加拿大英语 437 俄文 866 韩文 949 查看当前代码页 chcp 设置当前代码页 临时设置 设置UTF
  • 应用服务漏洞扫描与利用

    使用命令nmap探测目标靶机的服务版本信息 将需要使用的参数作为FLAG进行提交
  • android.os.Environment

    public class Environment extends Object Java lang Object Android os Environment 类概述 提供访问环境变量 摘要 常量 String MEDIA BAD REMO
  • 【SDIO】SD2.0协议分析总结(一)-- SD卡基本概率介绍

    相关文章 SDIO SDIO SD卡 FatFs文件系统相关文章索引 1 前言 由于目前使用的硬件平台STM32只支持SD2 0 所以后面的介绍主要是参考 Part1 Physical Layer Simplified Specificat
  • 支持H.265网页播放的H5播放器EasyPlayer.js发布了

    在之前的多篇博客 历时半年 终于研发完成了Web网页对H 265 HEVC 直播和点播的支持 WebAssembly wasm EasyPlayer js开发Web H5网页播放H 265视频播放支持FLV与HLS直播与点播的过程 里面 我
  • C++ 拷贝构造函数等编译器自动生成的函数

    了解 C 默认编写的函数 空的类 在C 处理过后 编译器会为它声明 默认构造函数 copy 构造函数 copy assignment 操作符 析构函数 并且这些函数都是 public 且 inline 的 class Empty class
  • jQuery提交表单时,游览器默认拦截

    今天做一个功能 当用户点击查询时 先验证用户查询次数是否足够 如果够得话使用form表单方式提交 跳转新的界面 为什么用form表单 因为数据敏感 不适合在游览器地址上显示出来 防止用户随意修改而导致数据问题 当axaj发送请求 gt 验证
  • Vue集成WangEditor的初次使用

    作为一个菜鸟表示真的很难吖 这个插件就一个字 小巧 好用 首先我是Vue springboot的前后端分离 所以在查的时候结合文档和网上的一些例子 在此感谢帮助到我的大佬们 因为富文本编辑框之后会在很多地方用到 所以我采用了把WangEdi
  • Ctrl-labs CEO:脑机接口突破不断,五年内或可实现商用

    转自 https baijiahao baidu com s id 1650948598615192740 wfr spider for pc
  • Mysql-锁定读(Locking Reads)

    关于读锁 mysql官方文档地址 https dev mysql com doc refman 5 7 en innodb locking reads html与一致性非锁定读 普通读 快照读 对应的就是锁定读 锁定读的用处很多 首先先说下
  • js 高级算法 - 动态规划

    主要是看了 数据结构与算法 有所感悟 虽然这本书被挺多人诟病的 说这有漏洞那有漏洞 但并不妨碍我们从中学习知识 其实像在我们前端的开发中 用到的高级算法并不多 大部分情况if语句 for语句 swith语句等等 就可以解决了 稍微复杂的 可
  • DestroyList() 和ClearList() 一个使用引用,一个直接传参

    在高一凡编写的算法书P20页写着 销毁链表时用了引用 void DestroyList LinkList L LinkList q while L q L gt next free L L q 清空链表没有使用引用 void ClearLi
  • element UI 图片上传/文件上传

  • 2021-04-16

    喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事 你们一定都觉得这猴子太闹腾了 其实你们是有所不知 悟空是在研究一个数学问题 什么问题 他研究的问题是蟠桃一共有多少个 不过 到最后 他还是没能解决这个难题 呵呵 当时的情况是这样的 第一天悟空吃
  • yarn的常用命令以及与npm的对比

    yarn安装 在yarn的官网下载yarn并安装或者 npm i yarn g 查看版本 Yarn v 1 初始化一个新项目 yarn init 与 npm init 一样通过交互式会话创建一个 package json yarn init
  • 实施工程师的必修课(一)-----项目启动前的知识整理学习-工作流程

    项目启动前的知识整理学习 工作流程 第一步 项目启动 第二步 调研开始 第三步 需求总结 第四步 数据和材料的收集 第五步 需求调研结束 第六步 上线试运行 第七步 项目验收 以lims系统为例 实验室信息管理系统 LIMS Laborat
  • MySQL存储原理

    MySQL中的数据组织是以页为单位的 每一页中的信息包括 页头 记录页面的控制信息 共占56字节 包括页的左右兄弟页面指针 用来连接相邻的页面 页面空间使用情况等 虚记录 最大虚记录 比页内最大主键还大 最小虚记录 比页内最小主键还小 记录
  • chatgpt论文润色

    https github com binary husky chatgpt academic
  • 开源库nothings/stb的介绍及使用(图像方面)

    GitHub上有个开源的stb库 Star数已过万 地址为https github com nothings stb 为何叫stb 是用的作者名字的缩写Sean T Barrett 此库仅包含头文件 除stretchy buffer h外