Перейти к содержимому
Compvision.ru

ProgRoman

Пользователи
  • Количество публикаций

    190
  • Зарегистрирован

  • Посещение

  • Days Won

    7

Сообщения, опубликованные пользователем ProgRoman


  1. Возник вопрос вроде бы простой, как определить ориентацию направление градиента я вычисляю градиент изображения

    
    	Mat img = imread(path);
    
            Mat im,imgr;
    
    	cvtColor(img,im,CV_BGR2GRAY);
    
            Sobel(im,imgr,im.depth(),1,1);
    
    

    вот таким образом получаю как я понимаю градиент изображения.. а как направление вычислить...


  2. Да вот я тоже думаю как то он совсем не естественно выглядит...

    вроде бы не должен перепутать.. 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);
    
    
    


  3. да да чёрный бордюр действительно.. я сперва на него даже не обратил внимание)

    всё равно что-то пока мне кажется не то.. это в YCrCb обработка по Y

    post-2515-0-28670400-1333839390_thumb.jp


  4. подключать другие каналы пробовал пока результаты теже.. попробовал в другом цветовом пространстве(YCrCb и YUV) результаты в общем по лучше но всё равно то же что-то не то.. работал только с компонентой Y результаты ниже

    post-2515-0-60481500-1333813305_thumb.jp

    post-2515-0-73790500-1333813315_thumb.jp


  5. я проверил по minMaxLoc там есть во всех картинках и 0 как минимальное значение и 1 как максимальное ну это уже после деление на максимум...

    что-то я в тупике что может быть не так...


  6. вообще как я понимаю максимум не должен превышать 1, а он почти 2 т.е. надо бы вообще говоря на него поделить вроде бы должно лучше быть... но

    белое изображение конечно пропадает, но качество всех падает это третье фото на всех фотках

    post-2515-0-60992300-1333640899_thumb.jp

    post-2515-0-78642800-1333640910_thumb.jp

    post-2515-0-37947300-1333640920_thumb.jp


  7. спасибо получилось с матлабом) единственно что в программе всё равно эта картинка выходит белой...

    вот полный текст функции сейчас

    
    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;
    
    }
    
    

    post-2515-0-71181800-1333628724_thumb.jp


  8. я не очень хорошо знаю 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
    
    


  9. большое спасибо ссылки и код довольно интересны, как я понимаю часть кода ниже это наверно фильтр Гауса наверно или это нетак?

    
    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]


  10. получилось следующее в общем качество улучшилось... но есть интересное вот для улучшения качества после степени пришлось закомментировать

    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-тье изображение вообще почему то белое практически всё..

    post-2515-0-17985300-1333114489_thumb.jp

    post-2515-0-58059200-1333114501_thumb.jp

    post-2515-0-72425800-1333114519_thumb.jp


  11. log(0) это да я что-то не подумал, а почему изображение в степень возводить ну каждый элемент изображения мы же по алгоритму логарифм брали.. для обратного преобразования как я понимаю нужна экспонента... pow(I,tr); не совсем понятно в какую степень возводить надо


  12. нормировать и сдвигать как я понимаю надо уже

    Mat tr = (3*l1 - l2-l3-l4)/3;

    сам tr.. как сдвинуть пусть у нас есть отрицательные элементы в матрице находим максимальное отклонение от 0 и сдвигаем всю матрицы на это значение тогда самое минимальное значение в матрице будет 0 так вроде бы...


  13. Ну, вероятно надо преобразовать в HSV и работать с плоскостью интенсивности, тогда цвет должен сохраниться.

    перевёл, но что-то особо ничто не поменялось... уж не знаю как у авторов статей такие хорошие результаты выходят...

    post-2515-0-37499800-1332845426_thumb.jp


  14. А если размер ядра равным сигме устанавливать?

    стало лучше, но почему то иногда теряется информация о цвете...изображение в каких-то областях становится чёрным..

    ниже пример потери цвета

    изменения в коде такие

    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);

    post-2515-0-68977500-1332514401_thumb.jp


  15. изменил на

    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);

    поменял и размер ядра.. ну в два раза меньший стал...

    вроде бы есть проясненья лучше ли стало пока не знаю... но откуда-то возникает чёрная полоса... непонятно...

    может у этого алгоритма область применения есть ну где-то он не работает...

    post-2515-0-37559300-1332509479_thumb.jp


  16. что-то странно... изменил

    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);

    ну все нечётные... и тоже ничего не изменилось... очень странно... почему так вроде бы должно меняться в зависимости от ядра гаусса...

×