2014-10-06 2 views
1

Параметры функции: входного изображения, первый цвет, второй цветСравнение пикселей изображения в цвета RGB

Я принимаю изображение, глядя на высоту и ширину этого тогда итерация через найти пиксель. Если цвет пикселя ближе всего к первому цвету (color1), измените этот цвет на color1, если цвет пикселя ближе всего к color2, затем измените его на color2. Считается, что моя проблема связана с кодом abs(color2-color1)/2 при попытке сравнить два цвета параметров.

void Preprocessor(BMP pix, RGB color1, RGB color2) { 
    int height = pix.GetHeight(); 
    int width = pix.GetWidth(); 

    for (int i = 0; i < height; i++) { 
     for (int j = 0; j < width; j++) { 
      if (pix[i][j]->red + pix[i][j]->green + pix[i][j]->blue > 
       abs(color2 - color1)/2) { // pixel color closest to color1 

       pix[i][j] = color1; 
       pix[i][j] = color1; 
       pix[i][j] = color1; 
      } else { // pixel color closest to color2 
       pix[i][j] = color2; 
       pix[i][j] = color2; 
       pix[i][j] = color2; 
      } 
     } 
    } 
} 
+1

Есть ли реализация 'оператора - (RGB, RGB) 'и' operator/(RGB, int) '? –

+1

Операции 'pix [i] [j] = color1' и' pix [i] [j] = color2' должны выполняться только один раз, но это в основном безвредно. –

+0

Я не думаю, что вы можете выровнять цвета так, как вы делаете на abs(). Вы также сравниваете цвет с разницей в цвете. Я бы порекомендовал посмотреть на этот ответ: http://stackoverflow.com/a/9018153/1928529 В приведенном сравнении вы можете получить расстояние pix [i] [j] <-> color1 en pix [i] [j] <-> color2 , а затем просто проверьте, какой цвет близок к пикселю. – dennisschagt

ответ

1

Выбор правильных метрических

Проблема , какой цвет ближе к этому один не является тривиальной задачей. Для решения этого вопроса может быть несколько подходов. Вы можете грубо иметь такую ​​же яркость или, может быть, оттенок или вибрацию, или что-то еще в этом отношении.

Итак, вы выбрали abs(color2 - color1)/2, и это не имеет интуитивного значения. Вы можете подумать о том, что было вашим аргументом в пользу такого точного подхода.

Предлагаю начать с яркости (вид). Допустим, вы хотите оценить расстояние цвета от другого цвета в метрике Taxicab. И затем выберем меньший.

// Taxicab metric (Manhattan) 
double distance(RGB c1, RGB c2) { 
    return 
      abs(c1->red - c2->red) 
     + abs(c1->green - c2->green) 
     + abs(c1->bule - c2->blue); 
} 

void Preprocessor(BMP pix, RGB color1, RGB color2) { 
    int height = pix.GetHeight(); 
    int width = pix.GetWidth(); 

    for (int i = 0; i < height; i++) { 
    for (int j = 0; j < width; j++) { 
     double d1 = distance(color1, pix[i][j]); 
     double d2 = distance(color2, pix[i][j]); 

     if (d1 < d2) { // pixel color closest to color1 
      pix[i][j] = color1; 
     } else { // pixel color closest to color2 
      pix[i][j] = color2; 
     } 
    } 
    } 
} 

Соображения

Вы можете также поэкспериментировать с другими показателями (евклидовой), а также с другими цветовыми схемами, которые являются более подходящими для comapre таким образом HSV, HSL

Смежные вопросы