色の階調変換

  • (by K, 2006.09.20)
  • I.Tak.さんとの意見の違いの検討・・・というわけじゃないけど、こんな見方もできたなという内容

逆変換

  • 256階調を13階調にすることを考えるにあたり、この変換を仮にfとする。この逆変換(13階調を256階調に変換)をgとおく。
  • fを生成するに当たって適用したアルゴリズムや丸めの手法でgに相当するものを構築したとき、これがgに完全に等しければ、それはよい変換に(僕には)思える。

  • 確か僕の提唱した式は、256階調値をx、13階調値をyとすると、y = 切り捨て(x * 13 / 256); だったと思う。
  • もし同じ考え方で逆変換を作るとすると、 x = 切り捨て(y * 256 / 13); になると思う。13階調値をこの式で256階調拡張して、その後にもう一度13階調に戻したら、必ずもとの値に戻ることが保証できるだろうか?
  • y' = 切り捨て(切り捨て(y * 256 / 13) * 13 / 256);
    • y=0のとき、0に変換される。y=1のとき、0に変換される。だめじゃん!切り捨てにより端数が捨てられていることが影響している。

  • ではI.Tak.さん方式はどうなんだろう?四捨五入だから端数が捨てられずに助かるのか?
  • y' = 四捨五入(四捨五入(y * 255 / 12) * 12 / 255);
    • y=1のとき、1になる。おおやるなー。y=2のとき、2になる。これもOK。

  • でもやはり0-255を変換したときに0-12の値の分布が同比率であるほうが僕には好ましく思える。ということで、この性質を保持しつつ、逆変換に強い方法がほしい。・・・階調数が増えるときは切り上げ、とかにすればいいのかな?・・・それもダメそうだなあ。

  • ありえない想定だけど、階調数1から階調数256へ変換するという状況を考えてみる。階調数1というのは全部が色0というわけだけど、これは0-255のどれにするべきなのか?僕の式だと全部0になる。I.Tak.さんの式だと0/0が出現してなんでもあり・・・うーん、これはどっちも甲乙つけがたいなあ。 −ダメだ、もっとよく考えないと。

  • とにかく単純な切り捨てがいけない。しかし四捨五入のように0.5も足すのは、やりすぎ( * 13 / 256 のまま0.5を足すと、1を越える)。となると、* 13 / 256 のままでも1を越えずに済むような最大の数イプシロンを足せばいいということか!
    • y = 切り捨て((x * 13 + 12) / 256);
    • x = 切り捨て((y * 256 + 255) / 13);
    • y' = 切り捨て((切り捨て(y * 256 + 255) / 13) + 12) / 256);
  • ん?これはまずい。13階調から256階調にする際に、0が0にならないという症状が生じている。これはどうなんだろう?でもそれを言ったら、単純切り捨てでは12も255にはならずに236になるわけで(そのかわり0は0になる)、うーん、対象性から言うと、255ではなく128くらいを足すのが良さそうだ。
  • 階調拡張に際して0が0にならない、12が255にならないのを気持ち悪く考えるなら、I.Tak.さん方式しかないと思う。
    • y = 切り捨て((x * 13 + 6) / 256);
    • x = 切り捨て((y * 256 + 128) / 13);
    • y' = 切り捨て((切り捨て(y * 256 + 128) / 13) * 13 + 6) / 256);
      • y=0のとき、0になる。1のとき、1になる。これはうまくいきそうだ。
  • この新川合方式だと、階調1から階調256へ拡張すると、色はすべて128になる。何となくこれはこれで納得できる気がする。
  • この新川合方式とI.Tak.さんの方式のどちらがいいと思うかは、状況や各自の好みによると思うけど、とりあえず単純切り捨ての旧川合方式は逆変換で元に戻るかどうかという点ではダメだと思う。

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-09-20 (水) 17:03:13 (5761d)