Jump to content
Compvision.ru
Sign in to follow this  
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]

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

минимум 2.40897e-005

максимум 1.953

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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


Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×