如何旋转图像文件并在matplotlib中绘制?
我知道我可以使用PIL打开并旋转它,但这对于这个简单的函数来说似乎太过分了,我可能找不到。
我在这里发现了这段代码,但似乎不起作用:
money = new Money("name", 100, 0.54, 54);
Gson gson = new Gson();
String json = gson.toJson(money);
答案 0 :(得分:11)
您可以使用rotate
中的scipy.ndimage
:
import scipy.misc
from scipy import ndimage
import matplotlib.pyplot as plt
img = scipy.misc.lena()
# img = scipy.misc.face() # lena is not included in scipy 0.19.1
plt.figure(figsize=(12, 2))
for degree in range(5):
plt.subplot(151+degree)
rotated_img = ndimage.rotate(img, degree*60)
plt.imshow(rotated_img, cmap=plt.cm.gray)
plt.axis('off')
plt.show()
这会围绕中心旋转图像(请参阅docs)。
修改强>
我想要某种动画(我不知道你将如何使用旋转图像,所以我只能推测),也许你最好使用某种游戏/图形库,例如Pygame。在这里,您可以使用pygame.transform.rotate
旋转具有一定性能的图像(感谢基础SDL),并将旋转后的图像blit到屏幕上。
尝试使用(使用图片lena.jpg)获得平滑旋转的图像:
import pygame
pygame.init()
screen = pygame.display.set_mode([400, 400])
pygame.display.set_caption('Rotating image example')
clock = pygame.time.Clock()
img = pygame.image.load('lena.jpg').convert()
img_rect = img.get_rect(center = screen.get_rect().center)
degree = 0
while degree < 360:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# rotate image
rot_img = pygame.transform.rotate(img, degree)
img_rect = rot_img.get_rect(center = img_rect.center)
# copy image to screen
screen.fill((0, 0, 0))
screen.blit(rot_img, img_rect)
pygame.display.flip()
clock.tick(60)
degree += 1
pygame.quit()
答案 1 :(得分:2)
您可以使用以下代码,我在此处找到:
How can I rotate a matplotlib plot through 90 degrees?
from matplotlib import pyplot, image
import scipy
img = scipy.misc.lena()
tr = scipy.ndimage.rotate(img,45)
imshow(tr)
答案 2 :(得分:2)
似乎matplotlib已经问过这个问题,现在它可以原生支持图像的仿射变换,而无需用户回退到低级图像处理程序。
现在以https://matplotlib.org/gallery/images_contours_and_fields/affine_image.html中的示例形式记录了这一点。
基本上,这需要指定适当的transform关键字参数。原始问题中提供的代码将更新如下:
import matplotlib.pyplot as plt
from matplotlib import transforms
img = plt.imread('filename.png')
fig = plt.figure()
ax = fig.add_subplot(111)
tr = transforms.Affine2D().rotate_deg(rotation_in_degrees)
ax.imshow(img, transform=tr + ax.transData)
plt.show()
答案 3 :(得分:1)
我发现以下解决方案非常直观。它使用 Pillow 库读取图像,然后,我们可以使用内置的旋转功能来旋转图像。图像以逆时针方式旋转并存储在新变量中。最后,我们可以使用 matplotlib 创建并显示绘图。
// const express= require('express')
// const router = express.Router()
const router = require('express').Router();
const {House} = require('../../Models/House');
//HOUSE Fetch
router.get('/api/house-sale', async(req, res)=>{
try{
House.find({'house_details.isSaleOrRent': 'SALE'}).exec().then((data)=>{
console.log(data);
return res.status(200).json(data)
})
} catch(error) {
return res.status(500).json({msg: 'server is currently Down :('})
}
})
router.get('/api/house-rent', async(req, res)=>{
try{
House.find({'house_details.isSaleOrRent': 'RENT'}).exec().then((data)=>{
return res.status(200).json(data)
})
} catch(error) {
return res.status(500).json({msg: 'server is currently Down :('})
}
})
router.get('/api/house-details/:id', async(req, res)=>{
await House.findOne({_id:req.params.id}).exec().then(data=>{
return res.status(200).json(data)
}).catch(error =>{
return res.status(400).json(error)
})
})
module.exports = router;
答案 4 :(得分:0)
另一个选择可能是使用numpy的rot90函数。想法是将图像转换为numpy数组,然后将数组旋转所需次数。这是一个示例:
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import numpy as np
with cbook.get_sample_data('ada.png') as image_file:
image = plt.imread(image_file)
image_arr = np.array(image)
#plt.show() To view the image
for _ in range(3):#3 to turn the image 90 degrees three times = 270 degrees
image_arr = np.rot90(image_arr)
plt.imshow(image_arr, aspect="auto", extent=(-14,-4,-2,40), zorder = 2, interpolation="nearest")
plt.show()
但是,这仅限于将图像旋转直角(90的倍数)。