Приложих метод, който взема входно изображение и го обръща около вертикална линия през центъра и го записва в изходен файл с изображение. Така че това, което е отляво, става отдясно и обратно. Изображението изглежда страхотно и изглежда, че е обърнато перфектно. Въпреки това ни е даден действителният обърнат файл с изображение, който трябва да изглежда, и аз използвах помощната програма diff в терминала, за да сравня двете, и тя заявява, че наистина има разлики. С помощта на програма, наречена Kaliedoscope, успях да открия разликата: има шепа пиксели, които по някаква причина са оцветени по различен начин, отколкото трябва. Не знам защо е така. Моят код дори не манипулира RGB стойности.
Незначителни разлики в изображението в програмата за обработка на изображения
Отговори (4)
В какъв формат на изображението запазихте? Ако сте използвали компресия със загуби, като например JPEG, тогава цветовете на изображението винаги ще бъдат малко по-различни, тъй като са били повторно компресирани. Трябва да използвате формат без загуба, като PNG.
Също така не трябва да използвате 'diff', за да разглеждате изображения. Не знам какво е Kaleidoscope, но помощната програма за сравнение на ImageMagick е добра за разглеждане на разликата между две изображения. 'diff' почти винаги ще ви каже, че има разлика между две изображения, дори ако са идентични и сте използвали формат без загуби, поради факта, че когато сте го компресирали повторно, той може да използва различна техника за компресиране.
Освен това казвате, че сте получили обърнатия файл с изображение (ако приемем, че това е домашна работа). В този случай е възможно човекът, който е генерирал този файл, да е направил грешката (напр. използвайки компресия със загуби). В този случай не бих се тревожил за малки разлики в пикселите.
convert -flop original.bmp expected.bmp
, който ще създаде очакваното изходно изображение и тествайте спрямо него. Използвайте програмата за сравнение на ImageMagick, за да тествате разликата.
- person mgiuca; 28.01.2011
Ако вашата функция работи добре, тя трябва да бъде собствена обратна (като необходимо условие, макар и недостатъчно, за да докаже коректността).
Проверете дали
a == flipleft(flipleft(a))
Ами ако имате доверие в софтуера за тестване на трета страна, има грешка?
HTH!
Редактиране
Също така проверете вертикалния център на изображението, за да сте сигурни, че когато броят на хоризонталните пиксели е равен, вие разменяте двата в средата.
Не изглежда да има нещо очевидно нередно с вашия код.
Тъй като имате референтно изображение, можете да кажете точните позиции на пикселите, където има разлика. Предлагам ви да преминете през програмата си с дебъгер (gdb, ако сте потребител на Linux, или Visual Studio, ако това е, което плава вашата лодка) и да поставите точки на прекъсване във вътрешния цикъл на вашия код на проблемните позиции. Използвайки тези точки на прекъсване, потърсете първата точка в програмата, където се проявява проблемът. Това ще ви помогне да откриете причината.
Работата с по-малки изображения (нещо, което можете да отпечатате в командния ред при всяка итерация, например 8x8 пиксела) може да ви спести известно време при отстраняване на грешки.
Може да е добре да публикувате изображения - вашият резултат и очакваната референция.
Променете своя код, така че да четете входното изображение в Image
и след това да го записвате в изходен файл (без обръщане) и да сравнявате входния файл с изходния файл.
Ако не съвпадат, тогава или процесът файл->Изображение->файл поврежда данните (може би с пикселен член с грешен размер, което води до закръгляване или използване на неинициализирана памет) или comparator (напр. Kaleidoscope) е грешен и можете да тествате, като просто копирате входния файл и го сравните.
Ако съвпадат, тогава или процедурата ви за обръщане е грешна (което изглежда малко вероятно) или референтният файл (който резултатът „трябва да изглежда“) е грешен и можете да тествате, като промените кода да прочетете и референтния файл и да докладвате за първото несъгласие-- тоест, конструирайте три Images
, Преди (прочетено от входния файл), След (което ще бъде записано в изходния файл) и Референция (което е прочетено от референтния файл), след това повторете x и y, сравнявайки After(x,y) с Reference(x,y). Веднага щом откриете несъгласие, вижте кое съответства на Before(width-x-1, y); ако препратката съвпада, тогава вашата рутина за обръщане е грешна и ако след съвпада, референтният файл е грешен (и можете да посочите пиксел, който го доказва).