Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 图像变换后裁剪边界的MATLAB实现_Image_Matlab_Image Registration - Fatal编程技术网

Image 图像变换后裁剪边界的MATLAB实现

Image 图像变换后裁剪边界的MATLAB实现,image,matlab,image-registration,Image,Matlab,Image Registration,如何在变换(旋转、平移、缩放和剪切)图像后自动裁剪黑色边框 我使用基于强度的自动图像配准(imregtform、optimizer、imregister…)来旋转一幅图像以适应另一幅图像。 现在在旋转之后,我需要裁剪两个图像,使其大小相同,并且仍然保持对齐 旋转图像的最简单表示形式是 一组 我假设图像的边缘可能有零值像素,这可能会使操作复杂化,尽管我假设由于噪声,整个图像将是非零的 也许我可以使用变换矩阵来计算需要裁剪的边界。在上述示例中,矩阵为: 0,999428374496743

如何在变换(旋转、平移、缩放和剪切)图像后自动裁剪黑色边框

我使用基于强度的自动图像配准(imregtform、optimizer、imregister…)来旋转一幅图像以适应另一幅图像。 现在在旋转之后,我需要裁剪两个图像,使其大小相同,并且仍然保持对齐

旋转图像的最简单表示形式是

一组

我假设图像的边缘可能有零值像素,这可能会使操作复杂化,尽管我假设由于噪声,整个图像将是非零的

也许我可以使用变换矩阵来计算需要裁剪的边界。在上述示例中,矩阵为:

 0,999428374496743      0,00888472048904662   0
-0,00888472048904659    0,999428374496743     0
 3,79626401832983      -0,493066986575474     1

矩阵列在工作空间中的“1x1仿射2d”对象中。我无法从那里找到使用它的语法

我已经找到了一种方法,尽管它不是很优雅,因此我仍然对一种解决这个问题的好方法感兴趣

可以将变换矩阵应用于图像的四个角点,并使用这些新点作为裁剪限制。应确保裁剪角位于原始图像内或需要固定到边缘

% width and length of the input image
width = size(img_fixed,1);
height = size(img_fixed,2);

% transform the four corners of the image to find crop area
[x1,y1] = transformPointsForward(T,0,0);
[x2,y2] = transformPointsForward(T,width,0);
[x3,y3] = transformPointsForward(T,width,height);
[x4,y4] = transformPointsForward(T,0,height);

% find inner most borders for a rectangular crop
if max([x1,x4]) < 0
    x_left = 0;      
else
    x_left = ceil(max([x1,x4]));
end

if min([x2,x3]) > width
    x_right = width;     
else
    x_right = floor(min([x2,x3]));
end

if max([y1,y2]) < 0
    y_top = 0;   
else
    y_top = ceil(max([y1,y2])); 
end

if min([y3,y4]) > height
    y_bottom = height;      
else
    y_bottom = floor(min([y3,y4]));
end

img_fixed_crop = imcrop(img_fixed,[x_left y_top x_right-x_left y_bottom-y_top]);
img_moving_crop = imcrop(img_moving,[x_left y_top x_right-x_left y_bottom-y_top]);
%输入图像的宽度和长度
宽度=尺寸(img_固定,1);
高度=尺寸(img_固定,2);
%变换图像的四个角以查找裁剪区域
[x1,y1]=向前的变换点(T,0,0);
[x2,y2]=向前的变换点(T,宽度,0);
[x3,y3]=向前的变换点(T,宽度,高度);
[x4,y4]=向前的变换点(T,0,高度);
%查找矩形裁剪的最内侧边界
如果最大值([x1,x4])<0
x_左=0;
其他的
左x_=天花板(最大值([x1,x4]);
结束
如果最小值([x2,x3])>宽度
x_right=宽度;
其他的
x_right=楼层(最小值([x2,x3]);
结束
如果最大值([y1,y2])<0
y_top=0;
其他的
y_top=ceil(最大值([y1,y2]);
结束
如果最小值([y3,y4])>高度
y_底部=高度;
其他的
y_底部=地板(最小值([y3,y4]);
结束
img_fixed_crop=img_fixed[x_left y_top x_right-x_left y_bottom-y_top]);
img_moving_crop=img_moving[x_left y_top x_right-x_left y_bottom-y_top]);

您不是在“旋转”,而是在使用所示的变换,rigth?是正确的。旋转是其中的一部分,也可能包括平移、缩放和剪切。