首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >减色算法

减色算法

作者头像
hotarugali
发布2022-03-18 15:10:54
发布2022-03-18 15:10:54
9660
举报

1. 简介

减色算法(ColorQuantization)是一种应用在色彩空间中用于减少图像离散色彩值的一类算法,旨在通过减少图像的离散色彩值从而减少了每个色彩值的表示比特数。一方面达到压缩图像的效果,另一方面使得一些以固定有限比特数表示像素的显示设备也能显示每个像素更多表示比特的图像。

2. 中位切割算法

中位切割算法(Median Cut)是最知名、应用最广泛的减色算法,常见的图像处理软件如 Photoshop、GIMP 等都使用了这个算法或其变种。

2.1 原理

假设有一张 RGB 图像,想要降低图像中色彩数目到 256 色。中位切割算法流程如下:

  1. 将图片的所有像素放到同一个区域(RGB 三维空间中)
  2. 对所有区域进行以下操作:
    1. 计算此区域内所有像素的 RGB 三元素最大值与最小值的差
    2. 选出相差最大的那个颜色(R 或 G 或 B)
    3. 根据那个颜色去排序此区域内所有像素
    4. 分割前一半和后一半的像素到两个不同区域(即「中位切割」)
  3. 重复第二步直到产生了 256 个区域
  4. 将每个区域的像素值平均起来,就得到 256色

2.2 实现

假设有一张 RGB 图像,其每个像素的每个分量(R、G、B)均用 888 比特表示,要想将其色彩数目由 256 \times 256 \times 256 降低到 256,简单伪代码部分实现如下:

  1. 统计每对 <R,G,B> 像素值的像素数量
代码语言:javascript
复制
Global FREQUENCIES [0..255][0..255][0..255]
Global IMAGE [1..IMAGEHEIGHT][1..IMAGEWIDTH]

Procedure GatherFrequencies
    Begin
    For II = 1 To IMAGEHEIGHT Do
        Begin
        For JJ = 1 To IMAGEWIDTH Do
            Begin
            RED = IMAGE[II][JJ].RED
            GREEN = IMAGE[II][JJ].GREEN
            BLUE = IMAGE[II][JJ].BLUE
            FREQUENCIES[RED][GREEN][BLUE] = FREQUENCIES[RED][GREEN][BLUE] + 1
            End
        End
    End
  1. 分割一个区域。假设极差最大的色彩分量为 B,该区域 R、G、B 分量的范围分别为 [Rl,Rr][Gl,Gr][Bl,Br]
代码语言:javascript
复制
Global FREQUENCIES [0..255][0..255][0..255]
Function DivideBlueInHalf
    Begin
    COUNT = 0
    For BLUECUT = Bl to Br Do
        Begin
        For II = Rl to Rr Do
            Begin
            For JJ = Gl to Gr Do
                Begin
                COUNT = COUNT + FREQUENCIES[II][JJ][BLUECUT]
                End
            End
        If COUNT > IMAGEHEIGHT * IMAGEWIDTH / 2 Then
            Return BLUECUT
        End
    Return Br
    End

附录

  • An Overview of Color Quantization Techniques
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 中位切割算法
    • 2.1 原理
    • 2.2 实现
  • 附录
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档