我对scipy的ndimage.rotate方法的实现有疑问,特别是与旋转数组任意数量时scipy的实际工作方式有关,以及它是否保留数组中包含的数字?
我正在尝试寻找一种方法来旋转某些数组,同时还要保留数组中的数字而不丢失任何信息。
我试图通过初始化其中具有已知形状的一些数组来测试它,但是我注意到,如果初始化一些特定形状(例如十字形),那么当旋转一定量时,十字形将变成一个正方形,而且我担心我在这里失去信息。
matr_1= [[0, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 0]]
matr_2= [[0, 0, 1, 0, 0, 0],
[0, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 0]]
plt.imshow(matr_1)
plt.show()
print("Rotation by 45 degrees")
print(sp.ndimage.rotate(matr_1, 45, reshape=False))
plt.imshow(sp.ndimage.rotate(matr_1,45,reshape=False))
plt.show()
print("Rotation by 55 degrees")
print(sp.ndimage.rotate(matr_2, 90, reshape=False))
plt.imshow(sp.ndimage.rotate(matr_1,90,reshape=False))
我知道这可能是所有旋转算法固有的问题,但是我想了解实际上对数组执行了哪些操作。
答案 0 :(得分:1)
在有疑问时阅读正在使用的开源库的代码是一个很好的练习。 这是链接:
https://github.com/scipy/scipy/blob/v1.2.1/scipy/ndimage/interpolation.py#L634
您会注意到旋转是由旋转矩阵定义的,此处定义为:
m11 = math.cos(angle)
m12 = math.sin(angle)
m21 = -math.sin(angle)
m22 = math.cos(angle)
matrix = numpy.array([[m11, m12],
[m21, m22]], dtype=numpy.float64)
在离散图像中,角度不是90的倍数时,损失是不可克服的。
答案 1 :(得分:0)
可以旋转图像并使用最近邻居插值。这意味着该算法不会限制新栅格(网格)中每个位置的每个相邻像素的计算百分比,而是被约束为从现有栅格中选择最近的邻居。
这意味着不会在图像中引入新的像素值(基本上是颜色或灰色阴影)。也就是说,如果从黑色背景上的白色矩形开始,无论旋转多少度,都将永远不会获得单个新的灰色像素来平滑锯齿状边缘-所有输出像素将继续为黑色或白色
我不确定确切的数学运算,但是我不认为这将保留输入图像中黑白像素的确切数量,但是只要没有新的不同值,就将保留这些值。介绍。
我无法确定您的问题的措辞方式。