Наверно эти значения имеуют целый тип данных (int32 или int64), а не с плавающей точкой (double).
В результате идёт деление целых с округлением.
Попробуйте
lin_eq = double(img_gray-I_min)/double(I_max-I_min)*double(y_max-y_min)+double(y_min);
Если надо, то результат можно обратно в целый int32 преобразовть (или int64, если надо)
lin_eq = int32(double(img_gray-I_min)/double(I_max-I_min)*double(y_max-y_min)+double(y_min));
А вообще лучше выбрать какую-то стратегию, где у вас целые данные, а где данные с плавающей точкой, чтобы сами переменные были правильного типа.
Ещё есть вариант использовать только целые. Это надо сначала умножить, а потом делить.
lin_eq = ((img_gray-I_min)*(y_max-y_min))/(I_max-I_min)+y_min;
Тут правда есть тонкости, чтобы не было переполнения целого. И округление всегда вниз идёт.