ProgRoman
-
Количество публикаций
190 -
Зарегистрирован
-
Посещение
-
Days Won
7
Сообщения, опубликованные пользователем ProgRoman
-
-
может быть это arctn(Sobel(im,imgr,im.depth(),1,1))...или может как-то так arctn(Sobel(im,imgr,im.depth(),0,1)/Sobel(im,imgr,im.depth(),1,0))..
-
Возник вопрос вроде бы простой, как определить ориентацию направление градиента я вычисляю градиент изображения
Mat img = imread(path); Mat im,imgr; cvtColor(img,im,CV_BGR2GRAY); Sobel(im,imgr,im.depth(),1,1);
вот таким образом получаю как я понимаю градиент изображения.. а как направление вычислить...
-
-
Да вот я тоже думаю как то он совсем не естественно выглядит...
вроде бы не должен перепутать.. 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);
-
-
-
-
-
-
-
-
спасибо получилось с матлабом) единственно что в программе всё равно эта картинка выходит белой...
вот полный текст функции сейчас
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; }
-
я не очень хорошо знаю 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
-
большое спасибо ссылки и код довольно интересны, как я понимаю часть кода ниже это наверно фильтр Гауса наверно или это нетак?
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]
-
получилось следующее в общем качество улучшилось... но есть интересное вот для улучшения качества после степени пришлось закомментировать
tr'=(tr-min)/(max-min)
//dx - максимум dm - минимум
/*etr = etr - Mat::ones(etr.size(),CV_64FC1)*dm;
etr = etr/(dx-dm);*/
и получил следующие не странности.. 1-ое изображение это оригинал, затем второе с закоментированной частью tr'=(tr-min)/(max-min) а третье когда комментарий убирал...
в 3-их изображениях фон более детальный что ли... хотя качество в общем хуже... а во 2-ых более контрастный наверно... яркий.. но детали что некоторые теряются не такие чёткие как раньше... а 3-тье изображение вообще почему то белое практически всё..
-
-
-
-
нормировать и сдвигать как я понимаю надо уже
Mat tr = (3*l1 - l2-l3-l4)/3;
сам tr.. как сдвинуть пусть у нас есть отрицательные элементы в матрице находим максимальное отклонение от 0 и сдвигаем всю матрицы на это значение тогда самое минимальное значение в матрице будет 0 так вроде бы...
-
-
-
А если размер ядра равным сигме устанавливать?
стало лучше, но почему то иногда теряется информация о цвете...изображение в каких-то областях становится чёрным..
ниже пример потери цвета
изменения в коде такие
int sm1 = MIN(ims.size().height,ims.size().width);
int sm2 = sm1/2,sm3=sm1/4;
if(!(sm1%2))sm1--;
if(!(sm2%2))sm2--;
if(!(sm3%2))sm3--;
GaussianBlur(ims,t1,Size(sm1,sm1),sm1);
GaussianBlur(ims,t2,Size(sm2,sm2),sm2);
GaussianBlur(ims,t3,Size(sm3,sm3),sm3);
-
изменил на
GaussianBlur(ims,t1,Size(sm/2,sm/2),sm/2);
GaussianBlur(ims,t2,Size(sm/2,sm/2),sm/4);
GaussianBlur(ims,t3,Size(sm/2,sm/2),sm/8);
поменял и размер ядра.. ну в два раза меньший стал...
вроде бы есть проясненья лучше ли стало пока не знаю... но откуда-то возникает чёрная полоса... непонятно...
может у этого алгоритма область применения есть ну где-то он не работает...
-
что-то странно... изменил
GaussianBlur(ims,t1,Size(sm,sm),sm/1);
GaussianBlur(ims,t2,Size(sm,sm),sm/2);
GaussianBlur(ims,t3,Size(sm,sm),sm/3);
на
GaussianBlur(ims,t1,Size(sm,sm),sm/1);
GaussianBlur(ims,t2,Size(sm,sm),sm/3);
GaussianBlur(ims,t3,Size(sm,sm),sm/5);
ну все нечётные... и тоже ничего не изменилось... очень странно... почему так вроде бы должно меняться в зависимости от ядра гаусса...
Ориентация направление градиента
в OpenCV
Опубликовано · Report reply
спасибо большое, у меня ещё вопрос а направление градиента оно является инвариантным к освещённости.. повороту сдвигу масштабу...