非整数倍率YUV422图像的自由缩放算法

下面的代码,实现将一幅YUV422的双通道图片(640x480大小),取中间区域(560x400大小)使用插值的办法放大至(640x480)。这个算法可以用来实现将图片外围区域截掉。

#define X_RATIO (8)
#define Y_RATIO (6)

PUBLIC void YUVScale(JINF_YUV_CHN_T *const yuv_ptr,const uint32 Width,const uint32 Height)
{
uint8  *const src_y_ptr = (uint16 *)yuv_ptr->y_chn_ptr;
uint8  *const src_uv_ptr = (uint16 *)yuv_ptr->u_chn_ptr;

uint32  x,y,w,h=0,xl,yl,dx,dy;

if ((Width%(X_RATIO<<1)!=0)||(Height%(Y_RATIO<<1)!=0))
{
TRACE("%s Width=%d,Height=%d",__func__,Width,Height);
return;
}

ASSERT(PNULL != yuv_ptr);

xl=(Width-(Width/X_RATIO))>>1;
yl=(Height-(Height/Y_RATIO))>>1;

dx=Width / (X_RATIO<<1);
dy=Height / (Y_RATIO<<1);

for (y=0; y<yl; y++,h++)
{
w = 0;

for (x=0; x<xl; x+=2,w+=2)
{
CopyPixel:
//2 Quadrant 2
src_y_ptr[h*Width+w] = src_y_ptr[(dy+y)*Width+dx+x];
src_y_ptr[h*Width+w+1] = src_y_ptr[(dy+y)*Width+dx+x+1];
src_uv_ptr[h*Width+w] = src_uv_ptr[(dy+y)*Width+dx+x];
src_uv_ptr[h*Width+w+1] = src_uv_ptr[(dy+y)*Width+dx+x+1];
//2 Quadrant 1
src_y_ptr[h*Width+(Width-w-1)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_y_ptr[h*Width+(Width-w-2)] = src_y_ptr[(dy+y)*Width+(Width-dx-x-2)];
src_uv_ptr[h*Width+(Width-w-1)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-1)];
src_uv_ptr[h*Width+(Width-w-2)] = src_uv_ptr[(dy+y)*Width+(Width-dx-x-2)];
//2 Quadrant 4
src_y_ptr[(Height-h-1)*Width+(Width-w-1)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_y_ptr[(Height-h-1)*Width+(Width-w-2)] = src_y_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-1)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-1)];
src_uv_ptr[(Height-h-1)*Width+(Width-w-2)] = src_uv_ptr[(Height-dy-y-1)*Width+(Width-dx-x-2)];
//2 Quadrant 3
src_y_ptr[(Height-h-1)*Width+w] = src_y_ptr[(Height-dy-y-1)*Width+dx+x];
src_y_ptr[(Height-h-1)*Width+w+1] = src_y_ptr[(Height-dy-y-1)*Width+dx+x+1];
src_uv_ptr[(Height-h-1)*Width+w] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x];
src_uv_ptr[(Height-h-1)*Width+w+1] = src_uv_ptr[(Height-dy-y-1)*Width+dx+x+1];

if (
((w+2) % (X_RATIO<<1))==
((X_RATIO<<1)-2)
)
{
w+=2;
goto CopyPixel;
}
}

if (((h+1) % (Y_RATIO))==(Y_RATIO-1))
{
h++;

memcpy(src_y_ptr+h*Width,src_y_ptr+(h-1)*Width,Width);
memcpy(src_uv_ptr+h*Width,src_uv_ptr+(h-1)*Width,Width);

memcpy(src_y_ptr+(Height-h-1)*Width,src_y_ptr+(Height-h)*Width,Width);
memcpy(src_uv_ptr+(Height-h-1)*Width,src_uv_ptr+(Height-h)*Width,Width);
}
}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: YUV422是一种颜色空间格式,其中Y表示亮度分量,U和V表示色度分量。YUV422图像偏红可能有多种原因,以下是一些可能的原因: 1. 白平衡偏移:白平衡是指摄像机或图像处理软件自动调整图像的色温,以使白色看起来真正的白色。如果白平衡不正确,图像中的所有颜色都会有所偏移,这可能导致图像偏红。 2. 摄像机感光元件问题:如果摄像机的感光元件损坏或老化,它可能会导致某些颜色偏移,从而导致图像偏红。 3. 色彩空间转换问题:在从一种颜色空间转换为另一种颜色空间时,如果不正确地执行此操作,可能会导致某些颜色偏移,从而导致图像偏红。 4. 光源问题:在不同类型的灯光下,颜色可能会有所偏移,例如在白炽灯下,图像可能会偏黄,在荧光灯下,图像可能会偏绿,在LED灯下,图像可能会偏蓝或红。 ### 回答2: YUV422是一种图像压缩格式,它使用亮度(Y)和色度(U、V)来表示图像的颜色信息。其中,亮度通道(Y通道)代表图像的亮度信息,而色度通道(U和V通道)代表图像的色彩信息。 当YUV422图像偏红时,主要有以下几个可能的原因: 1. 摄像设备问题:图像采集设备中的传感器或镜头可能存在问题,导致采集到的红色信号过强。例如,摄像设备的白平衡设置不正确,可能导致红色信号过饱和或过度增强。 2. 数字化转换问题:YUV422图像经过模数转换(ADC)和数模转换(DAC)等过程后,可能会出现信号失真或偏移,导致红色信号异常。 3. 图像处理参数设置错误:在图像处理过程中,如果对红色通道的处理参数设置不当,如色彩平衡或色度饱和度调节不正确,可能导致红色偏向较强。 4. 环境光线干扰:光线的色温或光源的颜色偏差可能导致图像中红色偏向过强。例如,灯光为暖色调时,红色光线增强可能会导致图像偏红。 要解决YUV422图像偏红的问题,可以采取以下措施: 1. 检查摄像设备的设置,确保白平衡和色彩参数正确设置,并适当调整。 2. 调整数字化转换过程中的参数,确保转换质量良好,减少信号失真。 3. 对图像进行后期处理时,合理调整红色通道的参数,如色彩平衡、色度饱和度等,使红色更接近真实。 4. 优化环境光源,选择适合的灯光色温,减少光源颜色对图像的干扰。 以上是关于YUV422图像偏红原因的回答,希望能对您有所帮助! ### 回答3: YUV422图像偏红的原因可能有以下几个方面: 第一,可能是采集设备的颜色校准出现问题。YUV422是一种色差信号格式,其中Y表示亮度信号,U和V分别表示蓝色和红色的色度差信号。如果摄像机或采集设备的颜色校准不准确,就会导致U和V信号的偏移,进而造成图像整体偏红。 第二,可能是光源的问题。光源的颜色温度和色谱分布会直接影响到图像的色彩表现。如果使用的光源偏向红色,或者存在其他颜色偏移的情况,那么采集到的图像就会呈现偏红的色调。 第三,可能是显示设备的问题。显示设备的颜色校准也可能造成图像的颜色偏移。如果显示设备的颜色设置错误或老化,就会导致图像呈现偏红的效果。 第四,可能是图像处理算法的问题。在图像处理过程中,可能会应用色彩平衡算法或其他修正算法。如果这些算法的参数设置不合理或操作错误,就可能导致图像偏红。 综上所述,YUV422图像偏红的原因可能涉及采集设备的颜色校准、光源、显示设备以及图像处理算法等多个方面。如果遇到这种情况,可以尝试调整设备的颜色设置、更换合适的光源,或者检查图像处理参数,以改善图像颜色的表现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值