Здравствуйте, DissDoc, Вы писали:
DD>Проблема в следующем... У меня есть контекст изображения HDC image_dc; DD>Как мне перевести изображение в 256 градаций серого?
Ооочень геморойно. Рекомендую уйти от DC и перебраться к HBITMAP, из окторого получить
BITMAPINFO, потом получить буфер изображения (я предполагаю, что оно у тебя 24битное).
Создать свою 256цветную палитру, с градацией серого.
Создать буфер BYTE *buf=new BYTE[(Width+Width%4)*Height]; под 8и битную картинку, где каждый пиксел — есть индекс в палитре.
Структурку для работы с 24битным буфером:
#pragma pack(push,1)
struct BIT24
{
BYTE r,g,b;
}
//или BYTE g,b,r; — я не помю как там.
#pragma pack(pop)
Ну и в цикле перебирать все пикселы 24битной картинки, и приводить их к пикелам 8битной картинки, а по какому принципу — сам думай.
Можно проще: искать функцию, которая сама все это делает =)
Re: Как перевести цветное изображение в 256 градаций серого
Здравствуйте, DissDoc, Вы писали:
DD>Проблема в следующем... У меня есть контекст изображения HDC image_dc; DD>Как мне перевести изображение в 256 градаций серого?
R,G,B от 0 до 255.
H = (77 * R + 28 * G + 150 * B) / 255
(с) MS PhotoEd
Имею скафандр — готов путешествовать!
Re[2]: Как перевести цветное изображение в 256 градаций сер
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, DissDoc, Вы писали:
DD>>Проблема в следующем... У меня есть контекст изображения HDC image_dc; DD>>Как мне перевести изображение в 256 градаций серого?
Здравствуйте, DissDoc, Вы писали:
DD>Проблема в следующем... У меня есть контекст изображения HDC image_dc; DD>Как мне перевести изображение в 256 градаций серого?
Перейти к YUV
Y сигнал формируется из RGB сигнала по следующей формуле:
Y = 0.299R + 0.587G + 0.114B
U и V сигналы формируются так:
U = R — Y, а V = B — Y
Если тебе нужно только 256 градаций серого,
то Y-сигнал яркости, то что тебе нужно.
Рассчитай Y для кажной точке по ее RGB.
Это и будет градации церого.
И в догонку обратный переход (из YUV в RGB)
R = Y + U,
B = Y + V,
G = Y — 0.509U — 0.194V
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, DissDoc, Вы писали:
DD>>Проблема в следующем... У меня есть контекст изображения HDC image_dc; DD>>Как мне перевести изображение в 256 градаций серого?
RB>
RB>R,G,B от 0 до 255.
RB>H = (77 * R + 28 * G + 150 * B) / 255
RB>(с) MS PhotoEd
-- не очень удачная реализация формулы Y = 0.299R + 0.587G + 0.114B -- маленькая точность и делитель 255, хотя лучше сделать его степенью двойки.
Если в качестве делителя взять 65536 (2^16), то получится так:
typedef unsigned int uint;
uint Y = ( 19595*R + 38470*G + 7471*B ) >> 16;