なんとなく、ふわっと・・

写真と画像処理関係とひとりごとをなんとなく書き溜めていきたい

カミナリ電機

2007-10-23 00:34:08 | 写真







以上、谷田部、つくば市

個人営業の商店は、スーパーや郊外の大型店に押されて、いつのまにかなくなって
しまった。子供の頃には、普通に肉屋、魚屋、豆腐屋、八百屋、いろんな店が
あったものだが。谷田部の中心街には、まだすこしだが、これらの商店が
残っていて、なつかしいのと、すこしうれしかった。



Comment

S

2007-10-23 00:19:48 | rinkaku




Comment

Delphi で Rinkaku Application その10

2007-10-23 00:09:04 | Delphi


前回に引き続き、Turbo Delphi で Rinkaku Application をつくる、の10回目。

今回は、前回までに得られた画像のコントラスト調整をする RinkakuContrast() を
作ってテストする。

RinkakuUtils.pas に以下の関数を追加する。

function RinkakuContrast(var bmp: TBitmap; factor: integer): Boolean;
var
  w, h, x, y, i: integer;
  a: double;
  src: TBmpData8;
  d: array[0..255] of byte;
begin
  result := false;
  if bmp.PixelFormat <> pf8bit then exit;

  if (factor > 80) or (factor < 0) then exit;

  w := bmp.Width;
  h := bmp.Height;

  a := (127.5 + factor * 1.8) / (127.5 * 127.5) ;

  for i := 0 to 255 do
    if i < 128 then
      d[i] := AdjustByte( -(i-127.5)*(i-127.5)*a + 127.5 - factor)
    else
      d[i] := AdjustByte((i-127.5)*(i-127.5)*a + 127.5 - factor);


  src := TBmpData8.Create(bmp);

  for y := 0 to h-1 do
    for x := 0 to w-1 do
      src[x,y]^ := d[ src[x,y]^];

  src.Free;

  result := true;
end;


テストコードをしめす。

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp, tmp: TBitmap;
begin
  bmp := LoadPng('C:\Home\ImgWork\RaceQueen.png');
  if not Assigned(bmp) then exit;
  bmp.PixelFormat := pf24bit;

  tmp := BmpClone(bmp);

  if Rinkaku(tmp, 25)
     and Contrast8(tmp, 105, 0.05)
     and AntiBlackOut(bmp, tmp, 55, 30, 0.5)
     and Kuwahara8Ex(tmp, 1, true)
     and Median8(tmp, 1)
     and SetTwoColorGrayScalePalette(tmp, RGB(44, 51, 0), RGB(255, 244, 238))
     //and RinkakuContrast(tmp, 50)
  then
  begin
    Canvas.Draw(5, 35, tmp);
    Clipboard.Assign(tmp);
  end;

  bmp.Free;
  tmp.Free;
end;



RinkakuContrast() なし。


これは、意図的に薄く塗ってある。

RinkakuContrast(tmp, 25)


RinkakuContrast(tmp, 50)


RinkakuContrast(tmp, 75)



今回つくった RinkakuContrast() の合理的な論理はない。
Rinkaku 画像は、エッジ抽出による線画に、元画像の濃淡を薄く重ねたものである。
したがって、輝度のヒストグラムは、線画部分の暗い領域がほんの少し、あとは
うすく塗りつぶした部分の比較的明るい部分が圧倒的に多い。コントラストを強調する
ためには、この比較的明るい部分の分布を拡大し、全体に暗いほうへ分布をシフトさせると
よい。これを簡単な数式と、パラメータを一つだけつかって実現した一例が
RinkakuContrast() フィルタである。

このフィルタの効果を PaintShopPro4 のヒストグラムで見てみよう。

RinkakuContrast() なし。


RinkakuContrast(tmp, 75)


だいたいねらったとおりになっているのが分かるだろう。

今回で Rinkaku Application を作るためのフィルタづくりは終わり。
次回はこのシリーズ最後で、Application を Turbo Delphi でつくる。




Comment