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

Retinex

Recommended Posts

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


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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если я правильно понял из картинок на сайте, это что-то вроде фильтра Гаусса, но он изменен, и берет точки по логарифмической спирали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю тут reshape нужен:

http://www.mathworks.com/help/techdoc/ref/reshape.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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


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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что то тут не хватает функции minMaxLoc

Пропустите через нее свою картинку до приведения к диапазону 0-255 и посмотрите какие там максимумы и минимумы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

делал до конверта т.е. до этой строчки etr.convertTo(tm2,CV_8UC1,255.0);

минимум 2.40897e-005

максимум 1.953

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не должно оно быть мутным таким. Если приводить к 0-1, то там должны быть черные точки и белые точки, а на мутном третьем изображении нет таких точек (на глаз во всяком случае не видно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если эти точки покрасить, чтобы их было видно? Может что прояснится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подкрасил.. 0 это зелёная точка, а 1 красная...

получилось что есть две точки один минимум, и максимум тоже один

post-2515-0-95966500-1333654487_thumb.jp

post-2515-0-38091000-1333654494_thumb.jp

post-2515-0-55029300-1333654500_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну тогда надо гистограмму ровнять.

Или можно попробовать их еще через логистическую функцию пропустить.

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

ЗЫ: в первой картинке (может и во второй тоже) подозреваю черный бордюр есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а не может это быть связанно с тем что я только один канал фактически обрабатываю в HSV канал V....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С этим изображением все понятно, черный бордюр уберите, а то он пытается с ним яркость выровнять, представьте себе гистограмму такого изображения и все поймете. Основную картину принимает как вариации освещения (разброс значений то мааленький), отсюда, кстати и белый квадрат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А не перепутали Y и Cb, что то цвет как то неестественно исказился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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


Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А если поменять Y<->Cb ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По-моему, в пространстве HSV было лучше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

post-2515-0-39569200-1334135458_thumb.jp

post-2515-0-84676800-1334135468_thumb.jp

post-2515-0-32733800-1334135477_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×