MATLAB 2 次元逆コサイン変換:周波数データからイメージを復元
逆コサイン変換は、ICT または IDCT と呼ばれることが多く、コサイン変換のプロセスを逆にする数学演算です。これは、信号や画像を周波数領域表現から再構築するための信号および画像処理に特に役立ちます。
2-D 信号または画像のコンテキストでは、2-D 逆コサイン変換 (2-D ICT または 2-D IDCT) は、コサイン係数の行列 (信号または画像の周波数成分を表す) を空間領域に変換し、元の信号または画像を生成します。
MATLAB の 2 次元逆コサイン変換は、コサイン値の行列を空間領域イメージに変換するために使用されます。これは 2-D コサイン変換の逆演算であり、画像処理と圧縮で一般的に使用されます。 idct2 関数は、MATLAB で 2 次元逆コサイン変換を実行するために使用されます。
2 次元逆離散コサイン変換
MATLAB では、関数 idct2 を使用して 2 次元逆コサイン変換を実行します。コサイン係数の行列を入力として受け取り、信号または画像の空間領域表現を返します。その結果、表示またはさらに処理できる再構成された画像が得られます。
逆コサイン変換は、画像圧縮 (JPEG 圧縮など)、画像再構成、周波数領域操作後に信号や画像を元の形式に戻す必要がある信号処理タスクなど、さまざまなアプリケーションで重要です。
構文
B = idct2(A) B = idct2(A,m,n) B = idct2(A,[m n])
構文の説明
B =idct2(A) − 行列 A の 2 次元逆離散コサイン変換 (IDCT) を計算し、結果を行列 B に返します。この演算により、A の周波数領域表現から空間領域画像が効果的に再構築されます。
B =idct2(A, m,n) − 行列 A の 2 次元逆離散コサイン変換 (IDCT) を計算し、出力行列 B のサイズを m 行 n 列として指定します。この操作は、A の周波数領域表現から空間領域画像を効果的に再構築し、指定された m 行 n 列の次元にサイズ変更します。
B =idct2(A, [m,n]) − 行列 A の 2 次元逆離散コサイン変換 (IDCT) を計算し、出力行列 B のサイズを m 行 n 列に変更します。この操作は、A の周波数領域表現から空間領域画像を再構築し、指定された次元 [m n] にサイズ変更します。
2 次元逆離散コサイン変換の例をいくつか見てみましょう
例 1:idct2() 関数を使用して画像から高周波を除去する
私たちが持っているコードは-
です
img = imread('autumn.tif');
% Convert to grayscale if necessary
if size(img, 3) == 3
img = rgb2gray(img);
end
% Compute 2-D DCT
dct_img = dct2(double(img));
% Set a threshold to remove high frequencies (e.g., keep only the first 50 coefficients)
threshold = 50;
dct_img_thresh = dct_img;
dct_img_thresh(threshold+1:end, :) = 0;
dct_img_thresh(:, threshold+1:end) = 0;
% Compute the inverse 2-D DCT to get the filtered image
filtered_img = uint8(idct2(dct_img_thresh));
% Display the original and filtered images
figure;
subplot(1, 2, 1);
imshow(img);
title('Original Image');
subplot(1, 2, 2);
imshow(filtered_img);
title('Filtered Image');
例では -
- imread 関数は、ファイル (この場合は「autumn.tif」) から画像を読み取り、変数 img に保存するために使用されます。
- 画像がカラー画像の場合 (つまり、赤、緑、青の 3 つのチャネルがある)、rgb2gray 関数を使用してグレースケールに変換されます。これが行われるのは、2-D DCT が通常グレースケール画像に適用されるためです。
- dct2 関数は、画像の 2 次元 DCT を計算します。結果は変数 dct_img に格納されます。 DCT は画像を周波数領域で表し、高周波成分はピクセル値の急速な変化に対応します。
- どの DCT 係数を保持し、どの DCT 係数を破棄するかを決定するために、しきい値が選択されます。この例では、最初の 50 個の係数のみを保持することを選択します (256x256 の画像では、これらの係数は最低周波数を表します)。高周波係数(しきい値を超える係数)はゼロに設定されます。
- idct2 関数は、修正された DCT 係数 (dct_img_thresh) の逆 2 次元 DCT を計算します。この操作により、周波数領域表現から空間領域画像が効果的に再構築されます。結果は filtered_img に保存されます。
- 最後に、関数 imshow を使用して、元のイメージとフィルター処理されたイメージを並べて表示します。元の画像が左側に表示され、フィルタリングされた画像(高周波が除去された)が右側に表示されます。
実行時に得られる出力は -
例 2:B =idct2(A, m,n) を使用した画像のサイズ変更
私たちが持っているコードは-
です
% Read the image
img = imread('autumn.tif');
% Convert the image to grayscale
if size(img, 3) == 3
img = rgb2gray(img);
end
% Compute the 2-D DCT of the image
dct_img = dct2(double(img));
% Resize the DCT coefficients matrix (frequency domain representation) to a smaller size
% Let's resize it to half the original size
new_size = size(img) / 2;
dct_resized = imresize(dct_img, new_size);
% Compute the inverse 2-D DCT to get the resized image
resized_img = uint8(idct2(dct_resized, size(img, 1), size(img, 2)));
% Display the original and resized images
subplot(1, 2, 1);
imshow(img);
title('Original Image');
subplot(1, 2, 2);
imshow(resized_img);
title('Resized Image using 2-D IDCT');
この例では、-
- imread 関数は、ファイル (この場合は「autumn.tif」) から画像を読み取り、変数 img に保存するために使用されます。
- 画像がカラー画像の場合 (つまり、赤、緑、青の 3 つのチャネルがある)、rgb2gray 関数を使用してグレースケールに変換されます。 2-D DCT は通常、グレースケール画像に適用されるため、このステップは重要です。
- dct2 関数は、画像の 2 次元 DCT を計算します。結果は変数 dct_img に格納されます。 DCT は周波数領域で画像を表し、画像の異なる周波数が異なる係数で表されます。
- 画像のサイズを変更するには、DCT 係数行列 (dct_img) をより小さいサイズに変更します。これは、関数 imresize を使用して行われ、新しいサイズを元のサイズの半分 (new_size =size(img) / 2) として指定します。これにより、画像の周波数領域表現が効果的に削減されます。
- idct2 関数は、サイズ変更された DCT 係数 (dct_resize) の逆 2 次元 DCT を計算します。この操作により、サイズ変更された周波数領域表現から、サイズ変更された空間領域画像が効果的に再構築されます。
- 最後に、関数 imshow を使用して、元の画像とサイズ変更された画像を並べて表示します。元の画像が左側に表示され、サイズ変更された画像 (2-D IDCT を使用して取得) が右側に表示されます。
実行時の出力は -
例 3:2 次元逆離散コサイン変換 (IDCT) を使用した行列のサイズ変更
私たちが持っているコードは次のとおりです-
% Create a sample matrix A
A = [
10, 20, 30, 40;
50, 60, 70, 80;
90, 100, 110, 120;
130, 140, 150, 160
];
% Display the original matrix A
disp('Original Matrix A:');
disp(A);
% Compute the 2-D IDCT of A and resize it to a 3x2 matrix
B = idct2(A, [3, 2]);
% Display the resized matrix B
disp('Resized Matrix B (3x2):');
disp(B);
この例では、4x4 サンプル行列 A を作成します。次に、2 次元 IDCT を A に適用し、結果のサイズを 3x2 行列 [m, n] =[3, 2] に変更します。サイズ変更された行列 B が変換後に表示されます。
得られる出力は次のとおりです-
Original Matrix A: 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 Resized Matrix B (3x2): 122.0957 -11.9692 -97.4491 1.6910 12.0957 -1.9692
MATLAB