Форум: "Media";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПреобразование в ч/б Найти похожие ветки
← →
seregka (2005-03-20 11:35) [0]Как "очернобелить" картинку???
Спасибо
← →
Fenik (2005-03-20 17:01) [1]
type
TRGB = packed record
B, G, R: Byte;
end;
pRGB = ^TRGB;
function ColorToRGB(Color: TColor): TRGB;
begin
with Result do begin
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
end;
end;
procedure Threshold(Bitmap: TBitmap; Value: Byte; Color1, Color2: TColor);
var x, y: Word;
C1, C2: TRGB;
Dest: pRGB;
begin
C1 := ColorToRGB(Color1);
C2 := ColorToRGB(Color2);
for y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
if (Dest^.b + Dest^.g + Dest^.r) / 3 > Value
then Dest^ := C1
else Dest^ := C2;
Inc(Dest);
end;
end;
end;
Threshold(Bmp, 127, clWhite, clBlack);
← →
Fenik (2005-03-20 17:02) [2]Как обычно забыл напомнить: только для 24-битных растров.
← →
seregka (2005-03-20 18:54) [3]а как для 32 битных делать???
← →
AlterEgo of WondeRu © (2005-03-20 18:57) [4]Fenik (20.03.05 17:01) [1]
(Dest^.b + Dest^.g + Dest^.r) / 3
формула неверна!!!!!!!
← →
Anatoly Podgoretsky © (2005-03-20 18:59) [5]AlterEgo of WondeRu © (20.03.05 18:57) [4]
Не то слово, там такое получится.
← →
AlterEgo of WondeRu © (2005-03-20 19:00) [6]пост 16
http://delphimaster.net/view/8-1108377216/
← →
Fenik (2005-03-20 19:01) [7]> seregka (20.03.05 18:54) [3]
> а как для 32 битных делать???
Также. Только тип будет
TRGB = packed record
B, G, R, A: Byte;
end;
> AlterEgo of WondeRu © (20.03.05 18:57) [4]
> формула неверна!!!!!!!
Я тебя не понимаю. В черно-белое переводит? Переводит.
Тогда в чем проблема?
Я, когда писал, не думал про науку.
Приведи верную формулу, а не кричи.
← →
Fenik (2005-03-20 19:03) [8]> Anatoly Podgoretsky © (20.03.05 18:59) [5]
> Не то слово, там такое получится.
Да ну? ;)
← →
AlterEgo of WondeRu © (2005-03-20 19:13) [9]Fenik (20.03.05 19:01) [7]
Приведи верную формулу, а не кричи.
привел в 6, а я никогда ни кричу... это просто эмоции...
← →
Fenik (2005-03-20 19:20) [10]> AlterEgo of WondeRu © (20.03.05 19:13) [9]
> привел в 6, а я никогда ни кричу... это просто эмоции...
Ага верно, вы ведь, батенька, Альтер-Эго! :))
← →
Anatoly Podgoretsky © (2005-03-20 19:21) [11]Fenik (20.03.05 19:01) [7]
На угрозу не отвечаю, с этим в песочницу.
← →
Fenik (2005-03-20 19:25) [12]> Anatoly Podgoretsky © (20.03.05 19:21) [11]
> На угрозу не отвечаю, с этим в песочницу.
Щас, за ведёрком только сбегаю :))))))
← →
Anatoly Podgoretsky © (2005-03-20 19:30) [13]Зря, если бы без твоего налета, то я бы привел формулу, а так продолжай дураком жить.
← →
Fenik (2005-03-20 19:50) [14]> Anatoly Podgoretsky © (20.03.05 19:30) [13]
> Зря, если бы без твоего налета, то я бы привел формулу, а так продолжай дураком жить.
Неужто всё так серьезно?
I = 0.299R + 0.587G + 0.114B
-------
Смайлики незаметные что ли? :))
← →
seregka (2005-03-20 20:03) [15]Ладно парни, прекращайте ругаться.
Г-ну Фенику вопрос:
код рабочий, но одно НО: картинка становится чернобелой не сразу, а только после очередной операции над Image (например, поворот на 90), т.е. сразу ч/б и перевернутое.
← →
Fenik (2005-03-20 20:10) [16]> seregka (20.03.05 20:03) [15]
> Г-ну Фенику вопрос:
> код рабочий, но одно НО: картинка становится чернобелой не сразу, а только после очередной операции над Image (например, поворот на 90), т.е. сразу ч/б и перевернутое.
Не вижу вопроса. Причем здесь поворот?
Нужно повернуть и одновременно сделать ч\б?
← →
seregka (2005-03-20 20:32) [17]нет.
Объясню популярно:
допустим я повесил ч\б на Button1, поворот на Button2.
Если я нажимаю на Button1 ничего не происходит. Если же после этого на Button2, то картинка сразу поворачивается и становится черно-белой.
← →
Anatoly Podgoretsky © (2005-03-20 21:04) [18]Fenik (20.03.05 19:50) [14]
Выходит, что ты специально подставил парня, приведя заведомо ложный код [1]
seregka (20.03.05 20:03) [15]
Рабочий говоришь, тогда сделай три прямоугольника и закрась их -один 100% красного, другой 100% зеленого и последний 100% синего затем преобразуй и посмотри глазами. При правильной формуле яркость зеленого цвета должна быть примерно в 6 раз меньше, чем синего.
← →
Fenik (2005-03-20 21:05) [19]"У тебя ошибка в программе." (с) АП :))
Я не телепат. Код покажи.
Наверное экран не обновляешь после нажатия на Button1.
← →
Fenik (2005-03-20 21:11) [20]> Anatoly Podgoretsky © (20.03.05 21:04) [18]
> Выходит, что ты специально подставил парня, приведя заведомо ложный код [1]
:)
У меня в старой программе (когда писал её, не знал еще про эту формулу) был тот код, что я привел в [1]. Я просто выдрал его оттуда, забыв, что есть правильная формула. А потом меня удивила эмоциональная реакция AlterEgo of WondeRu.
Делать мне больше нечего, как подставлять кого-то.
← →
Anatoly Podgoretsky © (2005-03-20 21:13) [21]Fenik (20.03.05 21:05) [19]
Молодец, знаешь и права соблюдаешь.
Ты бы ранее вместо наезда спросил бы почему тебе сказали, что код неверный и не было бы инцидента.
Если автору вопроса интересно, то я могу привести более полный список коэффициентов. Этот не единственный и они должны использоваться в зависимости от области применения.
← →
Anatoly Podgoretsky © (2005-03-20 21:14) [22]Fenik (20.03.05 21:11) [20]
Ну все будем считать, что ты понял и извинился.
← →
Fenik (2005-03-20 21:18) [23]> Anatoly Podgoretsky © (20.03.05 21:13) [21]
> Если автору вопроса интересно, то я могу привести более полный список коэффициентов. Этот не единственный и они должны использоваться в зависимости от области применения.
Интересно не только автору вопроса..
← →
seregka (2005-03-20 21:59) [24]procedure Threshold(Bitmap: TBitmap; Value: Byte; Color1, Color2: TColor);
function ColorToRGB(Color: TColor): TRGB;
begin
with Result do begin
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
end;
end;
type
TRGB = packed record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var x, y: Word;
C1, C2: TRGB;
Dest: pRGB;
begin
C1 := ColorToRGB(Color1);
C2 := ColorToRGB(Color2);
for y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
if (Dest^.b + Dest^.g + Dest^.r) / 3 > Value
then Dest^ := C1
else Dest^ := C2;
Inc(Dest);
end;
end;
end;
procedure form1.button1click(sennder...);
begin
bmp:=image1.picture.bitmap;
Threshold(Bmp, 127, clWhite, clBlack);
end;
← →
Anatoly Podgoretsky © (2005-03-20 22:04) [25]Y = K1*R + K2*G + K3*B
1. 0,360*R + 0.530*G + 0.110*B
2. Стандаpт CCIR 601-1 (как в стандаpтной VGA-ой функции):
0,299*R + 0,587*G + 0,114*B
3. Стандаpт CCIR 709:
0,213*R + 0,715*G + 0,072*B
4. Стандаpт ITU:
0,222*R + 0,707*G + 0,071*B
← →
WondeRu © (2005-03-21 09:09) [26]Fenik (20.03.05 21:11) [20]
А потом меня удивила эмоциональная реакция AlterEgo of WondeRu.
нормальная реакция!!! (по крайней мере для меня!!!)
Anatoly Podgoretsky © (20.03.05 22:04) [25]
век живи, век учись! Спасибо за формулы, знал только вторую! А откуда дровишки, очень интересно? :)
← →
Fenik (2005-03-21 20:06) [27]> Anatoly Podgoretsky © (20.03.05 22:04) [25]
Спасибо.
> seregka (20.03.05 21:59) [24]
1. if (0.114*Dest^.b + 0.587*Dest^.g + 0.299*Dest^.r) > Value
Хоть результат будет похож на пердыдущий, но зато "правильный" :))
2. Так я и думал - не обновляешь экран.
procedure form1.button1click(sennder...);
begin
bmp:=image1.picture.bitmap;
Threshold(Bmp, 127, clWhite, clBlack);
Image1.RePaint;
end;
> WondeRu © (21.03.05 09:09) [26]
> нормальная реакция!!! (по крайней мере для меня!!!)
Я ЭТО ПРИМУ К СВЕДЕНЬЮ !!!!!!!!!!!
:)
← →
Anatoly Podgoretsky © (2005-03-21 20:15) [28]WondeRu © (21.03.05 09:09) [26]
Из Интернет вестимо, зная названия стандартов можно определить область применения, но для большинства случаев, то есть для экранных изображений нужна вторая, а вот вывод на печать, факсы, фотографии нужны другии.
← →
uny © (2005-03-22 06:03) [29]вестимо например отсюда:
http://www.rudtp.ru/articles.php?id=44
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.035 c