Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
15-1175882955
TUser
2007-04-06 22:09
2007.05.27
Все хорошо в нашем королевстве


2-1178633296
Regent
2007-05-08 18:08
2007.05.27
Вопрос по диалогу.


1-1175164782
Пушистый зайчик
2007-03-29 14:39
2007.05.27
Печать канвы имеджа.


15-1177417389
ArtemESC
2007-04-24 16:23
2007.05.27
Вопросик интересный...


3-1173786756
salex
2007-03-13 14:52
2007.05.27
TClientDataSet и освобождение памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский