Незначителни разлики в изображението в програмата за обработка на изображения

Приложих метод, който взема входно изображение и го обръща около вертикална линия през центъра и го записва в изходен файл с изображение. Така че това, което е отляво, става отдясно и обратно. Изображението изглежда страхотно и изглежда, че е обърнато перфектно. Въпреки това ни е даден действителният обърнат файл с изображение, който трябва да изглежда, и аз използвах помощната програма diff в терминала, за да сравня двете, и тя заявява, че наистина има разлики. С помощта на програма, наречена Kaliedoscope, успях да открия разликата: има шепа пиксели, които по някаква причина са оцветени по различен начин, отколкото трябва. Не знам защо е така. Моят код дори не манипулира RGB стойности.


person Snowman    schedule 28.01.2011    source източник
comment
Записвате ли изображенията във формат със загуба, като например .jpg, преди да извършите сравнението?   -  person Marc B    schedule 28.01.2011
comment
Колко различни са тези пиксели? Изглежда ли правилно за човешкото око, но има много малка реална разлика в цвета на пикселите? Или можете да кажете, че са различни?   -  person mgiuca    schedule 28.01.2011
comment
С какви примерни изображения сравнявате? Възможно ли е, когато са били обърнати, да е бил приложен някакъв алгоритъм за изглаждане - билинеен или бикубичен, например? Това би променило леко цветовите стойности на отделните пиксели, що се отнася до компютъра, но незабележимо за човешкото око.   -  person Cody Gray    schedule 28.01.2011
comment
Запазвам ги като bmp. Разликата беше невъзможна да се види, докато не използвах програма за сравнение на изображения.   -  person Snowman    schedule 28.01.2011


Отговори (4)


В какъв формат на изображението запазихте? Ако сте използвали компресия със загуби, като например JPEG, тогава цветовете на изображението винаги ще бъдат малко по-различни, тъй като са били повторно компресирани. Трябва да използвате формат без загуба, като PNG.

Също така не трябва да използвате 'diff', за да разглеждате изображения. Не знам какво е Kaleidoscope, но помощната програма за сравнение на ImageMagick е добра за разглеждане на разликата между две изображения. 'diff' почти винаги ще ви каже, че има разлика между две изображения, дори ако са идентични и сте използвали формат без загуби, поради факта, че когато сте го компресирали повторно, той може да използва различна техника за компресиране.

Освен това казвате, че сте получили обърнатия файл с изображение (ако приемем, че това е домашна работа). В този случай е възможно човекът, който е генерирал този файл, да е направил грешката (напр. използвайки компресия със загуби). В този случай не бих се тревожил за малки разлики в пикселите.

person mgiuca    schedule 28.01.2011
comment
Добре, добре, ако го записвате като BMP, тогава той трябва да е без загуби (като PNG). Ако приемем, че нищо не е наред с вашето, все още може да има проблем или в предоставеното решение, или в тази програма Kaleidoscope. Ако имате инсталиран ImageMagick, опитайте да използвате convert -flop original.bmp expected.bmp, който ще създаде очакваното изходно изображение и тествайте спрямо него. Използвайте програмата за сравнение на ImageMagick, за да тествате разликата. - person mgiuca; 28.01.2011

Ако вашата функция работи добре, тя трябва да бъде собствена обратна (като необходимо условие, макар и недостатъчно, за да докаже коректността).

Проверете дали

a == flipleft(flipleft(a)) 

Ами ако имате доверие в софтуера за тестване на трета страна, има грешка?

HTH!

Редактиране

Също така проверете вертикалния център на изображението, за да сте сигурни, че когато броят на хоризонталните пиксели е равен, вие разменяте двата в средата.

person Dr. belisarius    schedule 28.01.2011
comment
@mohabitar просто приложете вашия метод отново към полученото изображение. Трябва да върне оригиналния, след като бъде приложен два пъти подред - person Dr. belisarius; 28.01.2011
comment
Това означава, че ако имате обект Image 'a' и извикате функцията си 'flipleft' върху него два пъти, трябва да получите изображение, което е равно. Няколко предупреждения: Първо, вие сте го дефинирали като метод, така че вероятно е по-скоро като == a-›flipleft()-›flipleft(). Второ, предполага се, че == сравнява изображенията, което би означавало, че трябва да напишете свой собствен == оператор. Вместо това трябва просто ръчно да сравните пикселите в двете изображения, за да видите дали всички са еднакви. - person mgiuca; 28.01.2011
comment
@mohabitar Ако откриете, че са еднакви, това може да предполага (но няма да потвърди), че софтуерът ви работи и другият човек, който ви е дал тестовото решение, е допуснал (малка) грешка. Ако го приложите два пъти и не съвпада, тогава очевидно има грешка в кода ви. - person mgiuca; 28.01.2011
comment
@mohabitar Защото, правейки това, може да идентифицирате логиката, която се крие отдолу. И го направете само за изображения на един канал (R, G или B), за да изследвате повече. - person Dr. belisarius; 28.01.2011
comment
@mgiuca Благодаря за горните коментари. Очевидно съм извън веригата c++. Просто се опитвам да помогна с изображението. - person Dr. belisarius; 28.01.2011

Не изглежда да има нещо очевидно нередно с вашия код.

Тъй като имате референтно изображение, можете да кажете точните позиции на пикселите, където има разлика. Предлагам ви да преминете през програмата си с дебъгер (gdb, ако сте потребител на Linux, или Visual Studio, ако това е, което плава вашата лодка) и да поставите точки на прекъсване във вътрешния цикъл на вашия код на проблемните позиции. Използвайки тези точки на прекъсване, потърсете първата точка в програмата, където се проявява проблемът. Това ще ви помогне да откриете причината.

Работата с по-малки изображения (нещо, което можете да отпечатате в командния ред при всяка итерация, например 8x8 пиксела) може да ви спести известно време при отстраняване на грешки.

Може да е добре да публикувате изображения - вашият резултат и очакваната референция.

person mpenkov    schedule 28.01.2011

Променете своя код, така че да четете входното изображение в Image и след това да го записвате в изходен файл (без обръщане) и да сравнявате входния файл с изходния файл.

Ако не съвпадат, тогава или процесът файл->Изображение->файл поврежда данните (може би с пикселен член с грешен размер, което води до закръгляване или използване на неинициализирана памет) или comparator (напр. Kaleidoscope) е грешен и можете да тествате, като просто копирате входния файл и го сравните.

Ако съвпадат, тогава или процедурата ви за обръщане е грешна (което изглежда малко вероятно) или референтният файл (който резултатът „трябва да изглежда“) е грешен и можете да тествате, като промените кода да прочетете и референтния файл и да докладвате за първото несъгласие-- тоест, конструирайте три Images, Преди (прочетено от входния файл), След (което ще бъде записано в изходния файл) и Референция (което е прочетено от референтния файл), след това повторете x и y, сравнявайки After(x,y) с Reference(x,y). Веднага щом откриете несъгласие, вижте кое съответства на Before(width-x-1, y); ако препратката съвпада, тогава вашата рутина за обръщане е грешна и ако след съвпада, референтният файл е грешен (и можете да посочите пиксел, който го доказва).

person Beta    schedule 28.01.2011