Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.08.2012, 15:30
ivandobsky ivandobsky вне форума
Прохожий
 
Регистрация: 27.08.2012
Сообщения: 3
Репутация: 10
По умолчанию Яркость пикселя Grayscale BMP

Прошу помощи в в решении следующего вопроса:
имеется bmp изображение в градациях серого, соответсвтенно, с уровнями яркости в диапазоне 0..255.
Мне нужно получить массив пикселей этого изображения (для дальнейшей фильтрации).
Подскажите как это реализуется именно для изображения в градациях серого?
В Интернете полно вариантов перевода RGB to Grayscale. Там применяется формула:
Y=0.3*R+0.59*G+0.11*G
Однако, у меня уже используется изображение в градациях серого, будет ли справедливо это выражение?
Я решил проверить экспериментально:
b:=Image1.Picture.Bitmap.Canvas.Pixels[0,0];
Переменная b = 3026478, соответственно R=78,G=64,B=02
Получается Y=61.38
Проверяю в фотошопе левый верхний пиксель, пишет 46.
В общем, надеюсь на Вашу помощь.
Извиняюсь за много буков - хотел подробнее описать проблему.
Ответить с цитированием
  #2  
Старый 27.08.2012, 15:52
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Если ты его грузишь в "Дельфийский" TBitMap или TImage, то там формат сам по себе RGB. Соответственно, из модуля Windows есть 3 ф-ции:
Код:
GetRValue
GetGValue
GetBValue
-
возвращают значения красного, зеленого и синего цветов из TColor (cardinal) которым является
Код:
Image1.Picture.Bitmap.Canvas.Pixels[X,Y]
Ответить с цитированием
  #3  
Старый 27.08.2012, 16:40
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

если оно в градациях серого, там все три R,G,B должны быть равны между собой и равны тому значению Y
__________________
>woweook<
Ответить с цитированием
  #4  
Старый 27.08.2012, 16:45
ivandobsky ivandobsky вне форума
Прохожий
 
Регистрация: 27.08.2012
Сообщения: 3
Репутация: 10
По умолчанию

Чтобы не быть голословным, прикладываю пример картинки: http://narod.ru/disk/60045859001.942...779/1.bmp.html
Применив к этой картинке b:=Image1.Picture.Bitmap.Canvas.Pixels[0,0];
снова получаю b = 3026478.
Ответить с цитированием
  #5  
Старый 27.08.2012, 16:54
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

302647810 = 2E2E2E16
2E16 = 4610
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
ivandobsky (28.08.2012)
  #6  
Старый 27.08.2012, 16:54
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Цитата:
Сообщение от ivandobsky
Чтобы не быть голословным, прикладываю пример картинки: http://narod.ru/disk/60045859001.942...779/1.bmp.html
Применив к этой картинке b:=Image1.Picture.Bitmap.Canvas.Pixels[0,0];
снова получаю b = 3026478.

Правильно. И, например, сделав так:
Код:
begin
caption:=format('%d, %d, %d',[getRValue(3026478),getGValue(3026478),getBValue(3026478) ]);
end;
end;
везде получишь 46.
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
ivandobsky (28.08.2012)
  #7  
Старый 27.08.2012, 17:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от ivandobsky
Y=0.3*R+0.59*G+0.11*G
она тебе уже не нужна.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 27.08.2012, 21:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А какой PixelFormat у этой картинки?
А то через scanLine будет а) удобнее и б) быстрее (особенно, если картинка большая).
Ответить с цитированием
  #9  
Старый 28.08.2012, 13:34
ivandobsky ivandobsky вне форума
Прохожий
 
Регистрация: 27.08.2012
Сообщения: 3
Репутация: 10
По умолчанию

Большое спасибо всем за оперативную помощь. Не знал, что проблема может заключаться в системе исчисления, нигде не попадалось на это намека.
lmikle, спасибо за совет. Почитаю про scanLine, попробую.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter