Does adding images in pyplot lowers their resolution?

坚强是说给别人听的谎言 提交于 2020-06-29 03:58:48

问题


The following code

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

import sys

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

from matplotlib.offsetbox import OffsetImage, AnnotationBbox

import matplotlib.pyplot as plt
import numpy as np

class View(QGraphicsView):

    def __init__(self):
        super(View, self).__init__()

        self.initScene(5)

    def initScene(self,h):     

        self.scene = QGraphicsScene()
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.figure.subplots_adjust(left=0.03,right=1,bottom=.1,top=1,wspace=0, hspace=0)

        ax = self.figure.add_subplot(111)
        ax.set_xlim([0,1000])
        data = np.random.rand(1000)
        ax.plot(data, '-') 

        arr_img = plt.imread('sampleimage.jpg',format='jpg')
        im = OffsetImage(arr_img,zoom=.9)

        ab = AnnotationBbox(im, (.5, .5), xycoords='axes fraction')
        ax.add_artist(ab)

        self.canvas.draw()
        self.setScene(self.scene)
        self.scene.addWidget(self.canvas)

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow,self).__init__()

        #self.setGeometry(150, 150, 700, 550) 

        self.view = View()
        self.setCentralWidget(self.view)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

produces the output seen below on the left. On the right, is the original image ('sampleimage.jpg') which I imported in the code.

The difference in resolution is apparent. Is there a way to add images to plots, whilst retaining their quality?


回答1:


In the code from the question the OffsetImage is given an argument zoom=0.9. This means that each pixel of the original image takes 0.9/0.72=1.25 pixels on screen. Hence 5 pixels of the original image needs to squeezed into 4 pixels on screen. This inevitably leads to some artifacts as observed in the output of the code.

If the requirement is to show the image in the exact resolution of the original image, you need to make sure to use exactly one pixel per pixel for the OffsetImage. This would be accomplished by setting the zoom to the ppi of 72. divided by the figure dpi (100 by default).

OffsetImage(arr_img, zoom=72./self.figure.dpi)

As a result, the image shown would indeed have the same dimensions in the matplotlib plot as the original image.



来源:https://stackoverflow.com/questions/48639369/does-adding-images-in-pyplot-lowers-their-resolution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!