ProgRoman 9 Жалоба Опубликовано April 2, 2012 большое спасибо ссылки и код довольно интересны, как я понимаю часть кода ниже это наверно фильтр Гауса наверно или это нетак? imCopy = L; Maximum = max(L(); % maximum intensity value in the image [sRow, sCol] = size(L); shift = 2^(fix(log2(min(sRow, sCol)))-1); % initial place to begin lastProduct = Maximum*ones(sRow, sCol); % initialize Last Product while (abs(shift) >= 1) % iterate intil spiral is one unit large for i = 1:5 currRow = 0; % move horizontaly currCol = shift; interProduct = lastProduct; if (currRow + currCol > 0) % bottom right spiral part interProduct((currRow+1):end, (currCol+1):end) = lastProduct(1:(end-currRow), 1:(end-currCol)) + imCopy((currRow+1):end, (currCol+1):end) - imCopy(1:(end-currRow), 1:(end-currCol)); % propigate inward (adding is log mulitply) else interProduct(1:(end+currRow), 1:(end+currCol)) = lastProduct((1-currRow):end, (1-currCol):end) + imCopy(1:(end+currRow),1:(end+currCol)) - imCopy((1-currRow):end, (1-currCol):end); % propigate inward (adding is log mulitply) end interProduct(interProduct > Maximum) = Maximum; % % if values excede the max image value, rescale product = (interProduct + lastProduct)/2; % average with the previous Product lastProduct = product; currRow = shift; % move verticly currCol = 0; interProduct = lastProduct; if (currRow + currCol > 0) % bottom right spiral part interProduct((currRow+1):end, (currCol+1):end) = lastProduct(1:(end-currRow), 1:(end-currCol)) + imCopy((currRow+1):end, (currCol+1):end) - imCopy(1:(end-currRow), 1:(end-currCol)); % propigate inward (adding is log mulitply) else interProduct(1:(end+currRow), 1:(end+currCol)) = lastProduct((1-currRow):end, (1-currCol):end) + imCopy(1:(end+currRow),1:(end+currCol)) - imCopy((1-currRow):end, (1-currCol):end); % propigate inward (adding is log mulitply) end interProduct(interProduct > Maximum) = Maximum; % if values excede the max image value, rescale product = (interProduct + lastProduct)/2; % average with the previous Product lastProduct = product; end shift = -shift/2; % tighten spiral end y = product; [/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 2, 2012 Если я правильно понял из картинок на сайте, это что-то вроде фильтра Гаусса, но он изменен, и берет точки по логарифмической спирали. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 4, 2012 я не очень хорошо знаю matlab когда я стал код выполнять у меня постоянно y выводится не как цветное изображение а как 3-и отдельных склеяных вместе т.е. число у исходного изображения size такой 101x98x3 а у выходного 101x294 как сделать что бы тоже было нормальное(т.е. при imshow выводилось) 3-х канальное(цветное) изображение, извиняюсь наверно за совсем простой вопрос) .... y = uint8(round(y * 255)); figure, imshow(uint8(round(inImage))); %This commented code shows the input figure, imshow(y); %and output images in the acgoritm Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 4, 2012 Думаю тут reshape нужен: http://www.mathworks.com/help/techdoc/ref/reshape.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 спасибо получилось с матлабом) единственно что в программе всё равно эта картинка выходит белой... вот полный текст функции сейчас Mat smRetinex(const Mat &img) { Mat im; Mat t1,t2,t3,t4,t5,res,tm1,tm2; cvtColor(img,im,CV_BGR2HSV); Mat i3[3]; split(im,i3); Mat ims1 = i3[2].clone(); Mat ims; ims1.convertTo(ims,CV_64FC1,1.0/255.0); // for(int i=0; i<ims.rows; i++) { for(int j=0; j<ims.cols; j++) { double d = ims.at<double>(i,j); if(d==0) { ims.at<double>(i,j) +=0.00001; } } } // int sm1 = MIN(ims.size().height,ims.size().width); int sm2 = sm1/2; int sm3=sm1/4; if(!(sm1%2))sm1--; if(!(sm2%2))sm2--; if(!(sm3%2))sm3--; if(sm1==0)sm1=1; if(sm2==0)sm2=1; if(sm3==0)sm3=1; GaussianBlur(ims,t1,Size(sm1,sm1),sm1); GaussianBlur(ims,t2,Size(sm2,sm2),sm2); GaussianBlur(ims,t3,Size(sm3,sm3),sm3); Mat l1,l2,l3,l4; log(ims,l1);log(t1,l2);log(t2,l3);log(t3,l4); Mat tr = (3*l1 - l2-l3-l4)/3; Mat etr; exp(tr,etr); double dm=10000000,dx=-100000000; for(int i=0; i<etr.rows; i++) { for(int j=0; j<etr.cols; j++) { double d = etr.at<double>(i,j); if(d<dm)dm=d; if(d>dx)dx=d; } } /*etr = etr - Mat::ones(etr.size(),CV_64FC1)*dm; etr = etr/(dx-dm);*/ //etr = etr/dx; //etr = etr*255; etr.convertTo(tm2,CV_8UC1,255.0); i3[2]=tm2.clone(); merge(i3,3,tm1); cvtColor(tm1,res,CV_HSV2BGR); return res; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 5, 2012 Что то тут не хватает функции minMaxLoc Пропустите через нее свою картинку до приведения к диапазону 0-255 и посмотрите какие там максимумы и минимумы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 делал до конверта т.е. до этой строчки etr.convertTo(tm2,CV_8UC1,255.0); минимум 2.40897e-005 максимум 1.953 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 вообще как я понимаю максимум не должен превышать 1, а он почти 2 т.е. надо бы вообще говоря на него поделить вроде бы должно лучше быть... но белое изображение конечно пропадает, но качество всех падает это третье фото на всех фотках Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 5, 2012 Не должно оно быть мутным таким. Если приводить к 0-1, то там должны быть черные точки и белые точки, а на мутном третьем изображении нет таких точек (на глаз во всяком случае не видно). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 я проверил по minMaxLoc там есть во всех картинках и 0 как минимальное значение и 1 как максимальное ну это уже после деление на максимум... что-то я в тупике что может быть не так... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 5, 2012 А если эти точки покрасить, чтобы их было видно? Может что прояснится? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 Подкрасил.. 0 это зелёная точка, а 1 красная... получилось что есть две точки один минимум, и максимум тоже один Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 5, 2012 Ну тогда надо гистограмму ровнять. Или можно попробовать их еще через логистическую функцию пропустить. http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F ЗЫ: в первой картинке (может и во второй тоже) подозреваю черный бордюр есть. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 5, 2012 а не может это быть связанно с тем что я только один канал фактически обрабатываю в HSV канал V.... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 6, 2012 Ну, я думаю что можно попробовать подключить и другие каналы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 7, 2012 подключать другие каналы пробовал пока результаты теже.. попробовал в другом цветовом пространстве(YCrCb и YUV) результаты в общем по лучше но всё равно то же что-то не то.. работал только с компонентой Y результаты ниже Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 7, 2012 С этим изображением все понятно, черный бордюр уберите, а то он пытается с ним яркость выровнять, представьте себе гистограмму такого изображения и все поймете. Основную картину принимает как вариации освещения (разброс значений то мааленький), отсюда, кстати и белый квадрат. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 7, 2012 да да чёрный бордюр действительно.. я сперва на него даже не обратил внимание) всё равно что-то пока мне кажется не то.. это в YCrCb обработка по Y Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 8, 2012 А не перепутали Y и Cb, что то цвет как то неестественно исказился. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 8, 2012 Да вот я тоже думаю как то он совсем не естественно выглядит... вроде бы не должен перепутать.. YCrCb как я понимаю три канала как и везде 0 это и есть Y ниже часть кода cvtColor(img,im,CV_BGR2YCrCb); Mat i3[3]; split(im,i3); Mat ims1 = i3[0].clone(); Mat ims; ims1.convertTo(ims,CV_64FC1,1.0); Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 8, 2012 А если поменять Y<->Cb ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 8, 2012 поменял, но тоже странно выглядит Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 8, 2012 По-моему, в пространстве HSV было лучше. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано April 11, 2012 Да мне тоже кажется что в HSV всё таки лучше.. единственно что картинки темнее получаются...первое изображение оригинал второе в HSV третье в YCrCb Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 17, 2012 http://ivrgwww.epfl.ch/supplementary_material/LM_adaptiveFilter/index.html есть код 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах