画像のエンコーディングは JPG、PNG、BMP など N 種類あります。さらに悪いことに、画像データにも RGB、RGBA、ARGB、BGRA、BGR、YUV、HSV などの N 種類のエンコーディングがあります。YUV だけでもNV21、NV12、SP420、sp422 などの複数のエンコーディング形式があります。最も一般的な RGBA では、アルファ チャネル、B チャネル、R チャネルの順序が異なるため、異なる表示ソリューションが必要になります。これは、画像処理、画像変換、画像表示に関する研究に多大な不便をもたらします。特にクロスプラットフォームでの画像送信やストリーミングの場合、注意しないと文字化けや色ずれが多発します。
画像エンコードと画像データのエンコードは異なります。たとえば、JPG は画像エンコードです。デコード後、画像データを取得します。このデータは通常、色情報の配列です。一部のシステムでは、この配列をデコードして GBR を取得できます取得したデータの一部はRGBデータであり、どちらも色情報ですがメモリ上の順序が異なり、表示上ではRチャンネルとBチャンネルが逆になります。
ほとんどの場合、実際には画像データをトランスコードする必要はなく、より多くの画像形式の変換が行われます。AI 認識など、処理速度に非常に敏感な一部のシステムでは、システムのニーズに応じてデータのトランスコーディングを行う必要があります。変換プロセス中のデータの一貫性と完全性を確保するために、デバッグ段階でデータを保存する必要がありますが、保存されるのは RGB、BGR、YUV などの裸のデータであり、これらの裸のデータは直観的に表示することができません。いくつか調べて、Opencvを使用して表示しました。データ転送中の整合性と一貫性をチェックするために使用されます。
YUV420画像表示
from PIL import Image
import sys
from struct import *
import array
if len(sys.argv) != 4:
print "***** Usage syntax Error!!!! *****\n"
print "Usage:"
print "python <script> <.yuv file yuv420p> <width>> <height> "
sys.exit(1) # exit
else:
pass
image_name = sys.argv[1]
width = int(sys.argv[2])
height = int(sys.argv[3])
y = array.array('B')
u = array.array('B')
v = array.array('B')
f_y = open(image_name, "rb")
f_uv = open(image_name, "rb")
f_uv.seek(width*height, 1)
image_out = Image.new("RGB", (width, height))
pix = image_out.load()
print "width=", width, "height=", height
for i in range(0, height/2):
for j in range(0, width/2):
u.append(ord(f_uv.read(1)));
for i in range(0, height/2):
for j in range(0, width/2):
v.append(ord(f_uv.read(1)));
for i in range(0,height):
for j in range(0, width):
y.append(ord(f_y.read(1)));
#print "i=", i, "j=", j , (i*width), ((i*width) +j)
#pix[j, i] = y[(i*width) +j], y[(i*width) +j], y[(i*width) +j]
Y_val = y[(i*width)+j]
U_val = u[((i/2)*(width/2))+(j/2)]
V_val = v[((i/2)*(width/2))+(j/2)]
B = 1.164 * (Y_val-16) + 2.018 * (U_val - 128)
G = 1.164 * (Y_val-16) - 0.813 * (V_val - 128) - 0.391 * (U_val - 128)
R = 1.164 * (Y_val-16) + 1.596*(V_val - 128)
pix[j, i] = int(R), int(G), int(B)
######################################################
# B = 1.164(Y - 16) + 2.018(U - 128)
# G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
# R = 1.164(Y - 16) + 1.596(V - 128)
######################################################
#image_out.save("out.bmp")
image_out.show()
YUV422画像表示
from PIL import Image
import sys
from struct import *
import array
if len(sys.argv) != 4:
print "***** Usage syntax Error!!!! *****\n"
print "Usage:"
print "python <script> <.yuv file uyvy422> <width>> <height> "
sys.exit(1) # exit
else:
pass
image_name = sys.argv[1]
width = int(sys.argv[2])
height = int(sys.argv[3])
y = array.array('B')
u = array.array('B')
v = array.array('B')
f_uyvy = open(image_name, "rb")
f_uv = open(image_name, "rb")
f_uv.seek(width*height, 1)
image_out = Image.new("RGB", (width, height))
pix = image_out.load()
print "width=", width, "height=", height
for i in range(0,height):
for j in range(0, width/2):
u = ord(f_uyvy.read(1));
y1 = ord(f_uyvy.read(1));
v = ord(f_uyvy.read(1));
y2 = ord(f_uyvy.read(1));
B = 1.164 * (y1-16) + 2.018 * (u - 128)
G = 1.164 * (y1-16) - 0.813 * (v - 128) - 0.391 * (u - 128)
R = 1.164 * (y1-16) + 1.596*(v - 128)
pix[j*2, i] = int(R), int(G), int(B)
B = 1.164 * (y2-16) + 2.018 * (u - 128)
G = 1.164 * (y2-16) - 0.813 * (v - 128) - 0.391 * (u - 128)
R = 1.164 * (y2-16) + 1.596*(v - 128)
pix[j*2+1, i] = int(R), int(G), int(B)
######################################################
# B = 1.164(Y - 16) + 2.018(U - 128)
# G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
# R = 1.164(Y - 16) + 1.596(V - 128)
######################################################
#image_out.save("out.bmp")
image_out.show()
BGR画像表示
from PIL import Image
import sys
from struct import *
import array
if len(sys.argv) != 4:
print "***** Usage syntax Error!!!! *****\n"
print "Usage:"
print "python <script> <.bgr file bgr> <width>> <height> "
sys.exit(1) # exit
else:
pass
image_name = sys.argv[1]
width = int(sys.argv[2])
height = int(sys.argv[3])
y = array.array('B')
f_y = open(image_name, "rb")
image_out = Image.new("RGB", (width, height))
pix = image_out.load()
print "width=", width, "height=", height
for i in range(0, height):
for j in range(0, width*3):
y.append(ord(f_y.read(1)));
for i in range(0,height):
for j in range(0, width):
B = y[(i*width*3)+j*3]
G = y[(i*width*3)+j*3+1]
R = y[(i*width*3)+j*3+2]
pix[j, i] = int(R), int(G), int(B)
image_out.save("out.bmp")
image_out.show()
RGBは簡単で、上記のプログラムはRとBの位置を入れ替えることなくRGBを表示することができます。