А можно посмотреть пример артефактов на контрастных границах?
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
Этот кусок кода используется везде, где используется RawSpeed (darktable из сколько-нибудь популярных программ. Ну и FastRawViewer, да).
Совершенно аналогичный по смыслу кусок кода (но гораздо хуже написанный в смысле понятности) используется везде, где для чтения RAW применяется исходник dcraw. Из популярных программ - ACDSee, FastStone (и много других, покажите программу и я скажу, есть там внутри dcraw или нету).
Совершенно аналогичный по смыслу кусок кода, чуть-чуть облагороженный из dcraw, используется везде, где для чтения RAW применяется библиотека LibRaw.
Совершенно аналогичный по смыслу кусок кода используется Adobe - это очевидно, если сравнить результаты Adobe DNG Converter и, к примеру, результаты unprocessed_raw из LibRaw.
ee2:А можно посмотреть пример артефактов на контрастных границах?
Вот самый полный текст на эту тему: http://www.rawdigger.com/howtouse/sony-craw-arw2-posterization-detection
(смешно, но на русском его у нас нет, есть кусочки в моем блоге)
AlexTutubalin, вы можете это повторить хоть сто раз, но код - это не пустые разглагольствования и повторения мантр. Он работает одинаково вне зависимости от количества пользователей, ему не доверяющих или в него верующих
И любой человек, обладающий зачатками знаний, может посмотреть его и убедиться в том что вы ошибаетесь
Мне одно интересно - вы действительно не понимаете своей ошибки, или сознательно решили продолжить ездить по ушам доверчивым пользователям?
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
Ну да.
А если знаний чуть больше - добавьте в dcraw в функцию sony_arw2_load_raw() отладочную печать "ой-ой, меня вызвало", напустите на файл с БЗК и убедитесь - вызывается. Именно этот (по смыслу) код.
Или в darktable, где RawSpeed, где он не по смыслу такой, а ровно этот.
Def:Мне одно интересно - вы действительно не понимаете своей ошибки, или сознательно решили продолжить ездить по ушам доверчивым пользователям?
Ну да, я "действительно не понимаю своей ошибки" - ставлю в отладчике breakpoint - и при чтении "файлов с БЗК" попадаю ровно вот в этот код. Сюрприз.
Я, видите ли, программы-библиотеки для чтения RAW немножко, самую чуточку, разрабатываю.
Прикольно. Малопонятно, конечно, откуда такое влияние на весь блок. Похоже 7-битная дельта дополнительно как-то нормализуется к диапазону блока при сжатии, чистая дельта не должна так поганить блок целиком...
P.S. Только что проверил ППЗ A37, A58, A77, A77II - все четыре тоже выдают 8-битные RAW.
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
ee2:Прикольно. Малопонятно, конечно, откуда такое влияние на весь блок 16х16. Похоже 7-битная дельта дополнительно как-то нормализуется к диапазону блока при сжатии, чистая дельта не должна так поганить блок целиком...
Там блок 32x1
Но если в этом блоке есть большой перепад яркостей (попал трек звезды и темное небо вокруг), то шаг дельты будет большой. Потому что нужно в 7 бит дельты закодировать большой размах т.е. единичный шаг надо делать большим.
Соответственно, трек пересекает много вот таких блоков - и получается квадратный (прямоугольный) артефакт. Он будет квадратным если трек под 45 градусов.
AlexTutubalin:Ну да.
А если знаний чуть больше - добавьте в dcraw в функцию sony_arw2_load_raw() отладочную печать "ой-ой, меня вызвало", напустите на файл с БЗК и убедитесь - вызывается. Именно этот (по смыслу) код.
Или в darktable, где RawSpeed, где он не по смыслу такой, а ровно этот.
да, теперь понятно, вы это делаете сознательно. Ну ладно, тогда последний вопрос, обьясните вот этот код (который я упоминал) и разойдемся:
if (bpp == {
in = &input;
this->startThreads();
return;
} // End bpp = 8
if (bpp == 12) {
ee2:P.S. Только что проверил ППЗ A37, A58, A77, A77II - все четыре тоже выдают 8-битные RAW.
вот, началось по второму кругу.
ee2, это кому было написано:
Это читается тэг из экзифа Exif.Image.BitsPerSample, его id = 0x0102. В большинстве программ-вьюверов экзифа сей тег не показывается вообще, только тэг Exif.Image.CompressedBitsPerPixel (id=0x9102), который кстати = 8.
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
Def:[
да, теперь понятно, вы это делаете сознательно. Ну ладно, тогда последний вопрос, обьясните вот этот код (который я упоминал) и разойдемся:
- код выделить все
if (bpp == {
in = &input;
this->startThreads();
return;
} // End bpp = 8if (bpp == 12) {
Осталось выяснить, откуда берется значение bpp.
AlexTutubalin:Потому что нужно в 7 бит дельты закодировать большой размах т.е. единичный шаг надо делать большим.
Это и есть нормализация, приводят дельту к диапазону функции от (макс-мин)..
Вот, вижу
DataSpan = Max – Min
Step = 2rounding(log2(DataSpan/128))
Delta = (PixelValue – Min) / Step
Ну да, с такой формулой дельта будет влиять на весь блок при распаковке. Теперь понятно.
Def:ee2, это кому было написано:
Извиняюсь, я не видел (чукча не читатель ). Сейчас ковырну EXIF поглубже...
AlexTutubalin:Осталось выяснить, откуда берется значение bpp.
так вы спорите и что то утверждаете не разобравшись вообще?
Выше по коду, в том же файле:
uint32 bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt();
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
Def:uint32 bitPerPixel = raw->getEntry(BITSPERSAMPLE)->getInt();
Ага. И для A7, к примеру, там получается 14. А в DecodeARW2 нету такого случая, только 8 и 12.
А дальше, сюрприз:
data = mRootIFD->getIFDsWithTag(MAKE);
if (data.size() > 1) {
for (uint32 i = 0; i < data.size(); i++) {
string make = data->getEntry(MAKE)->getString();
/* Check for maker "SONY" without spaces */
if (!make.compare("SONY"))
bitPerPixel = 8;
}
}
Это безобразный хак, но на выходе из него bitPerPixel равен 8. Опять сюрприз. Смотрел в отладчике, для файла от A7, минуту назад.
И, соответственно, попадаем в DecodeARW2 с bpp == 8
Понимаете, вот вы этот код читаете, на github нашли, я рад за вас. А я им - пользуюсь в своих программах (потому и поставить breakpoint в отладчике - минутное дело).
AlexTutubalin:А дальше, сюрприз:
сюрприз выглядет так:
// Sony E-550 marks compressed 8bpp ARW with 12 bit per pixel
// this makes the compression detect it as a ARW v1.
// This camera has however another MAKER entry, so we MAY be able
// to detect it this way in the future.
data = mRootIFD->getIFDsWithTag(MAKE);
if (data.size() > 1) {
for (uint32 i = 0; i < data.size(); i++) {
string make = data[i]->getEntry(MAKE)->getString();
/* Check for maker "SONY" without spaces */
if (!make.compare("SONY"))
bitPerPixel = 8;
}
}
вы бы хоть коментарий почитали
bitPerPixel будет = 8 если в теге Exif.Image.Make не будет текста "SONY". Для бзк - он есть
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
Def:bitPerPixel будет = 8 если в теге Exif.Image.Make не будет текста "SONY". Для бзк - он есть
Как приятно видеть истинного знатока программирования на C++!!!
Читаем тут: http://www.cplusplus.com/reference/string/string/compare/
===
Return Value
0 They compare equal
====
Соответственно !make.compare("SONY" ) - истинно, если строчка make в точности равна SONY
Сюрприз.
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
ee2:Вот и я о том же.
Не понятно, когда вообще срабатывает (и срабатывает ли вообще когда-либо) bpp=12. По-моему у всех камер MAKE=Sony...
Так, по логике, это случай 12-битных (без тоновой кривой) данных с A900 и A850.
Я сейчас позавтракаю (с этой дискуссией все остыло уже нахрен и вообще полдень) и подсуну файлик, посмотрю.
AlexTutubalin:Так, по логике, это случай 12-битных (без тоновой кривой) данных с A900 и A850.
Что-то сомнительно, что они другой Make в EXIF кладут в этом случае.
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
ee2:AlexTutubalin:Так, по логике, это случай 12-битных (без тоновой кривой) данных с A900 и A850.
Что-то сомнительно, что они другой Make в EXIF кладут в этом случае.
Смешно (говорю же, отвратительный хак). У A900 в этом формате в Make "SONY " с пробелом на хвосте. То есть compare возвращает не 0.
А в BitsPerPixel в 12-битном формате - написано 12.
А в cRAW (жатом с потерями) формате - у A900 в BitsPerPixel правильно написано 8. То есть "Sony " не срабатывает, но верное значение и так прилетает из файла.
Вообще, надо это место переделать, потому что на соплях все. Битность же очевидна из размера - 1 или 1.5 байта на пиксель. Надо Клаусу написать....
Все, продолжение после приема пищи, а то помру за клавиатурой.
Да уж, накрутила тетка.
В принципе размеры файлов тоже подтверждают.
Все же не думаю, что это что-то критичное - неприятно конечно, что вот с таким расчетом дельты она влияет на весь блок, но я как-то этого не замечал и вряд ли замечу когда-либо. Хотя знать теорию чуть больше всегда полезно, конечно.
офлайн
AlexTutubalin
Junior Member
|
|
53 |
9 лет на сайте Город:
|
ee2:Все же не думаю, что это что-то критичное - неприятно конечно, что вот с таким расчетом дельты она влияет на весь блок, но я как-то этого не замечал и вряд ли замечу когда-либо.
Да, это видно только в экстремальных случаях, вроде вот этих звездных треков. Ну и какие-то следы видны на контрастных границах.
На самом деле, там надо добавлять случайный шум (средним) размером с половинку ступеньки дельты - и все будет не видно вовсе.