Не могу разобраться с JPG

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не могу разобраться с JPG

Сообщение v00d00911 » 10.01.2015 20:59:00

Помогите с реализацией кода. Только прошу не гнобить я новичок. Мне нужно написать программу, которая бы могла из JPG картинки посчитать в процентах сколько какого цвета из 7-ми цветов радуги имеется в данном файле.
Я думаю алгоритм должен быть следующий:
1.Определение размера картинки.
2.Создание динамического массива [ширина,высота]
3.Считывание цвета с файла и занесение его в массив попиксельно.
4.Сравнение массива данных с цветовой таблицей посредством case of.
5.Накопление результатов в переменных цвета
6.Вывод результата в % по каждому цвету.
Я понимаю, что в каждом пикселе содержится цвет RGB с разной яркостью. Но я никак не могу найти как реализовать мою задачу.
Не ругайте меня сильно если я ошибаюсь. Если не можете все обьяснить то помогите хоть в чем-то. Буду рад услышать любые дельные советы. Подскажите хотя бы где копать, а дальше я как нибудь сам попытаюсь. :oops: :oops: :oops: :oops: :oops:
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Ism » 10.01.2015 21:14:32

Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Не могу разобраться с JPG

Сообщение vitaly_l » 10.01.2015 21:37:34

Ism писал(а):http://www.hardforum.ru/t67903/

там есть как взять цвет пикселя.

А подсчитывать удобнее вот так:
if color > iRedFrom and color < iRedTo then inc(iRed);
else if color > iGreenFrom and color < iGreenTo then inc(iGreen)
итд ;
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Не могу разобраться с JPG

Сообщение Mirage » 10.01.2015 23:26:01

Лучше наверное сперва в HSV цветовое пространство пиксель перевести, а потом уж определять к какому цвету его отнести.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Не могу разобраться с JPG

Сообщение v00d00911 » 10.01.2015 23:33:34

Mirage писал(а):Лучше наверное сперва в HSV цветовое пространство пиксель перевести, а потом уж определять к какому цвету его отнести.

Можно об этом по подробнее. А то я пока не понимаю о чем Вы.
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Vapaamies » 11.01.2015 01:21:47

Можно взять обыкновенный алгоритм квантования, используемый в GIF и PNG, и переводить в трёхбитный цвет (палитру) -- те самые семь цветов радуги.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Не могу разобраться с JPG

Сообщение v00d00911 » 11.01.2015 02:25:58

Vapaamies писал(а):Можно взять обыкновенный алгоритм квантования, используемый в GIF и PNG, и переводить в трёхбитный цвет (палитру) -- те самые семь цветов радуги.

Можете написать код или алгоритм хотя бы?
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Mirage » 11.01.2015 02:53:23

v00d00911 писал(а):Можно об этом по подробнее. А то я пока не понимаю о чем Вы.


Конечно:
http://ru.wikipedia.org/wiki/HSV_(цветовая_модель)
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Не могу разобраться с JPG

Сообщение v00d00911 » 11.01.2015 03:06:17

Mirage писал(а):
v00d00911 писал(а):Можно об этом по подробнее. А то я пока не понимаю о чем Вы.


Конечно:
http://ru.wikipedia.org/wiki/HSV_(цветовая_модель)

С HSV познакомился а вот как из изображения достать цвета радуги в процентах так и не допер :)
У меня код некоторый уже есть. Но как сравнивать цвет пикселя с определенным диапазоном не пойму.
Код: Выделить всё
procedure TfMain.bScanImageClick(Sender: TObject);
//обьявляем переменные для jpeg и bmp а также переменную содержащую цвет пикселя
var
jpg: TJPEGImage;
bmp: TBitmap;
Kolor: TColor;
x, y, Red,Orange,Yelow,Green,LightBlue,Blue,Violet,Black,Grey:integer;
begin
   jpg := Image1.Picture.Graphic as TJPEGImage;//присваиваем переменной изображение jpeg
   bmp := TBitmap.Create;//создаем пустой bmp
  try
    bmp.Width := jpg.Width;//копируем ширину изображения
    bmp.Height := jpg.Height;//копируем высоту изображения
    bmp.Canvas.Draw(0, 0, jpg);//рисуем с первого пикселя из jpg в bmp
   
for x:=0 to jpg.Width-1
do
for y:=0 to jpg.Height-1
do
Kolor := bmp.Canvas.Pixels[x, y];

//тут мы получили цвет а тепер нужно реализовать case of относительно диапазона цвета пикселя. в этом у меня загвоздка. ну а инкремировать массив это уже не проблемма
  finally
    bmp.Free;
end;
end; 
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Mirage » 11.01.2015 04:54:29

Если этот kolor перевести из RGB в пространство HSV (или просто вычислить H), то, т.к. H там отвечает за цвет, то можно просто поделить дипазон значений этого H на нужное количество сегментов, и, в зависимости от попадания в тот или иной сегмент, считать значение тем или иным цветом радуги.
Как именно поделить другой вопрос. Можно просто на глаз.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Не могу разобраться с JPG

Сообщение Vadim » 11.01.2015 08:41:05

Так Вам нужны чистые цвета или приближение к тому или иному цвету?
Я, честно говоря, не спец по цветам. Если в общем виде, то нужно задать диапазон значений TColor для каждого из "радужных" цветов и проверять пиксел на соответствие, что-то вроде:
Код: Выделить всё
function Check(Value, MinimumColor, MaximumColor: TColor): Boolean;
begin
  Result := (Value >= MinimumColor) and (Value <= MaximumColor);
end;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Не могу разобраться с JPG

Сообщение v00d00911 » 11.01.2015 21:07:53

Mirage писал(а):Если этот kolor перевести из RGB в пространство HSV (или просто вычислить H), то, т.к. H там отвечает за цвет, то можно просто поделить дипазон значений этого H на нужное количество сегментов, и, в зависимости от попадания в тот или иной сегмент, считать значение тем или иным цветом радуги.
Как именно поделить другой вопрос. Можно просто на глаз.

Я вашу идею то понял. Вроде все так. Но как это програмно реализовать не могу понять.
И еще что можете сказать про ColorToIdent??

Добавлено спустя 2 минуты 54 секунды:
Vadim писал(а):Так Вам нужны чистые цвета или приближение к тому или иному цвету?
Я, честно говоря, не спец по цветам. Если в общем виде, то нужно задать диапазон значений TColor для каждого из "радужных" цветов и проверять пиксел на соответствие, что-то вроде:
Код: Выделить всё
function Check(Value, MinimumColor, MaximumColor: TColor): Boolean;
begin
  Result := (Value >= MinimumColor) and (Value <= MaximumColor);
end;

Это что-то вроде и я понимаю. А вот как програмно эти цвета выделить? Как узнать в каком диапазоне находится цвет точки. Ведь bmp имеет красный зеленый и синий и все!!! остальное получается путем их смешивания с разной яркостью.
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Mirage » 11.01.2015 23:00:02

v00d00911 писал(а):Я вашу идею то понял. Вроде все так. Но как это програмно реализовать не могу понять.


Что не можете понять? Как программно определить попадание числа в заданный диапазон? Ну не знаю...

v00d00911 писал(а): И еще что можете сказать про ColorToIdent??


Не в курсе даже что это.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Не могу разобраться с JPG

Сообщение v00d00911 » 12.01.2015 00:09:03

Mirage писал(а):
v00d00911 писал(а):Я вашу идею то понял. Вроде все так. Но как это програмно реализовать не могу понять.


Что не можете понять? Как программно определить попадание числа в заданный диапазон? Ну не знаю...

v00d00911 писал(а): И еще что можете сказать про ColorToIdent??


Не в курсе даже что это.

Ну не издевайтесь. Я не говорю что все знаю но диапазон уж точно смогу организовать :)) тут вопрос в другом например в любом цветовом тоне можно получить 4 разных цвета : например у красного - красный, черный, белый и серый. Цвета радуги можно получить только при SV = 100%. Или я не прав???

Изображение
http://pbrd.co/1B5T7Au - это что бы было наглядно.

Добавлено спустя 28 минут 57 секунд:
Mirage Может попробовать получить 4 битный файл а потом из него выделить 16 цветов? С помощью bmp2.PixelFormat:= pf4bit; Я вот попробовал после этого сохранить файл однако он как был 24 битный так и остался :) В чем соль не пойму.
v00d00911
новенький
 
Сообщения: 12
Зарегистрирован: 10.01.2015 20:35:11

Re: Не могу разобраться с JPG

Сообщение Mirage » 12.01.2015 00:51:00

v00d00911 писал(а):Ну не издевайтесь. Я не говорю что все знаю но диапазон уж точно смогу организовать :)) тут вопрос в другом например в любом цветовом тоне можно получить 4 разных цвета : например у красного - красный, черный, белый и серый. Цвета радуги можно получить только при SV = 100%. Или я не прав???


H не имеет смысла (но равно 0, что соответствует красному) только если S=0. Можно отсекать цвета с низкой насыщенностью, считая их слишком серыми для радуги.

v00d00911 писал(а):Mirage Может попробовать получить 4 битный файл а потом из него выделить 16 цветов? С помощью bmp2.PixelFormat:= pf4bit; Я вот попробовал после этого сохранить файл однако он как был 24 битный так и остался :) В чем соль не пойму.


Возможно, сохранение там только в 24 битном формате. Может даже данные не конвертируются при изменении формата.
Если конвертируются, то зачем сохранять? Там же в памяти и считывайте.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 253

Рейтинг@Mail.ru