Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Определение цвета и преобразование палитры   Найти похожие ветки 

 
Lockdog   (2006-09-13 17:29) [0]

В общем идея такая:
мне нужно снять скрин, потом преобразовать палитру в 4096 цветную, а затем выделить область (например от 0 до 200 пикселей)по всей левой части экрана и найти цвет, который в этой области чаще всего встречается, кто поможет?

Заранее спасибо


 
Eraser ©   (2006-09-13 17:31) [1]

> [0] Lockdog   (13.09.06 17:29)

а в чем проблемы?


 
Lockdog   (2006-09-13 17:34) [2]

Как мне это сделать?:)


 
SamBrook ©   (2006-09-13 18:49) [3]

STFW "Метод медианного сечения".


 
Lockdog   (2006-09-13 21:01) [4]

И что это?


 
Vovan#1   (2006-09-13 21:19) [5]

Метод медианного сечения - это способ создания оптимальной 256-цветной палитры для многоцветных изображений.

В задаче Lockdog палитра же 4096 цветную. Такому изображению палитра не нужна. Если задача стоит в понижении количества цветов до 4096, то предлагаю такой простой способ:

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


 PColorFreq = ^TColorFreq;
 TColorFreq = record
  Color: TColor;
  Freq: Integer;
 end;

function CreateColorFreqList(B: TBitmap): TList;
var
 x, y, i: Integer;
 Row: PRGBTripleArray;
 F: Boolean;
 CItem, CItem2: PColorFreq;
 C: TColor;
begin
 Result := TList.Create;
 If B.PixelFormat <> pf24bit then Exit;
 for y := 0 to B.Height-1 do
  begin
   Row := B.Scanline[y];
   for x := 0 to B.Width-1 do
    begin
     with Row[x] do
      C := RGB(rgbtRed, rgbtGreen, rgbtBlue);
     F := False;
     for i := 0 to Result.Count-1 do
      begin
       CItem := Result.Items[i];
       If CItem.Color = C then
        begin
         Inc(Citem.Freq);
         F := True;
         Break;
        end;
      end;
      If F = False then
       begin
        New(CItem);
        CItem.Color := C;
        CItem.Freq := 1;
        Result.Add(CItem);
       end;
    end;
   end;
 // sorting
 for y := 0 to Result.Count-1 do
    begin
     for x := y+1 to Result.Count-1 do
      begin
       CItem := Result.Items[y];
       CItem2 := Result.Items[x];
       If CItem2^.Freq > CItem^.Freq then
        Result.Exchange(x, y);
      end;
    end;
end;


В отсортированном по убыванию списке выбрать первые 4096 цветов и к ним приравнивать остальные.

Ну а если сделано это, то "выделить область (например от 0 до 200 пикселей)по всей левой части экрана и найти цвет, который в этой области чаще всего встречается" тем же способом не составит труда.


 
Lockdog   (2006-09-13 21:39) [6]


> Создать частотную характеристику для каждого используемого
> цвета во всём изображении. Я делал это так (картинка была
> маленькая, память и процессорное время не берёг):

А жаль, моя программа должна постоянно сидеть в системе и данную операцию выполнять очень часто.


 
Vovan#1   (2006-09-13 22:28) [7]

А жаль, моя программа должна постоянно сидеть в системе и данную операцию выполнять очень часто.

Сперва измерь скоростные характеристики, устраивают ли они тебя. Если нет - попробуй оптимизировать. Используется Scanline - это уже задел. Можно перевести в 32-бита и будет чуточку быстрее. У сканлайна есть и свои способы ускорения. Объект TList каждый раз создаётся - это потеря времени. Создай его раз и очищай потом. И сортировочку на побыстрее заменить. И будет тебе счастье.


 
SamBrook ©   (2006-09-13 23:56) [8]

Vovan#1   (13.09.06 21:19) [5]

Метод медианного сечения - это способ создания оптимальной 256-цветной палитры для многоцветных изображений.

В задаче Lockdog палитра же 4096 цветную. Такому изображению палитра не нужна.


Метод медианного сечения может применяться для любой палитры, число отсчетов которой = 2^k.

У автора снимок экрана - обычно 24(32) бит/пиксел которые нужно перевести в 12.

Размер, кстати, может быть нехилым при большом разрешении экрана

Выш метод годится именно для маленьких изображений, поскольку
а). если много точек алгоритм с простым перебором индекса будет работать медленно.
б). цвета мелких деталей будут существенно искажены.


 
Lockdog   (2006-09-14 15:52) [9]

Так что же лучше?


 
SamBrook ©   (2006-09-14 17:05) [10]


> Lockdog   (14.09.06 15:52) [9]
> Так что же лучше?

Да как хочешь так и делай.
Способ Vovan проще в реализации, но качество может быть хуже.
Только не делай простого перебора - использует tBucketlist с цветом в качестве индекса pointer(tcolor).

Только ответь на один вопрос:
Как ты собираешься сохранять и показывать изображения 12-битовой палитрой?


 
han_malign ©   (2006-09-14 18:09) [11]

Если нужна адаптивная палитра цветов, то есть готовый "Gervautz-Purgathofer Octree Color Quantization" алгоритм
http://homepages.borland.com/efg2lab/Graphics/Colors/ShowDemoOne.htm
(портирован на Delphi с http://www.microsoft.com/msj/1097/wicked1097.aspx)


 
Lockdog   (2006-09-14 21:22) [12]


> Только ответь на один вопрос:
> Как ты собираешься сохранять и показывать изображения 12-
> битовой палитрой?

МНЕ НЕ НАДО ЕЁ СОХРАНЯТЬ, ТАМ ДРУГОЕ ДЕЛО



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.034 c
2-1178698444
Zahadum
2007-05-09 12:14
2007.05.27
Несколько вопросов по Memo


3-1173777363
Bk
2007-03-13 12:16
2007.05.27
FIBPlus - выдать список таблиц из БД


15-1177675109
IMHO
2007-04-27 15:58
2007.05.27
Занимательная арифметика: Пол Маккартни разорился


15-1177726461
Slider007
2007-04-28 06:14
2007.05.27
С днем рождения ! 28 апреля


3-1173509582
databaser
2007-03-10 09:53
2007.05.27
Зачем очистка параметров?...