- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

The returned range of the Y channel is different than it should be, i.e., it has a maximum of 255 value, though as it says in the documentation and in theory that it cannot be greater than 235.

Below is the source code that I used:

_________________________________________________________________________________________

void getY_8u(Ipp8u* pSrc, int srcStep, Ipp8u* pDst, int dstStep, IppiSize roiSize)

{

IppStatus sts = ippiCopy_8u_C3C1R(pSrc+0, srcStep, pDst, dstStep, roiSize);

assert(sts==ippStsNoErr || sts!=ippStsNullPtrErr || sts!=ippStsSizeErr || sts!=ippStsStepErr);

}

IppStatus sts;

int srcStep;

Ipp8u* pSrcYCbCr = ippiMalloc_8u_C3(imgWidth, imgHeight, &srcStep);

int dstStep = srcStep;

sts = ippiRGBToYCbCr_8u_C3R(pSrc,srcStep,pSrcYCbCr,srcStep,srcRoiSize); //RGB to YCbCr conversion

assert(sts==ippStsNoErr || sts!=ippStsNullPtrErr || sts!=ippStsSizeErr);

int srcYstep;

Ipp8u* pSrcY = ippiMalloc_8u_C1(imgWidth , imgHeight, &srcYstep); //Y channel

getY_8u(pSrc, srcStep, pSrcY, srcYstep, srcRoiSize);

Ipp8u max,min;

sts = ippiMax_8u_C1R(pSrcY, srcYstep, srcRoiSize, &max);

sts = ippiMin_8u_C1R(pSrcY, srcYstep, srcRoiSize, &min);

_________________________________________________________________________________________

When I do the same rgb2ycbcr operation in matlab, it produces a maximum of 226 for the same image while ipp function produces 255.

What could be wrong?

Best regards.

Link Copied

8 Replies

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

could you please provide input RGB values for the point where you believeyou get wrong YCbCr result?

Regards,

Vladimir

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I've checked for one of the pixel location for which 255 is produced, and found out that the corresponding RGB values are 91,207,89, respectively.

The Y channel output for that triple should be (0.257*91) + (0.504*207) + (0.098*89) + 16 =152.4370.

I give the code below, which I find matching pixel locations in input image, for generated 255 values:

________________________________________________________________________________________

for (int i=0; i

for (int j=0; j

if ( pSrcY[i*srcYstep+j] == max )

{

printf("%d\n%d\n%d\n",pSrc[i*srcStep+j],pSrc[i*srcStep+j+1],pSrc[i*srcStep+j+2]);

}

________________________________________________________________________________________

My input image has 512*512 size, and hence, srcYstep=512, srcStep=512x3=1536 .

Thanks..

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

I changed the printf code to

**printf("%d\n",(Ipp8u)0.257*pSrc[i*srcStep+j]+0.504*pSrc[i*srcStep+j+1]+0.098*pSrc[i*srcStep+j+2]+16);**

which prints out a value 1133871366 . How can a value such that big can be produced with integer arithmetic of

range 0-255 ?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

**printf("%d\n",(Ipp8u)((0.257*(float)pSrc[i*srcStep+j])+(0.504*(float)pSrc[i*srcStep+j+1])+(0.098*(float)pSrc[i*srcStep+j+2])+16));**

but, why

**ippiRGBToYCbCr_8u_C3R**function can't produce this value? Maybe it doesnt implicitly cast the rgb values to float type prior to arithmetic, and so the previous wrong value of1133871366is generated and converted to the biggest value of the range,i.e.,255 .- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

**getY_8u**.. so its normal to see 255 values in Y image..

this thread can be removed..

Best regards.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Vladimir

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

it was all my fault that I used wrong input, sorry,

this thread can be removed..

Thank you.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Vladimir

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page