openmv/tools/gen_rainbow.py
2024-10-21 13:03:41 -07:00

384 lines
8.7 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the OpenMV project.
#
# Copyright (c) 2013-2024 Ibrahim Abdelkader <iabdalkader@openmv.io>
# Copyright (c) 2013-2024 Kwabena W. Agyeman <kwagyeman@openmv.io>
#
# This work is licensed under the MIT license, see the file LICENSE for details.
#
# This script generates the rainbow lookup table.
def interpolate_color(color1, color2, factor):
return (
int(color1[0] + (color2[0] - color1[0]) * factor),
int(color1[1] + (color2[1] - color1[1]) * factor),
int(color1[2] + (color2[2] - color1[2]) * factor)
)
def generate_lookup_table(lo_color, mid_color, hi_color):
lookup_table = []
for i in range(256):
if i < 128:
factor = i / 128.0
color = interpolate_color(lo_color, mid_color, factor)
else:
factor = (i - 128) / 128.0
color = interpolate_color(mid_color, hi_color, factor)
lookup_table.append(color)
return lookup_table
def rgb888_to_rgb565(tup):
return [(int(((r * 31) + 127.5) / 255) & 0x1F) << 11 |
(int(((g * 63) + 127.5) / 255) & 0x3F) << 5 |
(int(((b * 31) + 127.5) / 255) & 0x1F) for r,g,b in tup]
NUM_COL=256
SAT=1.0
VAL=1.0
OFFSET=220
import sys, colorsys
sys.stdout.write("#include <stdint.h>\n")
tup = [colorsys.hsv_to_rgb(1.0-(i/float(NUM_COL+OFFSET)), SAT, VAL) for i in range(OFFSET, NUM_COL+OFFSET)]
col = [(int((((r*255)*31)+127.5)/255)&0x1F)<<11 |
(int((((g*255)*63)+127.5)/255)&0x3F)<<5 |
(int((((b*255)*31)+127.5)/255)&0x1F) for r,g,b in tup]
sys.stdout.write("const uint16_t depth_table[%d] = {\n" % NUM_COL)
for i in range(NUM_COL):
if not (i % 8):
sys.stdout.write(" ")
sys.stdout.write("0x%04X" % col[255-i])
if (i + 1) % 8:
sys.stdout.write(", ")
elif i != (NUM_COL-1):
sys.stdout.write(",\n")
else:
sys.stdout.write("\n};\n")
sys.stdout.write("const uint16_t rainbow_table[%d] = {\n" % NUM_COL)
for i in range(NUM_COL):
if not (i % 8):
sys.stdout.write(" ")
sys.stdout.write("0x%04X" % col[i])
if (i + 1) % 8:
sys.stdout.write(", ")
elif i != (NUM_COL-1):
sys.stdout.write(",\n")
else:
sys.stdout.write("\n};\n")
# https://github.com/groupgets/LeptonModule/blob/master/software/v4l2lepton/Palettes.cpp#L7
tup = [
(255, 255, 255),
(253, 253, 253),
(251, 251, 251),
(249, 249, 249),
(247, 247, 247),
(245, 245, 245),
(243, 243, 243),
(241, 241, 241),
(239, 239, 239),
(237, 237, 237),
(235, 235, 235),
(233, 233, 233),
(231, 231, 231),
(229, 229, 229),
(227, 227, 227),
(225, 225, 225),
(223, 223, 223),
(221, 221, 221),
(219, 219, 219),
(217, 217, 217),
(215, 215, 215),
(213, 213, 213),
(211, 211, 211),
(209, 209, 209),
(207, 207, 207),
(205, 205, 205),
(203, 203, 203),
(201, 201, 201),
(199, 199, 199),
(197, 197, 197),
(195, 195, 195),
(193, 193, 193),
(191, 191, 191),
(189, 189, 189),
(187, 187, 187),
(185, 185, 185),
(183, 183, 183),
(181, 181, 181),
(179, 179, 179),
(177, 177, 177),
(175, 175, 175),
(173, 173, 173),
(171, 171, 171),
(169, 169, 169),
(167, 167, 167),
(165, 165, 165),
(163, 163, 163),
(161, 161, 161),
(159, 159, 159),
(157, 157, 157),
(155, 155, 155),
(153, 153, 153),
(151, 151, 151),
(149, 149, 149),
(147, 147, 147),
(145, 145, 145),
(143, 143, 143),
(141, 141, 141),
(139, 139, 139),
(137, 137, 137),
(135, 135, 135),
(133, 133, 133),
(131, 131, 131),
(129, 129, 129),
(126, 126, 126),
(124, 124, 124),
(122, 122, 122),
(120, 120, 120),
(118, 118, 118),
(116, 116, 116),
(114, 114, 114),
(112, 112, 112),
(110, 110, 110),
(108, 108, 108),
(106, 106, 106),
(104, 104, 104),
(102, 102, 102),
(100, 100, 100),
(98, 98, 98),
(96, 96, 96),
(94, 94, 94),
(92, 92, 92),
(90, 90, 90),
(88, 88, 88),
(86, 86, 86),
(84, 84, 84),
(82, 82, 82),
(80, 80, 80),
(78, 78, 78),
(76, 76, 76),
(74, 74, 74),
(72, 72, 72),
(70, 70, 70),
(68, 68, 68),
(66, 66, 66),
(64, 64, 64),
(62, 62, 62),
(60, 60, 60),
(58, 58, 58),
(56, 56, 56),
(54, 54, 54),
(52, 52, 52),
(50, 50, 50),
(48, 48, 48),
(46, 46, 46),
(44, 44, 44),
(42, 42, 42),
(40, 40, 40),
(38, 38, 38),
(36, 36, 36),
(34, 34, 34),
(32, 32, 32),
(30, 30, 30),
(28, 28, 28),
(26, 26, 26),
(24, 24, 24),
(22, 22, 22),
(20, 20, 20),
(18, 18, 18),
(16, 16, 16),
(14, 14, 14),
(12, 12, 12),
(10, 10, 10),
(8, 8, 8),
(6, 6, 6),
(4, 4, 4),
(2, 2, 2),
(0, 0, 0),
(0, 0, 9),
(2, 0, 16),
(4, 0, 24),
(6, 0, 31),
(8, 0, 38),
(10, 0, 45),
(12, 0, 53),
(14, 0, 60),
(17, 0, 67),
(19, 0, 74),
(21, 0, 82),
(23, 0, 89),
(25, 0, 96),
(27, 0, 103),
(29, 0, 111),
(31, 0, 118),
(36, 0, 120),
(41, 0, 121),
(46, 0, 122),
(51, 0, 123),
(56, 0, 124),
(61, 0, 125),
(66, 0, 126),
(71, 0, 127),
(76, 1, 128),
(81, 1, 129),
(86, 1, 130),
(91, 1, 131),
(96, 1, 132),
(101, 1, 133),
(106, 1, 134),
(111, 1, 135),
(116, 1, 136),
(121, 1, 136),
(125, 2, 137),
(130, 2, 137),
(135, 3, 137),
(139, 3, 138),
(144, 3, 138),
(149, 4, 138),
(153, 4, 139),
(158, 5, 139),
(163, 5, 139),
(167, 5, 140),
(172, 6, 140),
(177, 6, 140),
(181, 7, 141),
(186, 7, 141),
(189, 10, 137),
(191, 13, 132),
(194, 16, 127),
(196, 19, 121),
(198, 22, 116),
(200, 25, 111),
(203, 28, 106),
(205, 31, 101),
(207, 34, 95),
(209, 37, 90),
(212, 40, 85),
(214, 43, 80),
(216, 46, 75),
(218, 49, 69),
(221, 52, 64),
(223, 55, 59),
(224, 57, 49),
(225, 60, 47),
(226, 64, 44),
(227, 67, 42),
(228, 71, 39),
(229, 74, 37),
(230, 78, 34),
(231, 81, 32),
(231, 85, 29),
(232, 88, 27),
(233, 92, 24),
(234, 95, 22),
(235, 99, 19),
(236, 102, 17),
(237, 106, 14),
(238, 109, 12),
(239, 112, 12),
(240, 116, 12),
(240, 119, 12),
(241, 123, 12),
(241, 127, 12),
(242, 130, 12),
(242, 134, 12),
(243, 138, 12),
(243, 141, 13),
(244, 145, 13),
(244, 149, 13),
(245, 152, 13),
(245, 156, 13),
(246, 160, 13),
(246, 163, 13),
(247, 167, 13),
(247, 171, 13),
(248, 175, 14),
(248, 178, 15),
(249, 182, 16),
(249, 185, 18),
(250, 189, 19),
(250, 192, 20),
(251, 196, 21),
(251, 199, 22),
(252, 203, 23),
(252, 206, 24),
(253, 210, 25),
(253, 213, 27),
(254, 217, 28),
(254, 220, 29),
(255, 224, 30),
(255, 227, 39),
(255, 229, 53),
(255, 231, 67),
(255, 233, 81),
(255, 234, 95),
(255, 236, 109),
(255, 238, 123),
(255, 240, 137),
(255, 242, 151),
(255, 244, 165),
(255, 246, 179),
(255, 248, 193),
(255, 249, 207),
(255, 251, 221),
(255, 253, 235),
(255, 255, 24)
]
col = [(int(((r*31)+127.5)/255)&0x1F)<<11 |
(int(((g*63)+127.5)/255)&0x3F)<<5 |
(int(((b*31)+127.5)/255)&0x1F) for r,g,b in tup]
sys.stdout.write("const uint16_t ironbow_table[%d] = {\n" % NUM_COL)
for i in range(NUM_COL):
if not (i % 8):
sys.stdout.write(" ")
sys.stdout.write("0x%04X" % col[i])
if (i + 1) % 8:
sys.stdout.write(", ")
elif i != (NUM_COL-1):
sys.stdout.write(",\n")
else:
sys.stdout.write("\n};\n")
on_event = (216, 223, 236)
background = (30, 37, 52)
off_event = (64, 126, 201)
col = rgb888_to_rgb565(generate_lookup_table(on_event, background, off_event))
sys.stdout.write("const uint16_t evt_dark_table[%d] = {\n" % NUM_COL)
for i in range(NUM_COL):
if not (i % 8):
sys.stdout.write(" ")
sys.stdout.write("0x%04X" % col[i])
if (i + 1) % 8:
sys.stdout.write(", ")
elif i != (NUM_COL-1):
sys.stdout.write(",\n")
else:
sys.stdout.write("\n};\n")
on_event = (64, 126, 201)
background = (216, 223, 236)
off_event = (30, 37, 52)
col = rgb888_to_rgb565(generate_lookup_table(on_event, background, off_event))
sys.stdout.write("const uint16_t evt_light_table[%d] = {\n" % NUM_COL)
for i in range(NUM_COL):
if not (i % 8):
sys.stdout.write(" ")
sys.stdout.write("0x%04X" % col[i])
if (i + 1) % 8:
sys.stdout.write(", ")
elif i != (NUM_COL-1):
sys.stdout.write(",\n")
else:
sys.stdout.write("\n};\n")