2015-06-27 66 views
1

我在测试以下函数时不断收到此错误。它应该对包含0到255像素颜色的图像的值进行归一化处理。我发现最小值和最大值将它们更改为0和255,然后相应地更改所有中间值以适应以前相同的差异比例:浮点异常C

void normalize(uint8_t array[], 
     unsigned int cols, 
     unsigned int rows) 
{ 
    uint8_t minValue = 255; 
    uint8_t maxValue = 0; 

    for (int i = 0; i < cols*rows ; ++i) 
    { 
     if(array[i] < minValue) minValue = array[i]; 
    } 

    for (int i = 0; i < cols*rows; ++i) 
    { 
     if(array[i] < maxValue) maxValue = array[i]; 
    } 

    int difference1 = maxValue - minValue; 

    uint8_t ratios[cols*rows]; 

    for (int i = 0; i < cols*rows ; ++i){ 
    ratios[i] = 0; 
    } 

    //find the ratios 
    for (int i = 0; i < cols*rows ; ++i){ 
    ratios[i] = (array[i]/difference1) - 1; 
    } 

    for (int i = 0; i < cols*rows ; ++i){ 

    if(array[i] == minValue){ 
     array[i] = 0; 
    }else if(array[i] == maxValue){ 
     array[i] = 255; 
    }else{ 
     array[i] = round(ratios[i] * 255); 
    } 
    } 
} 
+2

你得到一个除以零错误时'difference1'为零 –

+2

而'difference1'是0,因为'minValue'等于' maxValue',只要图像上有黑色像素。 – francis

+0

谢谢!我完全没有看到if语句中的错误。 – user5056973

回答

2

错误计算最大值。

即使代码应该如下,那不是全部。

// if(array[i] < maxValue) maxValue = array[i]; 
if(array[i] > maxValue) maxValue = array[i]; 

代码应该仍然工作,如果所有的像素都是相同的颜色(difference1 == 0)。在这种情况下,一个简单的解决方案是单独离开array[]

int difference1 = maxValue - minValue; 
if (difference1 > 0) { 
    uint8_t ratios[cols*rows]; 
    ... 
     array[i] = round(ratios[i] * 255); 
    } 
    } 
} 
1

是这样的正确吗?

空隙正规化(uint8_t阵列[], 无符号整型COLS, 无符号整型行) {

//each pixel is rounded by 255 * (index-lowest_pixel_val_in_array) divided by (highest value pixel minus lowest value pixel) 

// your code here 
uint8_t minValue = 255; //255 means WHITE 
uint8_t maxValue = 0; // 0 MEANS BLACK 

for (int i = 0; i < cols*rows ; ++i) //PREINCREMENT means if i= 1 and j=++i=2/ 
{ 
    if(array[i] < minValue) 
minValue = array[i]; //make minimum value the array 

    if(array[i] > maxValue) 
maxValue = array[i]; //make maximum value for array 
} 

int difference = maxValue - minValue; //the difference is maximum - minimum 

// uint8_t比率[COLS *行数]; // CHANGED把这个INSIDE

if(difference > 0) //ENSURE MAX != MIN 
{ 
uint8_t ratios[cols*rows]; //CHANGED PUT THIS INSIDE 
for (int i = 0; i < cols*rows ; ++i) //PREINCREMENT means if i= 1 and j=++i. j becomes 2 but for i++ j wuld be 1 
{ 
     ratios[i] = 0; //SET IT 0 INTIALLY. 
     ratios[i] = (array[i]/difference) - 1; //subtract 1st pixel and CALCULATE RATIOS 


     if(array[i] == minValue) 
      { 
      array[i] = 0; //lightest becomes darkest 
      } 

     else if(array[i] == maxValue) 
     { 
      array[i] = 255; //darkest becomes lightest 
      } 

     else 
     { 
      array[i] = round(ratios[i] * 255); //ROUND THE PIXEL 
      } 
} 
} 

}