2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Линейное контрастирование в MATLAB
Сообщение26.09.2021, 13:15 
Необходимо выполнить линейное контрастирование в MATLAB вручную.

Выражение для изображения в градациях серого
Используется синтаксис Matlab M
lin_eq = (img_gray-I_min)/(I_max-I_min)*(y_max-y_min)+y_min;
дает на выходе бинарное изображение со значениями элементов, соответствующим $y_{\max}$ и $y_{\min}$.

При этом данное выражение
Используется синтаксис Matlab M
lin_eq = (img_gray-I_min)*((y_max-y_min)/(I_max-I_min))+y_min;
дает изображение без изменений, если диапазон значений интенсивности на выходе более узкий, чем исходный. Если диапазон необходимо расширить, работает корректно.

Где может быть допущена ошибка и как возможно достичь корректной работы для случаев и сжатия, и растяжения?

 
 
 
 Re: Линейное контрастирование в MATLAB
Сообщение26.09.2021, 20:33 
Наверно эти значения имеуют целый тип данных (int32 или int64), а не с плавающей точкой (double).
В результате идёт деление целых с округлением.
Попробуйте
Используется синтаксис Matlab M
lin_eq = double(img_gray-I_min)/double(I_max-I_min)*double(y_max-y_min)+double(y_min);

Если надо, то результат можно обратно в целый int32 преобразовть (или int64, если надо)
Используется синтаксис Matlab M
lin_eq = int32(double(img_gray-I_min)/double(I_max-I_min)*double(y_max-y_min)+double(y_min));


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

Тут правда есть тонкости, чтобы не было переполнения целого. И округление всегда вниз идёт.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group