А почему на вход cvThreshold() должны поступать только изображения в градациях серого?
на вход cvThreshold должно поступать одноканальное изображение (да — градации серого, т.е. яркости)
всё логично, т.к. пороговое преобразование работает с яркостью.
Как помним, изображение — это массив пикселей. Нетрудно придумать задачи, когда будет требоваться выбрать пиксели выше(ниже, между) определённого порогового значения.
И тут нам на выручку приходит функция cvThreshold()