- 締切済み
画像の拡大
C++Builderで濃淡画像と2値画像が混ざった画像を拡大するプログラムを作ることになったのですが、どのようなプログラムにすればいいか見当もつきません。 アドバイスいただけますでしょうか。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- echoes_x86
- ベストアンサー率65% (21/32)
こんにちは. >文字と画像の境界が曖昧になってしまわないでしょうか? これはいかなる画像拡大法を用いてもそうなることであり,そして仕方の無いことです. 詳細は省略しますが,拡大を行ったところでエッジ近傍の鋭さを表す, 「画像の高周波成分」が復活するわけではないからです. この意味では高周波成分を強調するバイキュービックは良い選択です. この方法が拡大と同時に「エッジ強調処理」をかけるようなものだからです. 周波数云々のことが分からない場合はフーリエ変換などの文献や書籍を当たってください. なお,高周波成分の復活(強調ではありません)は, いわゆる「信号処理学」の分野になってしまいますので, この場所で簡単に説明することができるような内容ではありません. とりあえず,拡大アルゴリズムが指定できる画像処理ソフト(gimpなど) で拡大を行ってみて視覚的に判断してはどうでしょうか. 私の回答はかなり「理論寄り」の回答であり,「やってみた方が分かりやすい」こともありますので.
- echoes_x86
- ベストアンサー率65% (21/32)
こんにちは. 画像拡大で必要なのは要するに「間の画素値を作る」ことです. これは「拡大後の画素値が何処から来たか」を計算することによります. 例えば,100*100の画像を3/2倍に拡大すると150*150になるのはわかると思います. ここで,拡大後の画像の(100,100)の画素は,元の画像の(100*2/3,100*2/3)=(66.66,66.66)に対応します. ところが,元の画像の画素値は整数座標でしか分からないわけですから, 「間の画素値を作る」必要が生じます. 通常は,(66.66,66.66)近傍の画素値を寄せ集めて「間の画素値を作る」ことになります. 最も単純なのは「最も近くの画素値を平均すること」です(バイリニア法と言います). さらに「もう一回り外側の画素値も重みをつけて使うこと」が考えられます. ここで最も良く使われるのが「バイキュービック法」です. 数学的には「間の値を作ること」を「内挿」と言います. 理論的に最も完全な内挿方法はフーリエ変換から導かれる, 「Sinc関数による重み付け」です. なのですが,この関数は一画素を作るのに全ての画素値を使わねばなりません. これでは計算量の面で現実的ではないので,有限の近傍で計算を打ち切ります. 一次近傍→バイリニア法 二次近傍→バイキュービック法等 三次近傍→Lanczos3等 です.下の二つはいずれもSinc関数を近似する目的で構成されています. バイキュービック法が縮小に向かないのは, これが「高周波成分を強調するため」です. 縮小時に高周波成分を強調すると逆にギザギザ感が増すことになります.
- eroermine
- ベストアンサー率18% (83/444)
bi-cubic でしょう。 画像縮小に使うものだと思ってるひとが多いようですが、実際は拡大専用方式ですね。 もっと難しい方法もいろいろあるようですが、なんかわけ分からんという印象。
お礼
回答ありがとうございます。 さっそくバイキュービック法について調べてみたいと思います。
プログラムだけでなく、アルゴリズムの問題だと思います。 専門書でも読んでみてはどうでしょうか。 http://www.amazon.co.jp/s/ref=nb_ss_gw?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Daps&field-keywords=%89%E6%91%9C%8F%88%97%9D
お礼
回答ありがとうございます。 お返事遅れて申し訳ありません。 回答を受けてバイキュービック法を少し調べたのですが、例えば濃淡画像に2値の文字が混ざった画像を拡大した時、文字と画像の境界が曖昧になってしまわないでしょうか? そこをクッキリさせるにはどうしたらいいでしょう?