Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Принцип работы инструментов автокоррекции изображений


Страницы:   1 2

leonidus ©   (2007-08-07 14:35:00) 

В гугловской Picasa, и кажется в ACDSee, есть инструмент с помошью которого можно автоматически поднять якрость/контратность фотографии. Т.е. просто одним кликом программа осветляет фотографию, причем для разных фоток уровень осветления будет разный, в связи с чем вопрос, как программа понимает до какого уровня необходимо осветлить фотку, что бы и не пересветить ее и темного тоже небыло?


Pavia   (2007-08-08 13:14:00) [21]

1. Да
2. Вычесляет гистограмму.
Находим яркость Round(RY*R+GY*G+BY*B)
И увиличиваем на еденицу значение ячейки равной яркосости по номеру.
Inc(x) все равно что x:=x+1;
3. Мой код делает только вычислении гистограммы. А вот преобразования он не делает. Посмотрел что делает фотошо. Автоконтраст не заморачивается с расчетами. Просто считает что все состовляющии R,G,B равны. И гистограмму строит в соответствии с равенством каналов.

for i:=0 to bp.Height-1 do
begin
p:=bp.ScanLine[i];
for j:=0 to bp.Width*3-1 do
 begin
 Inc(Hist[p[j]]);
 end;


p:=bp.ScanLine[0];
Y:=p[0];
YMax:= Y;
YMin:= Y;

for i:=0 to bp.Height-1 do
begin
p:=bp.ScanLine[i];
for j:=0 to bp.Width*3-1 do
 begin
 Y:=p[j];
 if Y>YMax then YMax:=Y;
 if Y<YMin then YMin:=Y;
 end;
end;

for i:=0 to bp.Height-1 do
begin
p:=bp.ScanLine[i];
for j:=0 to bp.Width-1 do
 begin
 B:=Round((p[j*3+0]-YMin)*255 / (YMax-YMin));
 G:=Round((p[j*3+1]-YMin)*255 / (YMax-YMin));
 R:=Round((p[j*3+2]-YMin)*255 / (YMax-YMin));
 p[j*3+0]:=B;
 p[j*3+1]:=G;
 p[j*3+2]:=R;
 end;
end;



4. К примеру как сделано выше.
Гистограмма служит для других целий отоброжает сколько в картине светлых а сколько темных цветов. Можно к графику гистограммы добаить два ползунка левый и правый конец. С помощью них буде происходить вычисление насколько нужно сжать растянуть или сместить состовляющии цветов.


leonidus   (2007-08-08 11:43:00) [22]

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


DVM   (2007-08-08 10:42:00) [23]


> leonidus ©   (08.08.07 00:35) [8]
> >DVM А что есть яркость?

Y = 0.299R + 0.587G + 0,114B


> 1. Полученный массив содержит гистограмму яркости, я правильно
> понял?

да


leonidus   (2007-08-08 09:43:00) [24]

>pavia спасибо за инфу и код, но есть несколько вопросов:

1. Полученный массив содержит гистограмму яркости, я правильно понял?
2. Не понятно что делает функция Inc(Hist[Round(RY*R+GY*G+BY*B)]);
3. после получения
Y = 0.299R + 0.587G + 0,114B (ваш код это делает), нужно продолжить вычисления:

U = – 0.147R – 0.289G + 0,436B
V = 0.615R + 0.515G + 0,100B = 0,877(R – Y)
R = Y + 1.140V
G = Y – 0.395U – 0.581V
B = Y + 2.032U

верно?
4. Как реализовать после этого коррекцию изображения в bp ?


Pavia   (2007-08-08 03:20:00) [25]


> Sdubaruhnul   (07.08.07 21:36) [7]
> >leonidus ©   (07.08.07 20:14) [6]
>
> Да нет, работает. Там внизу секундомер. Но если настаиваешь,
>  то зеркало:
> http://www.speedyshare.com/557836353.html

Интерестная ссылка. Я и так знаю все это так как хорошо представляю что происходит.
Там идет замена одних цветов другими.
Строются три таблицы или одна общая замены.

NewR,NewG,NewB:Array [0..255] of Byte;

И поомеру заменяются
R:=NewR[R];

В фотошопе просто есть поле через которое удобно задовать эти таблицы.
Там либы каждая точка задается как точка поставленная карандошем. Или как крявая. В качестве формылы для кривой новерно используются безье кривые.


pavia   (2007-08-08 03:10:00) [26]

Для того чтобы произвести корекцию изоброжения нужно выровнить по трем уровням R,G,B. Припомощи линейного растяжения интенсивностий.
Делается это так ищем минимумы и максимумы по трем состовляющим.
RMin, RMax, GMin, GMax, BMin, BMax

(R-RMin)*(255-0)/(RMax-RMin)
(G-GMin)*(255-0)/(GMax-GMin)
(B-BMin)*(255-0)/(BMax-BMin)

R,G,B -знначение в точке

Насчет гистограммы.
Гистограмма - представления распределения частот выбранных переменных.
Тоесть то сколько раз встеречается значения переменных.

К примеру можно иметь три гистограммы интенсивнистей R,G,B.
Или одну по яркости, чаще всего пользуются ей. Где яркость можно считать так I=(R+G+B)/3 или  как опишу ниже.

Выравнивание идет также.  
(I-IMin)*(255-0)/(IMax-IMin)
А вообще можно добавить перемещение мыши тогда выравнивание  вести соответственно.

Для того чтобы провести корекцию изоброжения по яркости нужно
1. Перейти из цветового пространства в другое RGB -> YUV
2. Сделать корекцию
3. Сделать обратное преобразование YUV->RGB
Цветовая модель YUV состоит из
яркостную компоненты Y и двумя цветоразностныых компонентами U и V

Преобразование идет по следующим формулам

Y = 0.299R + 0.587G + 0,114B
U = – 0.147R – 0.289G + 0,436B
V = 0.615R + 0.515G + 0,100B = 0,877(R – Y)

R = Y + 1.140V
G = Y – 0.395U – 0.581V
B = Y + 2.032U

Насчет программирования используй ScanLine


Const
RY=0.2989;
GY=0.5866;
BY=0.1144;
Var
Hist:Array [0..255] of Byte;
Bp:TBitmap;
p:PByteArray;
R,G,B:Byte;

// Картинка должна быть в формате 24бита елси нет нужно привести
bp.PixelFormat:=pf24Bit;

FillCher(Hist[0],255,0);
if bp <> nil then
begin
for i:=0 to bp.Height-1 do
 begin
 p:=bp.ScanLine[i];
 for j:=0 to bp.Width-1 do
  begin
  B:=p[j*3+0];
  G:=p[j*3+1];
  R:=p[j*3+2];
  Inc(Hist[Round(RY*R+GY*G+BY*B)]);
  end;
 end;


Код писал прямо сдесь без проверки, думаю что работает.


leonidus   (2007-08-08 00:35:00) [27]

>DVMА что есть яркость?

Я вот делаю так:

var
btm:tbitmap;
color:tcolor;
r,g,b:integer;
...

 for x:=0 to btm.Width-1 do
  begin
   sum_l:=0;

   for y:=0 to btm.Height-1 do
    begin
     color:=btm.Canvas.Pixels[x,y];
     r:=GetRValue(color);
     g:=GetGValue(color);
     b:=GetBValue(color);

     sum_l:=sum_l+(r+g+b);
    end;

  end;

будет ли в конце каждого цикла "for y", значение sum_l равное высоте столбца гистограммы цветов, или гистограмма строится как-то иначе?


Sdubaruhnul   (2007-08-07 21:36:00) [28]

>leonidus ©   (07.08.07 20:14) [6]

Да нет, работает. Там внизу секундомер. Но если настаиваешь, то зеркало:
http://www.speedyshare.com/557836353.html


leonidus   (2007-08-07 20:14:00) [29]

ссылка битая


Sdubaruhnul   (2007-08-07 16:34:00) [30]

Вот небольшая брошюрка об инструменте Curves в Photoshop, на русском.
http://upload2.net/page/download/HJqvQJZznrZOHt2/UsingCurvesInPS.rar.html


DVM   (2007-08-07 15:32:00) [31]

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


DVM   (2007-08-07 15:29:00) [32]


> это как?

1) делаешь массив из 256 ячеек.
2) Проходишь по пикселам и узнаешь яркость каждого.
3) Заносишь  +1 в ячейку массива под тем номером какую яркость ты получил.
4) После прохода по картинке у тебя будет массив с количествами пикселов по каждой величине яркости от 0 до 255.

Этот массив - и есть гистограмма


leonidus   (2007-08-07 15:23:00) [33]

это как?


MBo   (2007-08-07 15:16:00) [34]

например, выравниванием гистограммы


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо