YUY2过程映像故障

时间:2013-05-16 13:08:35

标签: image-processing yuv

我正在尝试处理YUY2图像(Y,Cb,Cr)。我需要过滤图像并消除所有颜色,但红色着色。我使用Image Processing Lab来查找元素Y,Cb,Cr的值。我找到了值(您可以通过过滤看到图像):Image Processing Lab

编辑:试图弄清楚图像没有显示的原因 - 无论如何,图像有一些YUY元素的值可以根据要求进行过滤。

我编写了一个使用此值从带有过滤器的摄像机读取视频的代码,但它没有过滤好。 这是过滤图像的图像:

result of running the filter 编辑:图像过滤后的图像中的一些蓝色,而图片的其余部分没有变化(有白色,蓝色,灰色) - 第一个图像过滤了所有颜色但是红色。

这是我的代码:

#define _WIDTH 640
#define _HEIGHT 480

#define _MinY .173
#define _MaxY .737
#define _MinB -.189
#define _MaxB .106
#define _MinR .084
#define _MaxR .324

typedef struct YUY2_struct
{
    UINT8 y0, b, y1, r;
}YUY2;

HRESULT SampleGrabberCallback::LineDetection(YUY2 *pD ,float arr[])
{
int LineCount = 0;
int LineSum = 0;
YUY2 *tempLocation = pD;

UINT8 MinY = (UINT8)(255 * _MinY);
UINT8 MaxY = (UINT8)(255 * _MaxY);
UINT8 MinR = (UINT8)((_MinR + 0.5) * 255);
UINT8 MaxR = (UINT8)((_MaxR + 0.5) * 255);
UINT8 MinB = (UINT8)((_MinB + 0.5) * 255);
UINT8 MaxB = (UINT8)((_MaxB + 0.5) * 255);

for (int i = 0; i < _WIDTH * _HEIGHT / 2; ++i)
{
    if ((tempLocation->b > MinB) && (tempLocation->b < MaxB) && (tempLocation->r > MinR) && (tempLocation->r < MaxR))
    {
        //for 1st pixel
        if ((tempLocation->y0 < MaxY) && (tempLocation->y0 > MinY))
        {
            tempLocation->b = 128;
            tempLocation->r = 128;
            tempLocation->y0 = 0;
        }

        //for 2nd pixel
        if ((tempLocation->y1 < MaxY) && (tempLocation->y1 > MinY))
        {
            tempLocation->b = 128;
            tempLocation->r = 128;
            tempLocation->y1 = 0;
        }
    }

    tempLocation += 1;
}
return NOERROR;
}

任何提示为什么它不会将图像过滤为图像处理实验室中的图像?

1 个答案:

答案 0 :(得分:2)

发表评论的时间太长了......

这是YUY2的包装方式

YUY2 packing

  • Y是luma
  • Cb或U是蓝色成分
  • Cr或V是红色成分

我没有看到你正确索引上面的铬平面...

c(和SDL)中的此循环将所有Cb像素设置为值0x80:

for (Uint32 i = 1; i < W * H * 2; i += 4) {
    *(my_overlay->pixels[0] + i) = 0x80;
}

像素值的允许范围是整数0-255(实际上认为要复杂得多)。上面的程序似乎使用0-1之间的标准化值。你是如何进行规范化的?

希望这有帮助,如果没有,请给我发表评论。