矩阵图像数据处理和转换

图像有N种编码,比如JPG,PNG,BMP等等,糟糕的是,图像的数据也有N种编码,RGB,RGBA,ARGB,BGRA,BGR,YUV,HSV等等,单单YUV就有多种编码格式,如NV21,NV12,SP420,sp422等。而最常见RGBA因为alpha通道,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&gt> <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&gt> <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&gt> <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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值