Intel® Integrated Performance Primitives
Community support and discussions relating to developing high-performance vision, signal, security, and storage applications.
Announcements
This community is designed for sharing of public information. Please do not share Intel or third-party confidential information here.

## Change color value of pixels

Beginner
197 Views

I am looking for a function to do selective change of colors in an image.

I have a RGB 32 image. It basically is white text with black back. I am looking for IPP function or set of functions that can accomplish this:

1. I will provide pixel treshlold for color change. Basically the treshold value is 0xFF (white). Hence say 0xFFFFFF.

2. Now, having provided this value, change the color of all pixels that match 0xFF to any other value I want to.

How can I accomplish this with IPPI library?

9 Replies
Beginner
197 Views

Well, this is as simple as using the threshold functions ippiThreshold<> !!

Employee
197 Views

Look at ippiLUT functions if you can do anything with them.

Regards,
Sergey

Beginner
197 Views

Thank you Segey.

For my issue, the threshold functions worked like a charm!

Beginner
197 Views

Hi Sergey;

Actually I need something like LUT, right you are.

Here is the actual problem I am trying to solve.

I have an image which has any kinds of colors. I want all of them to "fade to" black. So, this is a per pixel operation.

So, in a loop, I will be doing this:

color_value[idx] = color_value[idx] - decreament_value.

This way each color value in the image decreases and tends to zero eventually. What is the best way to accomplish this?

Employee
197 Views

I would use ippiLUT_8u_C3R function with pValues and pLevels as { {0, 1, ..., 255}, {0, 1, ..., 255}, {0, 1, ..., 255} } and then in the loop gradually would decrement them by "decrement_value" until they become 0. If you want "fading" you must call ippiLUT function in each loop iteration. Though, it can be another method. You can use function ippiSubC for that. On Ipp8u data it has saturation effect, i.e. data values will not become less than 0 (in unsigned world it means 0-1=255), so the colors will not be bright again. Check this.

Regards,
Sergey

Beginner
197 Views

Hi Sergey;

Thank you very much. Looks like ippiSubC will definitely accomplish what I need. Let me try that and report back.

Beginner
197 Views

Hi Sergey;

The ippiSubC does cause the image to get "bright" in the loop due to the reason you mentioned.

LUT approach seems to be best one. However, I have not seen an example of the usage. This is how I am setting up the values for the function:

Ipp8u rValues[256], gValues[256], bValues[256], aValues[256];
Ipp8u rLevels[256], gLevels[256], bLevels[256], aLevels[256];

for (int vdx = 0; vdx < 256; ++ vdx) {
rValues[vdx] = vdx;
gValues[vdx] = vdx;
bValues[vdx] = vdx;
aValues[vdx] = 0;
rLevels[vdx] = vdx;
gLevels[vdx] = vdx;
bLevels[vdx] = vdx;
aLevels[vdx] = 0;
}

Ipp8u * colorValues[4] = {rValues, gValues, bValues, aValues};
Ipp8u * colorLevels[4] = {rLevels, gLevels, bLevels, aLevels};
int nColorLevels[4];

status = ippiLUT_8u_AC4R(src, srcStrp, dst, dstStep, ROISize, (const Ipp32s **)colorValues, (const Ipp32s **)colorLevels, nColorLevels);

I am not yet clear on what nColorLevels is. How will this achieve the fading effect.

I guess my question is, I am not clear on the usage of the LUT function.

Employee
197 Views

It mustn't be so (I mean SubC). Look at the test below:
[cpp]
Ipp8u testImage[] = {
6, 6, 6, 6,
6, 6, 6, 6,
6, 6, 6, 6,
6, 6, 6, 6
};
const Ipp8u subVal[3] = { 2, 2, 2 };
int main()
{
int i, j;
IppiSize roiSize = { 4, 4 };
ippInit();
for(i=0; i < 10; i++) {
ippiSubC_8u_AC4IRSfs(subVal, testImage, 4, roiSize, 0);
printf("Step: %d Image=", i+1);
for(j = 0; j <sizeof(testImage); j++)
printf("%d ", testImage);
printf("\n");
}
}
[/cpp]

It generates:
Step: 1 Image=4 4 4 6 2 2 2 6 0 0 0 6 0 0 0 6
Step: 2 Image=2 2 2 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 3 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 4 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 5 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 6 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 7 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 8 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 9 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6
Step: 10 Image=0 0 0 6 0 0 0 6 0 0 0 6 0 0 0 6

Isn't it what you wanted?

Regards,
Sergey

Beginner
197 Views

Hi Sergey;

Yes, you are right. I looked into my code again. I am not using in place SubC function.

This is what I was doing wrong:

I had set the SubVal[] to be {2, 2, 2} (or say some other value). Because my SubC function was not inplace change, I had to increament this SubVal in my loop so that the color faded during each loop:

This way

dst = src - SubVal;

dst = src - (SubVal + increament)

... and so on.