drWoof
drWoof

Reputation: 23

Convert an array of RGB hexadecimal values to OpenCV image in Python

In the input of a program is given height amount of lines that have width amount of RRGGBB values in them, with RR/GG/BB being a hexadecimal value of the corresponding color in an RGB format.
I need to take the input and convert it to an OpenCV image so that I could interact with it using the OpenCV library. How would I accomplish this?

Example of input: https://drive.google.com/file/d/1XuKRuAiQLUv4rbVxl2xTgqYr_8JQeu63/view?usp=sharing The first number is height, second is width, the rest of the text file is the image itself.

Upvotes: 1

Views: 2395

Answers (1)

Mark Setchell
Mark Setchell

Reputation: 207385

That is a really inefficient way to store an image, and this is a correspondingly inefficient way to unpack it!

#!/usr/bin/env python3

import numpy as np
import re
import cv2

# Read in entire file
with open('in.txt') as f:
   s = f.read()

# Find anything that looks like numbers
l=re.findall(r'[0-9a-f]+',s)

# Determine height and width
height = int(l[0])
width  = int(l[1])

# Create numpy array of BGR triplets
im = np.zeros((height,width,3), dtype=np.uint8) 

i = 2
for row in range (height):
    for col in range(width):
        hex = l[i]
        R = int(hex[0:2],16) 
        G = int(hex[2:4],16) 
        B = int(hex[4:6],16) 
        im[row,col] = (B,G,R)
        i = i+1

# Save to disk
cv2.imwrite('result.png', im)

enter image description here


In case the data file disappears in future, this is how the first few lines look:

1080 1920
232215 18180b 18170b 18180b 18170a 181609 181708 171708 15160c 14170d
15170d 16170d 16160d 16170d 16170d 16170d 15160d 15160d 17170e 17180f
17180f 18180f 191a11 191a12 1c1c0f 1d1d0f 1e1d0f 1f1e10 1e1e10 1f1f12
202013 202113 212214 242413 242413 242413 242412 242410 242611 272610
272612 262712 262710 282811 27290f 2a2b10 2b2c12 2c2d12 2e3012 303210

Keywords: Python, Numpy, OpenCV, parse, hex, hexadecimal, image, image processing, regex

Upvotes: 1

Related Questions