Главная страница
    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.48 MB
Время: 0.041 c
15-1177408807
antonn.pda
2007-04-24 14:00
2007.05.27
медиаплеер в win2k


2-1178641617
bagos
2007-05-08 20:26
2007.05.27
сравнение картинок


4-1166908044
Drone
2006-12-24 00:07
2007.05.27
Потоки и сообщения от одного к другому


15-1177872605
antonn
2007-04-29 22:50
2007.05.27
Вопросик по регулярным выражениям. В пхп:)


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский