Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Преобразование изображения   Найти похожие ветки 

 
Tasha   (2005-10-18 23:30) [0]

Подскажите, плиззззз, как в делфи сделать из цветной картинки черно-белую???


 
Fenik ©   (2005-10-19 00:08) [1]

Исходный текст:

{ **** UBPFD *********** by delphibase.spb.ru ****
>> Порог между двумя цветами на Bitmap

Bitmap преобразуется в двухцветное изображение.

Зависимости: Graphics
Автор:      Fenik, chook_nu@uraltc.ru, Новоуральск
Copyright:  Собственное написание (Николай федоровских)
Дата:       1 июня 2002 г.
************************************************ }

procedure Threshold(Bitmap: TBitmap; Value: Byte; Color1, Color2: TColor);
type TRGB = 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;

var x, y: Word;
   C1, C2: TRGB;
   Dest: pRGB;
begin
 Bitmap.PixelFormat := pf24Bit;
 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
     //если среднеарифметическое R, G и B больше Value,
     //то точку (x, y) закрашиваем цветом Color1,
     //иначе - цветом Color2
     if (Dest^.r + Dest^.g + Dest^.b) / 3 > Value
       then Dest^ := C1
       else Dest^ := C2;
     Inc(Dest);
   end;
 end;
end;


Пример использования:

Threshold(FBitmap, 127, clWhite, clBlack);

http://delphibase.spb.ru/?action=viewfunc&topic=mediaimg&id=10176


 
MBo ©   (2005-10-19 06:23) [2]

>Fenik
Думаю, тебе стоит явно указывать в описании своих процедур, работающих через Scanline, что они для 24-х битовых битмапов.


 
WondeRu ©   (2005-10-19 11:13) [3]

Fenik ©   (19.10.05 0:08) [1]
если среднеарифметическое R, G и B больше Value,

яркостные веса разные у R G B!!!

необходимо использовать одну из формул яркости:

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


http://wap.wonderu.com/index.wml?pid=3


 
Antonn ©   (2005-10-19 15:45) [4]

Fenik ©   (19.10.05 0:08) [1]
возможно не понял, ему нужно картинка в градациях серого(о как замутил), а не 2 цвета и порог. я так делал(веса цветов из посто[3] уж сам расставьте, меня и так устраивает:)):

procedure PrepareBitmapBW(_B_out:Tbitmap);
const
 Pixels = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..Pixels-1] of TRGBTriple;
var x, y: Integer; RowOut: PRGBArray; _s:integer;
begin
 _B_out.PixelFormat:=pf24bit;
 for y:=0 to _B_out.Height-1 do begin
    RowOut:= _B_out.ScanLine[y];
   for x:=0 to _B_out.Width-1 do begin
         _s:=trunc((RowOut[x].rgbtRed+RowOut[x].rgbtGreen+RowOut[x].rgbtBlue)/3);
        if _s>255 then _s:=255; if _s<0 then _s:=0;
         RowOut[x].rgbtRed:=_s;
         RowOut[x].rgbtGreen:=_s;
         RowOut[x].rgbtBlue:=_s;
   end;
 end
end;


 
WondeRu ©   (2005-10-19 15:56) [5]

Antonn ©   (19.10.05 15:45) [4]
s:=trunc((RowOut[x].rgbtRed+RowOut[x].rgbtGreen+RowOut[x].rgbtBlue)/3);


см. [3] - нельзя использовать среднее арифметическое для вычисления яркости!


 
Fenik ©   (2005-10-19 18:09) [6]

> MBo ©  (19.10.05 06:23) [2]
> Думаю, тебе стоит явно указывать в описании своих процедур, работающих через Scanline, что они для 24-х битовых битмапов.


Да, я помню, когда мне посыпались письма, что функции не работают, я попросил во все вставить строку
Bitmap.PixelFormat := pf24Bit; :)
По-моему, это самое явное указание.
Кстати, база почему-то закрыта для записи. Забыл про неё Димка Маслов что ли?

> WondeRu ©  (19.10.05 11:13) [3]
> яркостные веса разные у R G B!!!


Да знаю я про эти стандарты, не кричи так :)

> необходимо использовать одну из формул яркости:

Почему это? В данном случае есть большая разница?

Ну замени

  if (Dest^.r + Dest^.g + Dest^.b) / 3 > Value

на

with Dest^ do
  if (28*B+151*G+77*R) shr 8 > Value // это оптимизированная формула (0.299R+0.587G+0.114B)


Сможешь отличить результаты на глаз? :)

> Antonn ©  (19.10.05 15:45) [4]
> возможно не понял, ему нужно картинка в градациях серого(о как замутил), а не 2 цвета и порог.


Градации серого - это градации серого, а черно-белая - это черно-белая :))


 
Antonn ©   (2005-10-19 18:09) [7]

WondeRu ©   (19.10.05 15:56) [5]
см. [3] - нельзя использовать среднее арифметическое для вычисления яркости!

а слабо прочитать комментарий в скобках?
:)


 
Antonn ©   (2005-10-19 18:11) [8]

Fenik ©   (19.10.05 18:09) [6]
Градации серого - это градации серого, а черно-белая - это черно-белая :))

хм, по-моему, мы по разному понимаем значение "черно-белое". Телевизоры черно-белые видели? :)


 
Fenik ©   (2005-10-19 20:20) [9]

> Телевизоры черно-белые видели? :)

Видели. Это градации серого :)


 
Antonn ©   (2005-10-20 03:20) [10]

Fenik ©   (19.10.05 20:20) [9]
Видели. Это градации серого :)

однако называется черно-белый:)


 
WondeRu ©   (2005-10-20 13:56) [11]

Antonn ©   (19.10.05 18:09) [7]
а слабо прочитать комментарий в скобках?

Извини :) Я тока на исходник глянул :)))



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.046 c
2-1142023553
zxcv
2006-03-10 23:45
2006.03.26
panel CopyRect in bitmap


2-1141985633
Gleb
2006-03-10 13:13
2006.03.26
Как с помощью Delphi перемножить две матрицы?


1-1140452149
Gear
2006-02-20 19:15
2006.03.26
Динамическое размещение объектов на форме.


2-1141837143
ctudent
2006-03-08 19:59
2006.03.26
Запись слова в массив


2-1142248218
Fenix
2006-03-13 14:10
2006.03.26
WebBrowser