画像圧縮について勉強していてあやふやなところがあり教えて頂きたいです.
変換前
|126, 138, 135, 118, 118, 126, 126, 130|
|150, 168, 161, 122, 105, 109, 100, 118|
|150, 150, 126, 150, 142, 126, 126, 117|
|150, 161, 168, 130, 134, 150, 138, 130|
|130, 118, 134, 142, 157, 142, 117, 126|
|115, 117, 108, 117, 101, 99, 117, 126|
|122, 130, 130, 138, 117, 108, 108, 138|
|142, 118, 134, 117, 109, 91, 126, 109|
変換後
|1029, 52, 10, -21, -1, -3, 2, 1|
| 39, 21, 0, 6, -22, -17, 4, -7|
| -40, 12, 24, -19, -2, 7, -4, 5|
| -32, -34, -1, -7, 5, -8, 5, -7|
| 22, -14, -10, 16, -12, 4, 12, 18|
| 19, -17, 1, -3, -6, -3, -2, -8|
| -24, -18, 3, 15, 9, 15, -20, 1|
| 9, -16, -30, 14, 29, -2, -5, -5|
URLから参考にしたものですが,変換すると右下から左上へと値が高くなっています.
これは圧縮することで,左上の情報量が大きくなる方法ということはわかります.
ですが,量子化する方法がよくわかりません.
この値を使ってどうすればいいのでしょうか.
変換前は濃度あたりだと思うんですが,変換後はマイナスの値がついててさっぱりです.
検索していろいろでてきたのですが,
難しくてわからないところもあったので
一言“量子化する”とかじゃなくて
“離散コサイン変換後の量子化方法はこうするものだ”という具体的なものができればききたいです.
最終的に画像圧縮プログラムを組もうと思っています.
圧縮までに必要な仮定を教えてください.
あと,プログラムはVisualC++OpenCVで組もうと思うのですが,勉強ですので関数を使うつもりはありません.
おまけですが,JPEGで離散コサイン変換するという方法があるみたいですが,IPLimageを使用するのは不可能ですか?
質問する場所がわからなかったのでここでさせて頂いたのですが,間違っていたら移動させますので教えて頂けるとありがたいです.
よろしくお願いします.
参考URL:http://fussy.web.fc2.com/algo/algo8-6.htm
No.2ベストアンサー
- 回答日時:
> URLから参考にしたものですが,変換すると右下から左上へと値が高くなっています.
> これは圧縮することで,左上の情報量が大きくなる方法ということはわかります.
まず、一つ指摘をしておきます。離散コサイン変換は、情報量を減らしません。つまり、この変換は情報の圧縮を行っているわけではないのです。しかも、
> 変換前は濃度あたりだと思うんですが,変換後はマイナスの値がついててさっぱりです.
だとすると、”離散コサイン変換”が何をするものなのか、残念ながら理解できていないと思います。
> ですが,量子化する方法がよくわかりません.
> この値を使ってどうすればいいのでしょうか.
参考URL に、
> 画素ブロックの各要素に対して、量子化テーブルの同じ行列にある要素を使って量子化/逆量子化するため、
> 画素ブロックの各要素をSuv、量子化テーブルの各要素をQuvとすると、量子化・逆量子化変換式は次のようになります。
> 量子化 : Ruv = Suv / Quv
> 逆量子化 : Suv = Ruv X Quv
と、書かれています。
つまり、量子化テーブルの値で割り算をすればよいのです。
引き続き回答ありがとうございます.
そうですね.
もう一度フーリエのところから見直してみることにします.
回答者さんのおかげで,自分の理解のおかしいところがどこか気づけたのでよかったです.
URLの内容が読んでもわけがわからなかったので,参考に挙げて下さったキーワードをもとに理解を深めていこうと思います.
ありがとうございました.
No.3
- 回答日時:
一般に非可逆な圧縮では、人間の感度が低い情報を省略することで圧縮します。
JPEG画像では細かな違いは大きな違いより目立たないことを利用し、周波数分解した画像データの高周波成分を省略することで圧縮します。この周波数分解がDCTで、高周波成分の省略が量子化です。
量子化は簡単に言えば“丸め”です。この周波数成分はnビットで表すと決めたら、そのビット数で表現できるように値を丸めます。例えば0~9の値を取りうるところを1ビットで表すなら四捨五入で0,1にするとかです。
具体的な量子化ビット数などは規格で決まっていると思いますが詳細は知らないので調べてください。
回答ありがとうございます.
丁寧な説明助かります.
圧縮についてまだまだ勉強できていないところがあったので勉強になります.
参考させて頂きます.
ありがとうございました.
No.1
- 回答日時:
まず、フーリエ変換って(雰囲気だけでも)理解してますか?
フーリエ変換自体は圧縮技術ではありません。
離散コサイン変換も、離散化による誤差は出るものの、基本的には可逆の変換であって圧縮技術ではありません。
圧縮するのに都合のいいデータにするための前処理です。
また、圧縮方法も決まったやり方があるわけではありません。JPEGではこうしている、というのは資料にあたればわかりますが、DCTを利用した圧縮が全て同じ方法を使っているわけではありません。
画像圧縮技術を自前で開発したいのなら、もうちょっと既存の技術について勉強してからにした方がよいでしょう。
単に圧縮したいだけなら、既存のフォーマットを使うのがいろいろと好都合です。
この回答への補足
回答ありがとうございます.
フーリエ変換は3年ほど前に授業で習ったので
自信はないですが大まかにぐらいは理解してるつもりです
私の質問方法が悪かったみたいです.
わざわざ回答を頂いたのに勘違いを招いて申し訳ありません.
既存の方法で,画像圧縮方法かつプログラムの勉強をしようと思っています.
それで,躓いたのが離散コサイン以降の処理に対する理解でした.
離散コサイン変換したあとの量子化の処理というのが,あまり良く理解できていないのでそれに対する解説が聞きたくて質問をしたしだいです.
量子化の言葉の意味はわかるが,具体的にどのような処理をするかわからないというものです.
もう少し自分でも勉強してみます.
よろしければ回答いただけると助かります.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 生物学 【生命科学】ヒトが1日に消費するATP量?(精度を変えて再計算) 3 2022/10/07 18:48
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
- 物理学 物理の問題が分かりません。 解説よろしくお願い致します。 ピストンのついた容器に一定量の気体を入れ、 2 2023/06/20 19:46
- 化学 温度変化に伴う圧力と体積の変化について 2 2022/07/25 17:21
- Ruby 英数字を含む文字列(0-9,A-Z)の桁数圧縮をするには 5 2022/06/28 18:15
- Excel(エクセル) 【至急 詳しい方教えて下さい】Excelの表を変換したい 6 2022/04/21 18:35
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- 数学 離散フーリエ逆変換が周波数分割数をNにできる理由について 4 2022/09/18 12:56
- 電気・ガス・水道 電気代についてのご意見 8 2023/03/07 06:09
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
VB6.0の「vbFromUnicode」はVB....
-
Pythonの指数表記について
-
VBでUTF-8で出力
-
【C++/CLI】int型からString型...
-
16進をASCIIコードに変換する...
-
バイト型のデータをLong型に変換
-
2の補数の計算について
-
16進コード文字列を文字列に変換
-
C言語の型変換について
-
VBScript Cellの書き出し
-
Delphi6でメール送信プログラム
-
vb6の桁数指定
-
10進数を2進数
-
VBAのstrConv関数のUNICODE変換...
-
2進数から10進数へ変換
-
数字→漢数字変換
-
VB6.0 String型→Long型変換方法...
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0の「vbFromUnicode」はVB....
-
VB.NETで1→A、2→B、26→Z、27→AA...
-
C++ 文字列変数と16進数の比較
-
16進をASCIIコードに変換する...
-
バイト型のデータをLong型に変換
-
16進コード文字列を文字列に変換
-
WORD型をCString型に変換する方法
-
textbox.textやlabel.captionの...
-
2の補数の計算について
-
Boolean型変数の値を反転する方法
-
vb6の桁数指定
-
VC++ std::stringからLPCWSTRに...
-
VB6.0 String型→Long型変換方法...
-
n進数の値を10進数の値に変換す...
-
【C++/CLI】int型からString型...
-
エクセルでメールヘッダーを解...
-
C#でListとDictionaryの判別方法
-
2進数から10進数へ変換
-
VB6 case文について
-
文字型を日付/時刻型に変換する...
おすすめ情報