图像旋转 python实现(针对mxn长方形尺寸图像)

来源:互联网 发布:chart.js柱状图的宽度 编辑:程序博客网 时间:2024/06/08 10:19

实现对图像(mxn m n 不等)进行90 180  270 三个角度的旋转(不引进黑色无像素区域并且保持图像尺寸不变。)

原图:


对正方行尺寸的图像进行90 180 270 角度的旋转完全不出现问题(不出现黑色无像素区域),但是长方形尺寸图像就会出现黑块。如:


解决的方法:

先利用 img.transpose(1, 0)  

transpose()函数把图像的0 1 维转置,图像的尺寸就从mxn变成了nxm,这就避免了出现黑色无像素区域的问题。

然后观察结果发现,图像不仅旋转了并且左右也对称镜像了,

所以还需要一步操作:

img1.transpose(Image.FLIP_LEFT_RIGHT)  #再进行一次左右镜像,把左右对调回来,就得到旋转90°后的图像.



csdn上一篇比较好的博客用了自己转换坐标来实现图像旋转,逻辑感觉通篇是对的,但是旋转会出错,代码见下,有时间再更正好。

链接: http://www.cnblogs.com/xianglan/archive/2010/12/26/1917247.html

对方的代码:

#coding=utf-8import cv2import mathimport numpy as npdef LRotate(image, angle):    size = image.shape    h = size[0]    w = size[1]    print (size)    anglePi = angle * math.pi / 180.0    cosA = math.cos(anglePi)    sinA = math.sin(anglePi)    X1 = math.ceil(abs(0.5 * h * cosA + 0.5 * w * sinA))    X2 = math.ceil(abs(0.5 * h * cosA - 0.5 * w * sinA))    Y1 = math.ceil(abs(-0.5 * h * sinA + 0.5 * w * cosA))    Y2 = math.ceil(abs(-0.5 * h * sinA - 0.5 * w * cosA))    #H = int(2 * max(Y1, Y2))    #W = int(2 * max(X1, X2))    #size = (W + 1, H + 1)    if angle == 90:        iLRotate = np.zeros([w, h], np.uint8)    for i in range(h):        for j in range(w):            #x = int(cosA * i - sinA * j - 0.5 * w * cosA + 0.5 * h * sinA + 0.5 * W)            #y = int(sinA * i + cosA * j - 0.5 * w * sinA - 0.5 * h * cosA + 0.5 * H)            x = int(cosA * i - sinA * j - 0.5 * w * cosA + 0.5 * h * sinA + 0.5 * w)            y = int(sinA * i + cosA * j - 0.5 * w * sinA - 0.5 * h * cosA + 0.5 * h)            print (x, y)            #if x>-1 and x<h and y>-1 and y<w:            iLRotate[x, y] = image[i, j]    return iLRotateimage = cv2.imread('/...../1/x_0.png', -1)iLRotate90 = LRotate(image, 90)cv2.imwrite('....../x_90.png', iLRotate90)


原创粉丝点击