算法学习-图像的数据格式BGR

文章介绍了OpenCV读取图片时采用的BGR格式,与RGB的区别,以及如何从Bitmap转换为BGR格式,强调在某些算法(如yolov5)中BGR格式的重要性。提供了从Bitmap到BGR的转换方法,简化了处理流程。
摘要由CSDN通过智能技术生成

OpenCV学习——图像的BGR格式解读

1. opencv读取的图片数据格式

opencv读取的图片数据格式为numpy的nparray格式。

一张二维图片是由像素点构成,如下图所示:
其中确定了像素点的位置,确定了颜色,通常为三通道RGB
在这里插入图片描述举例:[125,225,3]
对应维度信息表示:
[图片高度,图片宽度,像素BGR值]
[数组行数,数组列数,像素BGR值]
[Height,Width,Channels]

Ps:opencv读取的图片数值为BGR格式,与PIL库读取图片得到的RGB格式不同,因此如果用其他库的imshow函数来显示图片,图片的颜色会发生变化

2. BGR含义

B:Blue
G:Green
R:Red
分别代表三原色,不同的颜色由不同的三原色配比得到。因此,在一张二维图片的像素点数组中,确定行与列后,还会获取该位置三原色的数值,用以表示颜色。
Ps:像素值大小[0,255]

 

我的理解:因为部分例如我熟悉的yolov5需要用到的就是BGR值。所以获取到的图片必须得转成RGB值传入才能进行识别。特别是从TextureView表面纹理获取到的图片,它不是nv21的byte[]格式,而是ARGB_8888的Bitmap。我们只需要将bitmap直接转换成BGR格式存储即可,不需要先将其转换成bmp->nv21->BGR,这中间多了一层。bmp->BGR.

在TextureView里面的onSurfaceTextureUpdated方法中,TextureView.getBitmap方法可用于获取包含当前帧的Bitmap对象,它的格式为 Bitmap.Config.ARGB_8888。然后将Bitmap对象传递给toBgr方法以获取BGR像素数据。此数据可以用于您的图像处理需求。以下为对应的bmp->BGR方法:

public static byte[] toBgr(Bitmap bitmap) {
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    byte[] data = new byte[width * height * 3];

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    for (int i = 0; i < pixels.length; i++) {
        int pixel = pixels[i];
        int r = Color.red(pixel);
        int g = Color.green(pixel);
        int b = Color.blue(pixel);

        data[3 * i] = (byte) b;
        data[3 * i + 1] = (byte) g;
        data[3 * i + 2] = (byte) r;
    }

    return data;
}

获取到BGR格式保存的byte[]数组后,即可以直接使用于一些算法byte[]输入。这些当然是视不同的算法所需的格式而定。而我这边主要是yolov5需要到。

这篇文章引用了opencv获取图片的BGR的一些理解,主要为我个人理解以及深入学习使用。如有冒犯,还请联系我,我将相关内容删除

引用文章的链接:OpenCV学习(2)——图像的数据格式BGR_bgr图像_Run的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiwolf_li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值