Listing Program Mengubah Citra Grayscale Menjadi Citra Biner Delphi

Friday, 3 December 2010

Citra biner merupakan citra yang terdiri dari komponen warna hitam dan putih. Sifat pengolahan citra biner relatif sederhana, cepat dan mudah diimplementasikan sehingga bisa dijalankan meski memori yang dimiliki kecil. Berikut listing mengubah citra grayscale menjadi citra biner dengan metode otsu (otsu method).

procedure TForm1.btnBinerClick(Sender: TObject);
const level = 255;
var
  histogram: array[0..255] of integer;
  PH: PByteArray;
  TotalMean, Variance, maxVariance, zerothCumuMoment, firstCumuMoment : real;
  i,k: integer;
   j: integer ;
  p: PByteArray;
  Q: PByteArray;
  threshold: byte;
  area: Word;
begin
  imgbin:= tbitmap.Create;
  imgbin:= imggray;
  for i:=0 to level-1 do
  begin
    histogram[i]:=0;
  end;
  for i:=0 to (imgbin.Height-1) do
  begin
    PH:=imgbin.ScanLine[i];
    for j:= 0 to (imgbin.Width-1) do
    begin
      inc(histogram[PH[j]]);
    end;
  end;
  //compute otsu method
  threshold:=0;
  totalMean := 0;
  maxVariance := 0;
  firstCumuMoment := 0;
  zerothCumuMoment := 0;
  area := imgbin.Height * imgbin.Width;
  for k:= 0 to level-1 do TotalMean := TotalMean + (k * histogram[k] / area);
  for k:= 0 to level-1 do
  begin
    zerothCumuMoment := zerothCumuMoment + histogram[k] / area;
    firstCumuMoment :=  firstCumuMoment + (k * histogram[k] / area);
    variance := totalMean * zerothCumuMoment -  firstCumuMoment;
    variance := variance * variance;
    if ((zerothCumuMoment <> 0) and (zerothCumuMoment <> 1)) then
    begin
      variance := variance /(zerothCumuMoment * (1 - zerothCumuMoment));
      if (maxVariance < variance) then
      begin
        maxVariance := variance;
        threshold := k;
      end;
    end;
  end;

  for i:=0 to imgbin.Height-1 do
  begin
    P:= imgbin.ScanLine[i];
    Q:= imggray.ScanLine[i];
    for j:=0 to imgbin.Width-1 do
    if Q[j] > threshold   then
    P[j] := 255
    else
    P[j] := 0;
  end;
  imgbiner.Picture.Bitmap:= imgbin;
  imgbin.SaveToFile('biner.bmp') ;
end;

Untuk pengambilan gambarnya telah dijelaskan dalam aritkel sebelumnya yaitu melalui webcam.

4 komentar:

abdul said...

:e:

Anonymous said...

:aB

Anonymous said...

:a8

Unknown said...

ada ngak source code atw program delphi untuk convert image to biner (1001)...?
d mohon bantuannya

Post a Comment

 
 
 

Teman