多边形到更高分辨率图像的几何变换
Geometrical transformation of a polygon to a higher resolution image
我正在尝试将 ROI(感兴趣区域)从低分辨率图像 (256x256) 正确调整大小并重新定位到高分辨率图像 (512x512)。还应该提到的是,这两个图像涵盖不同的视野——低分辨率图像和高分辨率图像分别具有 330mm x 330mm 和 180mm x 180mm FoV。
我可以使用的是:
- 256x256和512x512图像中的物理参考点(单位mm),分别为refpoint_lowres=(-164.424,-194.462)和refpoint_highres=(-94.3052,-110.923)。参考点位于各自图像的左上角像素 (1,1) 中。
- 256x256 图像中 ROI 的像素坐标(命名为 pxX 和 pxY)。这些坐标相对于较低分辨率图像的参考点定位,refpoint_lowres=(-164.424,-194.462)。
- 256x256 和 512x512 图像的像素间距,分别为 0.7757 pixel/mm 和 2.8444 pixel/mm。
如何重新缩放和重新定位 ROI(二进制掩码)以更正 512x512 图像中的像素位置?非常感谢!!
尝试
% This gives correctly placed and scaled binary array in the 256x256 image
mask_lowres = double(poly2mask(pxX, pxY, 256., 256.));
% Compute translational shift in pixel
mmShift = refpoint_lowres - refpoint_highres;
pxShift = abs(mmShift./pixspacing_highres)
% This produces a binary array that is only positioned correctly in the
% 512x512 image, but it is not upscaled correctly...(?)
mask_highres = double(poly2mask(pxX + pxShift(1), pxY + pxShift(2), 512.,
512.));
所以您有相对于低分辨率图像的坐标 pxX
和 pxY
(以像素为单位)。您可以将这些坐标转换为真实世界的坐标:
pxX_rw = pxX / 0.7757 - 164.424;
pxY_rw = pxY / 0.7757 - 194.462;
接下来您可以将这些坐标转换为高分辨率坐标:
pxX_hr = (pxX_rw - 94.3052) * 2.8444;
pxY_hr = (pxY_rw - 110.923) * 2.8444;
由于原始坐标适合低分辨率图像,但高分辨率图像(在物理坐标中)小于低分辨率图像,这些新坐标可能不适合高分辨率图像-res 图像。如果是这种情况,裁剪多边形是一项非常重要的工作,不能通过简单地将顶点移动到视野内来完成。 MATLAB R2017b 引入了 polyshape
object type, which you can intersect
:
bbox = polyshape([0 0 180 180] - 94.3052, [180 0 0 180] - 110.923);
poly = polyshape(pxX_rw, pxY_rw);
poly = intersect([poly bbox]);
pxX_rw = poly.Vertices(:,1);
pxY_rw = poly.Vertices(:,2);
如果您使用的是早期版本的 MATLAB,也许最简单的解决方案是扩大视野以绘制多边形,然后将生成的图像裁剪为合适的大小。但这确实需要一些适当的计算才能正确。
我正在尝试将 ROI(感兴趣区域)从低分辨率图像 (256x256) 正确调整大小并重新定位到高分辨率图像 (512x512)。还应该提到的是,这两个图像涵盖不同的视野——低分辨率图像和高分辨率图像分别具有 330mm x 330mm 和 180mm x 180mm FoV。
我可以使用的是:
- 256x256和512x512图像中的物理参考点(单位mm),分别为refpoint_lowres=(-164.424,-194.462)和refpoint_highres=(-94.3052,-110.923)。参考点位于各自图像的左上角像素 (1,1) 中。
- 256x256 图像中 ROI 的像素坐标(命名为 pxX 和 pxY)。这些坐标相对于较低分辨率图像的参考点定位,refpoint_lowres=(-164.424,-194.462)。
- 256x256 和 512x512 图像的像素间距,分别为 0.7757 pixel/mm 和 2.8444 pixel/mm。
如何重新缩放和重新定位 ROI(二进制掩码)以更正 512x512 图像中的像素位置?非常感谢!!
尝试
% This gives correctly placed and scaled binary array in the 256x256 image
mask_lowres = double(poly2mask(pxX, pxY, 256., 256.));
% Compute translational shift in pixel
mmShift = refpoint_lowres - refpoint_highres;
pxShift = abs(mmShift./pixspacing_highres)
% This produces a binary array that is only positioned correctly in the
% 512x512 image, but it is not upscaled correctly...(?)
mask_highres = double(poly2mask(pxX + pxShift(1), pxY + pxShift(2), 512.,
512.));
所以您有相对于低分辨率图像的坐标 pxX
和 pxY
(以像素为单位)。您可以将这些坐标转换为真实世界的坐标:
pxX_rw = pxX / 0.7757 - 164.424;
pxY_rw = pxY / 0.7757 - 194.462;
接下来您可以将这些坐标转换为高分辨率坐标:
pxX_hr = (pxX_rw - 94.3052) * 2.8444;
pxY_hr = (pxY_rw - 110.923) * 2.8444;
由于原始坐标适合低分辨率图像,但高分辨率图像(在物理坐标中)小于低分辨率图像,这些新坐标可能不适合高分辨率图像-res 图像。如果是这种情况,裁剪多边形是一项非常重要的工作,不能通过简单地将顶点移动到视野内来完成。 MATLAB R2017b 引入了 polyshape
object type, which you can intersect
:
bbox = polyshape([0 0 180 180] - 94.3052, [180 0 0 180] - 110.923);
poly = polyshape(pxX_rw, pxY_rw);
poly = intersect([poly bbox]);
pxX_rw = poly.Vertices(:,1);
pxY_rw = poly.Vertices(:,2);
如果您使用的是早期版本的 MATLAB,也许最简单的解决方案是扩大视野以绘制多边形,然后将生成的图像裁剪为合适的大小。但这确实需要一些适当的计算才能正确。