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