2
respostas

Como exibir imagem no pycharm com comando print

Estou testando um código que tem python 2, mas como eu quero ver funcionar com a versão 3.7 do python q estou usando, gostaria de saber como resolver esse erro que é apresentado e gostaria de saber se é possível exibir a imagem com o comando print e como resolver com ou sem o print. obs: a imagem foi gerada na mesma pasta sem erros; a dificuldade é mostrar essa imagem.

Segue o código: studentMain.py

from prep_terrain_data import makeTerrainData
from class_vis import prettyPicture, output_image
from ClassifyNB import classify

import numpy as np
import pylab as pl

features_train, labels_train, features_test, labels_test = makeTerrainData()

grade_fast = [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii] == 0]
bumpy_fast = [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii] == 0]
grade_slow = [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii] == 1]
bumpy_slow = [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii] == 1]

clf = classify(features_train, labels_train)

prettyPicture(clf, features_test, labels_test)
output_image("test.png", "png", open("test.png", "rb").read())

ClassifyNB.py

def classify(features_train, labels_train):
    from sklearn.naive_bayes import GaussianNB
    clf = GaussianNB()
    fit_ = clf.fit(features_train, labels_train)
    return fit_

prep_terrain_data.py

import random
def makeTerrainData(n_points=1000):
    random.seed(42)
    grade = [random.random() for ii in range(0,n_points)]
    bumpy = [random.random() for ii in range(0,n_points)]
    error = [random.random() for ii in range(0,n_points)]
    y = [round(grade[ii]*bumpy[ii]+0.3+0.1*error[ii]) for ii in range(0,n_points)]
    for ii in range(0, len(y)):
        if grade[ii]>0.8 or bumpy[ii]>0.8:
            y[ii] = 1.0

    X = [[gg, ss] for gg, ss in zip(grade, bumpy)]
    split = int(0.75*n_points)
    X_train = X[0:split]
    X_test  = X[split:]
    y_train = y[0:split]
    y_test  = y[split:]

    grade_sig = [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]==0]
    bumpy_sig = [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]==0]
    grade_bkg = [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]==1]
    bumpy_bkg = [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]==1]

    grade_sig = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==0]
    bumpy_sig = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==0]
    grade_bkg = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==1]
    bumpy_bkg = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==1]

    test_data = {"fast":{"grade":grade_sig, "bumpiness":bumpy_sig}
            , "slow":{"grade":grade_bkg, "bumpiness":bumpy_bkg}}

    return X_train, y_train, X_test, y_test
#    return training_data, test_data

class_vis.py

import warnings

warnings.filterwarnings("ignore")

import matplotlib

matplotlib.use('agg')

import matplotlib.pyplot as plt
import pylab as pl
import numpy as np

def prettyPicture(clf, X_test, y_test):
    x_min = 0.0;
    x_max = 1.0
    y_min = 0.0;
    y_max = 1.0

    h = .01  # step size in the mesh
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    Z = Z.reshape(xx.shape)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())

    plt.pcolormesh(xx, yy, Z, cmap=pl.cm.seismic)

    grade_sig = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii] == 0]
    bumpy_sig = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii] == 0]
    grade_bkg = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii] == 1]
    bumpy_bkg = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii] == 1]

    plt.scatter(grade_sig, bumpy_sig, color="b", label="fast")
    plt.scatter(grade_bkg, bumpy_bkg, color="r", label="slow")
    plt.legend()
    plt.xlabel("bumpiness")
    plt.ylabel("grade")

    plt.savefig("test.png")

import base64
import json
import subprocess

def output_image(name, format, bytes):
    image_start = "BEGIN_IMAGE_f9825uweof8jw9fj4r8"
    image_end = "END_IMAGE_0238jfw08fjsiufhw8frs"
    data = {}
    data['name'] = name
    data['format'] = format
    data['bytes'] = base64.encodestring(bytes)
    print(image_start+json.dumps(data)+image_end)
2 respostas

Segue o erro:

C:\Users\Rogerio\PycharmProjects\udacity-machine-learning\venv\Scripts\python.exe C:/Users/Rogerio/PycharmProjects/udacity-machine-learning/venv/aula2-NaiveBayes/studentMain.py
Traceback (most recent call last):
  File "C:/Users/Rogerio/PycharmProjects/udacity-machine-learning/venv/aula2-NaiveBayes/studentMain.py", line 33, in <module>
    output_image("test.png", "png", open("test.png", "rb").read())
  File "C:\Users\Rogerio\PycharmProjects\udacity-machine-learning\venv\aula2-NaiveBayes\class_vis.py", line 66, in output_image
    print(image_start+json.dumps(data)+image_end)
  File "C:\Users\Rogerio\Anaconda3\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Users\Rogerio\Anaconda3\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\Rogerio\Anaconda3\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\Rogerio\Anaconda3\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'bytes' is not JSON serializable

Olá Rogerio. Tudo bom?

Antes de conseguir responder à sua pergunta, preciso que você explique exatamente o que espera visualizar com o método output_image. Isso pois, admito, nunca vi o método print ser usado para exibir uma image. Geralmente, utilizamos ou o matplotlib ou o Pillow para lidar com isso. - Mas vamos supor que você esteja usando o print para exibir a imagem como uma string.

Se for uma string, o erro que está ocorrendo refere-se ao formato de entrada. Quando você passa o valor image_start+json.dumps(data)+image_end, o python encontra um erro pois você tem dois objetos do tipo byte (image_start e image_end) e um objeto do tipo json (json.dumps(data)). Para que a string possa ser exibida corretamente, é preciso corrigir a diferença de tipos.

Caso esteja tentando visualizar a imagem em um notebook, e.g. Jupyter, (caso que eu creio ser o seu), você pode usar os métodos pyplot e image, do matplotlib.

Usando seu método como base:


import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def output_image(name):

    img=mpimg.imread(name)
    imgplot = plt.imshow(img)
    plt.show()

Por fim, se você quiser exibir em uma janela, pode usar o método Image, presente no Pillow

from PIL import Image

def output_image(name):
    img = Image.open(name)
    img.show()

Enfim. Essas são algumas formas de visualizar a imagem que foi gerada. Falta só, como eu disse no começo, definir exatamente o que você espera ver.

Espero ter ajudado e fico no aguardo por sua resposta.