Геометрическое преобразование многоугольника в изображение с более высоким разрешением - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь изменить размер и изменить положение области интереса (области интереса) от изображения с низким разрешением (256x256) до изображения с более высоким разрешением (512x512). Следует также упомянуть, что два изображения охватывают разные поля зрения - изображения низкого и высокого разрешения имеют поля зрения 330 мм x 330 мм и 180 мм x 180 мм соответственно.

В моем распоряжении есть:

  • Физическая контрольная точка (в мм) на изображениях 256x256 и 512x512, которые являются refpoint_lowres = (- 164,424, -194,462) и refpoint_highres = (- 94,3052, -110,923). Опорные точки расположены в верхнем левом пикселе (1,1) на их соответствующих изображениях.
  • Пиксельные координаты области интереса в изображении 256x256 (с именами pxX и pxY). Эти координаты расположены относительно контрольной точки изображения с более низким разрешением, refpoint_lowres = (- 164,424, -194,462).
  • Интервал между пикселями для изображений 256x256 и 512x512, которые составляют 0,7757 пикселей / мм и 2,8444 пикселей / мм соответственно.

Как я могу изменить масштаб и изменить положение 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.));

1 Ответ

0 голосов
/ 18 мая 2018

Итак, у вас есть координаты 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;

Поскольку исходные координаты вписываются в изображение с низким разрешением, но изображение с высоким разрешением меньше (в физических координатах), чем изображение с низким разрешением, возможно, что эти новые координаты не помещаются в высоком разрешении образ. Если это так, то обрезка многоугольника является нетривиальным упражнением, это не может быть сделано простым перемещением вершин в поле зрения. MATLAB R2017b представляет тип объекта polyshape, который вы можете 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, возможно, самое простое решение - увеличить поле зрения, чтобы нарисовать многоугольник, а затем обрезать полученное изображение до нужного размера. Но для этого нужны правильные вычисления.

...