グリッド内挿でのイメージのリサンプリング
この例では、griddedInterpolant
を使用してイメージ内のピクセルをリサンプリングする方法を説明します。イメージのリサンプリングは、解像度とサイズの調整に便利で、ズーム後にピクセルを滑らかにするために使用できます。
イメージの読み込み
イメージ ngc6543a.jpg
を読み込んで表示します。これは、惑星状星雲 NGC 6543 のハッブル宇宙望遠鏡のイメージです。このイメージには、同心性のガスの外郭、高速ガスの噴流、異常なガスの集まりなど、興味深い構造がいくつか表示されています。イメージを表す行列 A
は、650×600×3 の uint8
整数の行列です。
A = imread('ngc6543a.jpg');
imshow(A)
内挿の作成
イメージのグリッド内挿オブジェクトを作成します。griddedInterpolant
は倍精度および単精度の行列に対してのみ有効なため、uint8
行列を double
に変換します。イメージの RGB チャネルをそれぞれ内挿するには、最初の 2 つの次元でサンプル点を表す 2 つのグリッド ベクトルを指定します。グリッド ベクトルは、cell 配列 {xg1,xg2,...,xgN}
で列ベクトルとしてグループ化されます。この定式化により、griddedInterpolant
は 3 次元行列を、同じグリッド上の複数の 2 次元データ セットを含むものとして扱います。
sz = size(A); xg = 1:sz(1); yg = 1:sz(2); F = griddedInterpolant({xg,yg},double(A));
イメージ ピクセルのリサンプリング
最初の 2 つの行列の次元のサイズを使用して、120% のサイズになるようにイメージをリサンプリングします。つまり、元のイメージの 5 ピクセルごとに、内挿イメージは 6 ピクセルとなります。構文 F({xq,yq})
を使用して、内挿をクエリ点で評価します。griddedInterpolant
は、3 次元イメージの各ページをクエリ点で評価します。
xq = (0:5/6:sz(1))';
yq = (0:5/6:sz(2))';
vq = uint8(F({xq,yq}));
imshow(vq)
title('Higher Resolution')
同様に、元のイメージより 55% 少ない数の点を使用して内挿をクエリすることにより、イメージのサイズを縮小します。元のイメージ行列にインデックスを付けるだけでも解像度の低いイメージを生成できますが、内挿を使用すると、整数以外のピクセル位置でイメージをリサンプリングできます。
xq = (0:1.55:sz(1))';
yq = (0:1.55:sz(2))';
vq = uint8(F({xq,yq}));
figure
imshow(vq)
title('Lower Resolution')
ズーム アーティファクトの平滑化
イメージをズームインすると、関心領域のピクセルが大きくなり、イメージの詳細はすぐに失われます。イメージのリサンプリングを使用すると、このようなズーム アーティファクトを滑らかにすることができます。
元のイメージの中央にある明るいスポットをズームインします (A
にインデックスを付けると、この明るいスポットがイメージの中心となり、その後ズーム操作してもフレームの外に押し出されることはありません)。
imshow(A(1:570,10:600,:),'InitialMagnification','fit') zoom(10) title('Original Image, 10x Zoom')
内挿 F
をクエリして、(およそ) 10 倍高い解像度でズームされたイメージを再生成します。複数の異なる内挿法の結果を比較します。
xq = (1:0.1:sz(1))'; yq = (1:0.1:sz(2))'; F.Method = 'linear'; vq = uint8(F({xq,yq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Linear method')
F.Method = 'cubic'; vq = uint8(F({xq,yq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Cubic method')
F.Method = 'spline'; vq = uint8(F({xq,yq})); imshow(vq(1:5700,150:5900,:),'InitialMagnification','fit') zoom(10) title('Spline method')