Black image problem while multiplying intensity with a float

asked 2019-07-01 07:58:51 -0500

Hi, I have a 1D array containing floating values and I want to multiply the corresponding values to the intensity of a chosen color to get a sense of the values of an array.

 for (int j = 0; j < 39; j++)
{
    for (int i = 0; i < 39; i++)
    {
        imtest.at<cv::Vec4b>(i,j)[0] = 255 * ro[j*39 + i];
        imtest.at<cv::Vec4b>(i,j)[1] = 0;
        imtest.at<cv::Vec4b>(i,j)[2] = 0;
        imtest.at<cv::Vec4b>(i,j)[3] = 150*ro[j*39 + i];
    }

}

This is how I do it. The values in the middle of that array have higher values than one(1.01-1.1) hoping that these values will give me the shape of the "bubble". However, I get a black bubble with a blue border instead of a blue one.

So trying to find the issue, I expanded the code as below.

int n = 1;
double* k = new double[n];
k[0] = 1.08455576996775482;
double test = ro[39*15 + 15];
//k[0] = test;
for (int j = 0; j < 39; j++)
{
    for (int i = 0; i < 39; i++)
    {
        imtest2.at<cv::Vec4b>(i,j)[0] = 255 * k[0];//ro[15*39 + 15];//ro[j*39 + i];
        imtest2.at<cv::Vec4b>(i,j)[1] = 0;//255 * 1.2;
        imtest2.at<cv::Vec4b>(i,j)[2] = 0;//255 * 1.2;
        imtest2.at<cv::Vec4b>(i,j)[3] = 150 * ro[j*39 + i];
    }

}
std::cout.precision(18);
std::cout << ro[15*39 + 15] << std::endl;
std::cout << k[0] << std::endl;
std::cout << 1.08455576996775482 << std::endl;

cv::imwrite("color.png",imtest2);
cv::imwrite("slice.png",imtest);

The last section with 3 print statements have exactly the same value of 1.08455576996775482 on the console but if I assign the value of ro[15*39 + 15] directly into the k[0] or via any double variable I get black bubble as expected.

However, if I directly assign the value to the k[0] or test I get a blue bubble as below.

In other words, if I delete the commenting of the k[0] = test line I get black bubble and if I comment that line I get a blue bubble with the same code. This bug, or whatever it is, has become very confusing to me and I have no explanation to it with my limited c++ knowledge. Thanks in advance to anyone who helps to interpret this issue.

edit retag flag offensive close merge delete

Comments

it's unclear, what you try to achieve here, but you probably should not write for loops like that at all, it's a clear anti-pattern using opencv

berak gravatar imageberak ( 2019-07-01 08:05:38 -0500 )edit

I have an I'd array with 39x39 values. Sort of "vectorized" array containing the values of 39x39 mesh. And each value on that mesh has varying values from 0 - 1.1 or so. Thus, if I multiply these values to a certain intensity. I should get the picture visually depicting the array with colored places having values close to 1. And I get I these type of pictures but with black color instead of a blue one which the code I've written should have given. The problem here is if I explicitly take one value from that black colored section, let's say (15,15) and I explicitly assign it to a variable as below.

k[0] = 1.08455576996775482;

I get a blue picture. But if I do the following

double test = ro[39*15 + 15];
k[0] = test;

I get a black picture again.

orkhan99 gravatar imageorkhan99 ( 2019-07-01 08:19:44 -0500 )edit

The last 4 print statements are giving exactly the same value on the console.

orkhan99 gravatar imageorkhan99 ( 2019-07-01 08:22:48 -0500 )edit