Main Content

グリッド内挿でのイメージのリサンプリング

この例では、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')

参考

|

関連するトピック