Вниз
Скачать: CL | DM;

Цветное изображение в чёрно-белое   Найти похожие ветки 

← →
Japan   (2003-12-17 19:29) [0]

Как преобразовать цветное изображение (bmp) в чёрно-белое?


← →
miek ©   (2003-12-17 22:24) [1]

Есть пиксел RGB. Самый простой способ - сложить R,G,B, потом разделить на 3 (получив, допустим, D) и записать пиксел DDD.


← →
Japan   (2003-12-18 00:42) [2]

Если так для каждого пикселя делать, то это слишком долго получается, если картинка большая.
Есть ли более быстрый способ?


← →
Asteroid ©   (2003-12-18 03:24) [3]

Черно-белое или с оттенками серого?
А для каждого пикселя так или иначе придется.


← →
REP ©   (2003-12-18 12:30) [4]

>>Есть пиксел RGB. Самый простой способ - сложить R,G,B, потом разделить на 3 (получив, допустим, D) и записать пиксел DDD.

Так нельзя. У каждого цвета своя интенсивность. Не помню сейчас формулу. Там у каждого цвета свои коэффициенты.


← →
Awod   (2003-12-18 13:05) [5]

Не помню как это делается, но у меня есть код программы, который когда то писался для компутерной графики в институте, который переводит картинку в чёрнобелое изображение. Если нужно, могу выслать


← →
Sergio Bassy   (2003-12-18 13:19) [6]

>Если так для каждого пикселя делать, то это слишком долго >получается, если картинка большая.
иначе - только пользоваться доп. библиотеками, что тебе, как новичку, затруднительно. тебе проще- попиксельно.
>Есть ли более быстрый способ?
более быстрый (по сравнению с работой через канву) - это используй ScanLines.


← →
Sergio Bassy   (2003-12-18 13:22) [7]

формула преобразования в оттенки серого:
c=0.3r+0.59g+0.11b


← →
Sergio Bassy   (2003-12-18 13:24) [8]

Если тебя интересуют градации серого, то можешь юзать одну из таких формул:
1. Y=0.36*R + 0.53*G + 0.11*B
R=G=B=Y

2. Стандаpт CCIR 601-1 (как в стандаpтной VGA-ой функции):
Gray=(299*Red+587*Green+114*Blue)/1000.

3. Стандаpт CCIR 709:
Gray=(213*Red+715*Green+72*Blue)/1000.

4. Стандаpт ITU:
Gray=(222*Red+707*Green+71*Blue)/1000.

Если же тебе надо получить двухцветное изображение, то следует применять алгоритмы дизеринга, например Floyd-Steinberg Dithering. Простое отсечение порога(без дизеринга) Gray=(Gray>127)?255:0 не является удовлетворительным решением.


← →
bolegator ©   (2003-12-18 19:28) [9]

procedure ConvertToBW(bitmap:TBitmap; Threshold:integer);
var
x,y,v,b,mR,mG,mB:integer;
  newbmp:TBitmap;
  p1:pRGB;
  p2:pbyte;
begin
if Bitmap.Pixelformat<>pf24bit then exit;
  newbmp:=TBitmap.Create;
  newbmp.Width:=bitmap.Width;
  newbmp.Height:=bitmap.Height;
  newbmp.PixelFormat:=pf1bit;
  for y:=0 to bitmap.height-1 do begin
   p1:=bitmap.ScanLine[y];
     p2:=newbmp.ScanLine[y];
 for x:=0 to bitmap.width-1 do begin
      b:=x mod 8;
      with p1^ do
       v:=(r*21 + g*71 + b*7) div 100;
        if v>=Threshold then
   p2^:=p2^ or bitmask[b]
        else
           p2^:=p2^ and (not bitmask[b]);
        inc(p1);
        if b=7 then
         inc(p2);
   end;
  end;
  CopyBitmap(newbmp,bitmap);
  newbmp.free;
end;

Threshold=150..220


← →
bolegator ©   (2003-12-18 19:30) [10]

const bitmask:array [0..7] of byte=($80, $40, $20, $10, $08, $04, $02, $01);


← →
Asteroid ©   (2003-12-18 23:43) [11]

И у всех свои формулы :)


← →
bolegator ©   (2003-12-19 12:31) [12]

Только у одних color-> gray
а у других color->bw


← →
Ангел. ©   (2003-12-21 17:48) [13]

Как вариант почитай в хелпе по дельфи про TBitmap А конкретно пиксельформат и монохороме :)



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.034 c
1-1079707691
sherminator
2004-03-19 17:48
2004.04.11
часть переменной...


4-1079172047
Sur
2004-03-13 13:00
2004.04.11
TProcessEntry32


1-1080156667
jetty
2004-03-24 22:31
2004.04.11
Как организовать секундомер,


3-1078984791
ГАГН
2004-03-11 08:59
2004.04.11
DBComboBox?


14-1082402837
Gomosapin
2004-04-19 23:27
2004.04.11
Помогите решить простую задачу. Pascal




   Наверх