YUV 图像左右旋转处理 java实现

YUV 图像左右旋转处理 java实现

android 设备调用后置摄像后,直出图像保存一般存在旋转90度,所以我们需要进行一次旋转,下面是旋转的说明。

以图像编码为 NV21 为例,直出图像为逆时针旋转90度,故需顺时针旋转90度将图像放正。

示例图片逆时针旋转了90度:

示例90.png

正确方向的图片:

示例0.png

NV21 编码为 YYYY VUVU,定义直出的图片宽为 width(200),高为 height(400),YUV 大小为 width*height*3/2

对于 Y 分量来说,大小和图片像素对应,所以Y分量是一个宽高对换过程,而 VU 总共占图片大小的 1/2 且成对出现,因此旋转过程需要把两个作为一个整体旋转,计算是宽高也需选择其中一个进行减半。所以分两部分处理,一部分是Y,另一部分是VU。

1. Y 旋转部分:

Y 旋转比较简单,也就是原图像从上往下遍历,第一行为新图像的右边第一列

代码如下:

public static void main(String[] args) {
   

    int width = 10;
    int height = 6;

    int size = width * height;
    int[] src = new int[size];
    int[] dest = new int[size];

    String format = "%2d";

    for (int i = 0; i < size; i++) {
   
        src[i] = i + 1;
    }

	//核心交换
    for (int i = 0; i < height; i++) {
   
        for (int j = 0; j < width; j++) {
   
            dest[height * (j + 1) - 1 - i] = src[i * height + j];
        }
    }

    //=======输出src===========================
    System.out.println("src:");
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < height; i++) {
   
        for (int j = 0; j < width; j++
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算坏点需要对YUV图像进行处理。具体实现步骤如下: 1. 读取YUV图像,将数据存储在一个数组中。 2. 遍历数组中的每一个像素点,计算该像素点的亮度值Y。 3. 判断该像素点是否为坏点。一般情况下,坏点的亮度值会偏离正常值,所以可以根据一定的阈值来判断该像素点是否为坏点。如果该像素点的亮度值小于阈值,则认为该像素点为坏点。 4. 对于坏点,需要进行修复。一般的修复方法是使用周围像素点的平均值来取代坏点。具体地,可以找到坏点周围一定范围内的正常像素点,然后计算这些像素点的平均值,将平均值作为坏点的修复值。 5. 将修复后的YUV图像保存到文件中。 下面是C++代码实现: ``` #include <iostream> #include <fstream> using namespace std; const int WIDTH = 640; // 图像宽度 const int HEIGHT = 480; // 图像高度 const int THRESHOLD = 50; // 判断坏点的阈值 const int RADIUS = 3; // 坏点修复半径 // 读取YUV图像 void read_yuv(const char* file, unsigned char* yuv) { ifstream in(file, ios::binary); in.read(reinterpret_cast<char*>(yuv), WIDTH * HEIGHT * 3 / 2); in.close(); } // 写入YUV图像 void write_yuv(const char* file, const unsigned char* yuv) { ofstream out(file, ios::binary); out.write(reinterpret_cast<const char*>(yuv), WIDTH * HEIGHT * 3 / 2); out.close(); } // 计算像素点是否为坏点 bool is_bad_pixel(unsigned char* yuv, int x, int y) { int pos = y * WIDTH + x; int y_val = yuv[pos]; return (y_val < THRESHOLD); } // 修复坏点 void fix_bad_pixel(unsigned char* yuv, int x, int y) { int sum = 0; int count = 0; // 计算周围像素点的平均值 for (int i = x - RADIUS; i <= x + RADIUS; i++) { for (int j = y - RADIUS; j <= y + RADIUS; j++) { if (i >= 0 && i < WIDTH && j >= 0 && j < HEIGHT && !is_bad_pixel(yuv, i, j)) { int pos = j * WIDTH + i; sum += yuv[pos]; count++; } } } if (count > 0) { int pos = y * WIDTH + x; yuv[pos] = sum / count; // 用平均值修复坏点 } } // 处理YUV图像 void process_yuv(unsigned char* yuv) { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { if (is_bad_pixel(yuv, x, y)) { fix_bad_pixel(yuv, x, y); } } } } int main() { unsigned char* yuv = new unsigned char[WIDTH * HEIGHT * 3 / 2]; read_yuv("input.yuv", yuv); // 读取YUV图像 process_yuv(yuv); // 处理YUV图像 write_yuv("output.yuv", yuv); // 写入YUV图像 delete[] yuv; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值