【图像基础】bit depth图像色深介绍

本文转载自:https://zhuanlan.zhihu.com/p/157833222
仅作学习记录

概述

一句话概括:不管是 8bit (28) , 16bit (216) 还是 24bit (224) ,都是表示图像(灰度或彩色)中每一个像素的 像素值范围。就是用多少位表示一个像素值。

举一个简单的例子:
8位二进制数(1 byte/字节),有符号最大的表示范围为-127到+128
无符号最大表示范围为0到256,说明该图像 每个像素 最多有256个层次的灰度值。

  • 如果是2位灰度图则最多只有0,1,2,3四种层次的灰度,如果是1位灰度图,则只有0和1两种,即一幅图像非黑即白。

  • 若R、G、B每种颜色使用一个字节(8bit)表示,每幅图像可以有1670万种颜色;

  • 若R、G、B每种颜色使用两个字节(16bit)表示,每幅图像可以有10的12次方种颜色;

-如果是灰度图像,每个象素用一个字节(8bit)表示,一幅图像可以有256级灰度;

  • 若每个象素用两个字节(16bit)表示,一幅图像可以有65536级灰度。

具体介绍

为了更准确的表示原意,概念部分会直接引用原文。

Bit depth quantifies how many unique colors are available in an image’s color palette in terms of the number of 0’s and 1’s, or “bits,” which are used to specify each color.

位深(Bit Depth)是一种用‘0’和‘1’也就是‘位’来表示一张图片有多少种颜色的量化方式。通俗的说也就是表示一张照片进行色彩数码离散化的强度程度,关系到这个强度是粗粒度还是细粒度。以灰度图(Grayscale image)举例,其没有深度(只有一个channel),Bit depth就表示其有多少个灰度。更高的位深意味着可以编码更多的阴影和颜色。

对于一张图片来说,并不是将颜色离散化得越细越好,原因有二。第一人眼识别能力有限,第二过于细化颜色会大量增加存储大小

术语解释

众所周知,RGB彩色图片是三颜色通道的,分别是R红,G绿和B蓝,三种颜色在每一个pixel上进合并就可以展示出彩色。每一个颜色通道都可以使用bit depth来表示颜色表示的粒度。这里解释两个名词:bits per channelbits per pixel (bpp)。

The bit depth for each primary color is termed the “bits per channel.” The “bits per pixel” (bpp) refers to the sum of the bits in all three color channels and represents the total colors available at each pixel.

总结地说bits per channel 表示每一个channel的位深而bits per pixel 则表示三个Channel位深之和,同时也表示在每一个像素点上有多少种颜色的组合可能性。这里要注意两个概念的关系,不要混淆。下面来看个例子。

例子

绝大部分的数码相机输出的彩色照片的bits per channel是8-bits的,于是有 也就是256个不同的组合,这也就是也就是我们在读取照片后取任意一个channel矩阵发现其像素值落于[0-255]区间的原因。现在我们有三通道,把这三个通道放一起,每一个pixel就会有 的颜色。其bpp就为8*3=24 bits。

对比

在这里插入图片描述

位深可视化理解

在这里插入图片描述
从上图可以发现,图像位深越小,色彩断层越明显,位深越大色彩变化越细腻。

人眼只能识别大约一千万种不同的颜色,因此如果仅以观看为目的,则保存超过24bpp的图像是多余的。 但这不是说24bpp或者大一点的位深是完全浪费的。超过24 bpp的图像仍然非常有用,因为它们在后期处理中的表现更好。

可用的位深度设置取决于文件类型。标准JPEG和TIFF文件每个通道只能分别使用8位和16位。放大JPEG图片时就很容易看到断层。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是读取8位灰度图像的bmp文件的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #pragma pack(push, 1) // 禁用对齐 struct bmp_file_header { uint16_t magic_num; // 文件类型标识符 uint32_t size; // 文件大小 uint16_t reserved1; // 保留字段1 uint16_t reserved2; // 保留字段2 uint32_t offset; // 数据偏移量 }; struct bmp_info_header { uint32_t header_size; // 位图信息头大小 int32_t width; // 图像宽度 int32_t height; // 图像高度 uint16_t planes; // 颜色平面数 uint16_t bit_depth; // 颜色位深度 uint32_t compression; // 压缩类型 uint32_t image_size; // 压缩图像大小 int32_t x_resolution; // 水平分辨率 int32_t y_resolution; // 垂直分辨率 uint32_t color_palette; // 调色板颜色数 uint32_t important_colors; // 重要颜色数 }; #pragma pack(pop) // 恢复对齐 int main() { FILE *fp = fopen("example.bmp", "rb"); if (!fp) { perror("failed to open file"); exit(1); } // 读取文件头信息 struct bmp_file_header file_header; fread(&file_header, sizeof(file_header), 1, fp); // 读取位图信息头信息 struct bmp_info_header info_header; fread(&info_header, sizeof(info_header), 1, fp); // 确保是8位灰度图像 if (info_header.bit_depth != 8) { fprintf(stderr, "Not an 8-bit grayscale image\n"); exit(1); } // 读取调色板信息 uint8_t palette[1024]; fread(palette, sizeof(palette), 1, fp); // 读取像素数据 uint8_t *data = malloc(info_header.image_size); fseek(fp, file_header.offset, SEEK_SET); fread(data, info_header.image_size, 1, fp); // 关闭文件 fclose(fp); // 显示图像 // TODO: 使用第三方库或自行实现图像显示 // 释放内存 free(data); return 0; } ``` 这段代码使用了C语言的文件读写API和结构体来解析bmp文件头、位图信息头和调色板信息,然后使用`malloc()`函数动态分配内存并读取像素数据。如果需要显示图像,可以使用第三方库或自行实现图像显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值