我正在尝试处理YUY2图像(Y,Cb,Cr)。我需要过滤图像并消除所有颜色,但红色着色。我使用Image Processing Lab来查找元素Y,Cb,Cr的值。我找到了值(您可以通过过滤看到图像):
编辑:试图弄清楚图像没有显示的原因 - 无论如何,图像有一些YUY元素的值可以根据要求进行过滤。
我编写了一个使用此值从带有过滤器的摄像机读取视频的代码,但它没有过滤好。 这是过滤图像的图像:
编辑:图像过滤后的图像中的一些蓝色,而图片的其余部分没有变化(有白色,蓝色,灰色) - 第一个图像过滤了所有颜色但是红色。
这是我的代码:
#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;
}
任何提示为什么它不会将图像过滤为图像处理实验室中的图像?
答案 0 :(得分:2)
发表评论的时间太长了......
这是YUY2的包装方式
我没有看到你正确索引上面的铬平面...
c(和SDL)中的此循环将所有Cb像素设置为值0x80:
for (Uint32 i = 1; i < W * H * 2; i += 4) {
*(my_overlay->pixels[0] + i) = 0x80;
}
像素值的允许范围是整数0-255
(实际上认为要复杂得多)。上面的程序似乎使用0-1
之间的标准化值。你是如何进行规范化的?
希望这有帮助,如果没有,请给我发表评论。