уважаемый винни, извините за беспокойство не подскажите, почему промежутки разные на для 0 и 255, и для 1 - 254 ? никак не могу врубиться и еще, как выводится, что max-шума=1/(255*256) ?
В разных вариантах по разному. Достаточно нарисовать картинку (отрезок 0-1), какие точки куда переходят (только взяв константу 4 вместо 256), что бы увидеть что происходит. То что для других целых чисел eps будут не меньше - можно доказать строго, можно сразу увидеть из картинки (эта разница растёт чем ближе к середине отрезка (около 128), и минимальная для 1, 254 )
В варианте f = (b/255.0f), b = min( int(f*256), 255 ) оценка шума появляется как минимальное eps, при котором b = 1 превращается в b = 0 при двойной конвертации int((1/255.0 - eps) * 256). то что int(x) == 0 это значит что x < 1, то надо искать минимальный eps при котором выражение (1/255.0 - eps) * 256 становится меньше единицы.
Разные промежутки - надо рисовать картинки. У меня в посте есть такая картинка (для 16-ти точек), для классического варианта f = b/255.0f , b = int(f*255 + 0.5). На ней точками обозначены куда переходят целые числа, и квадратиками показаны области действительных числах которые переходят в числа 0, 1, ... 15.
спасибо, более менее стало яснее хотя бы понятно, что ошибка выводится опытным путем... получается надо пробежать по 1:255 и найти минимум причем надо как +eps, так и -eps смотреть
кстати, может имеет смысл:
inline float byte2float( unsigned char byte ) { static float delta = 1.001f/255; // 0.001 - меньше, чем 1/255 - т.е. ошибка при умножении не превозойдет 1. Таким образом мы можем регулировать предел шума. return min( delta * byte, 1.0f ); }
inline unsigned char float2byte( float value ) { return int( ( value + eps ) * 255 ); // +eps - учитываем влияние шума }
Comments 34
Reply
Reply
не подскажите, почему промежутки разные на для 0 и 255, и для 1 - 254 ? никак не могу врубиться
и еще, как выводится, что max-шума=1/(255*256) ?
спасибо заранее
Reply
В варианте f = (b/255.0f), b = min( int(f*256), 255 ) оценка шума появляется как минимальное eps, при котором b = 1 превращается в b = 0 при двойной конвертации int((1/255.0 - eps) * 256). то что int(x) == 0 это значит что x < 1, то надо искать минимальный eps при котором выражение (1/255.0 - eps) * 256 становится меньше единицы.
Разные промежутки - надо рисовать картинки. У меня в посте есть такая картинка (для 16-ти точек), для классического варианта f = b/255.0f , b = int(f*255 + 0.5). На ней точками обозначены куда переходят целые числа, и квадратиками показаны области действительных числах которые переходят в числа 0, 1, ... 15.
Reply
хотя бы понятно, что ошибка выводится опытным путем...
получается надо пробежать по 1:255 и найти минимум
причем надо как +eps, так и -eps смотреть
кстати, может имеет смысл:
inline float byte2float( unsigned char byte ) {
static float delta = 1.001f/255; // 0.001 - меньше, чем 1/255 - т.е. ошибка при умножении не превозойдет 1. Таким образом мы можем регулировать предел шума.
return min( delta * byte, 1.0f );
}
inline unsigned char float2byte( float value ) {
return int( ( value + eps ) * 255 ); // +eps - учитываем влияние шума
}
Reply
т.к. когда 1.0f-eps - у нас возникает ошибка округления
и +eps не всегда поможет
Reply
Leave a comment