用Python旋转图像

时间:2019-04-10 03:40:48

标签: python image python-2.7 image-processing

我对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))

我知道这可能是所有旋转算法固有的问题,但是我想了解实际上对数组执行了哪些操作。

2 个答案:

答案 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)

可以旋转图像并使用最近邻居插值。这意味着该算法不会限制新栅格(网格)中每个位置的每个相邻像素的计算百分比,而是被约束为从现有栅格中选择最近的邻居。

这意味着不会在图像中引入新的像素值(基本上是颜色或灰色阴影)。也就是说,如果从黑色背景上的白色矩形开始,无论旋转多少度,都将永远不会获得单个新的灰色像素来平滑锯齿状边缘-所有输出像素将继续为黑色或白色

我不确定确切的数学运算,但是我不认为这将保留输入图像中黑白像素的确切数量,但是只要没有新的不同值,就将保留这些值。介绍。

我无法确定您的问题的措辞方式。