用网格插值重新采样图像
这个例子展示了如何使用griddedInterpolant
重新采样图像中的像素。重新采样图像对于调整分辨率和大小很有用,还可以在缩放后使用它来平滑像素。
加载图片
加载并显示图像ngc6543a.jpg
,这是哈勃太空望远镜拍摄的行星状星云NGC 6543。这张图片展示了一些有趣的结构,比如同心的气体壳,高速气体的喷射,以及不寻常的气体结。矩阵一个
表示图像的是一个650 × 600 × 3的矩阵uint8
整数。
A = imread(“ngc6543a.jpg”);imshow (A)
创建Interpolant
为图像创建网格插值对象。griddedInterpolant
只适用于双精度和单精度矩阵,因此转换uint8
矩阵双
.为了插值图像的每个RGB通道,指定两个网格向量来描述前两个维度中的样本点。网格向量作为单元格数组中的列向量分组在一起{xg1, xg2,…,xgN}
.用这个公式,griddedInterpolant
将3-D矩阵视为包含定义在同一网格上的多个2-D数据集。
sz = size(A);Xg = 1:sz(1);Yg = 1:sz(2);F = gridinterpolant ({xg,yg},double(A));
重新采样图像像素
使用前两个矩阵维度的大小重新采样图像,使其大小为120%。也就是说,原始图像中每5个像素,插值后的图像就有6个像素。用语法计算查询点上的插值F ({xq, yq})
.griddedInterpolant
在查询点处评估3d图像中的每个页面。
Xq = (0:5/6:sz(1))';Yq = (0:5/6:sz(2))';vq = uint8(F({xq,yq}));imshow (vq)标题(高分辨率的)
类似地,通过查询比原始图像少55%点的插值器来减小图像的大小。虽然您可以简单地索引到原始图像矩阵以生成较低分辨率的图像,但插值使您能够在非整数像素位置重新采样图像。
Xq = (0:1.55:sz(1))';Yq = (0:1.55:sz(2))';vq = uint8(F({xq,yq}));图imshow(vq)标题(低分辨率的)
平滑缩放工件
当您放大图像时,感兴趣区域的像素变大,图像中的细节很快就会丢失。您可以使用图像重新采样来平滑这些缩放工件。
放大原始图像中心的亮点。(索引到一个
就是在图像中居中这个亮点,这样后续的缩放就不会把它推到帧外。)
imshow ((1:570 10:600,:)“InitialMagnification”,“健康”缩放(10)标题(原图,10倍放大)
查询插值F
以10倍高的分辨率再现此放大图像(大约)。比较几种不同插值方法的结果。
Xq = (1:0.1:sz(1))';Yq = (1:0.1:sz(2))';F.Method =“线性”;vq = uint8(F({xq,yq}));imshow (vq (1:5700 150:5900,:),“InitialMagnification”,“健康”缩放(10)标题(的线性方法)
F.Method =“立方”;vq = uint8(F({xq,yq}));imshow (vq (1:5700 150:5900,:),“InitialMagnification”,“健康”缩放(10)标题(“立方方法”)
F.Method =样条的;vq = uint8(F({xq,yq}));imshow (vq (1:5700 150:5900,:),“InitialMagnification”,“健康”缩放(10)标题(“样条方法”)