Давайте сначала проанализируем вашу программу. В вашей программе ваш первый метод main()
, и помните, что это статический метод ... Затем вы объявляете локальную переменную для этого метода (compareCount, low, high , и т.д..). Область действия этой переменной - это только объявленный метод, независимо от того, что это статический или нестационарный метод. Таким образом, вы не можете использовать эти переменные вне этого метода. Это основная ошибка u.
Затем мы переходим к следующей точке. Вы сказали, что статичность убивает вас. (Это может убить вас, но это дает жизнь вашей программе!) Сначала вы должны понять основную вещь. * Статический метод вызывает только статический метод и использует только статическую переменную. * Статическая переменная или статический метод не зависят от какого-либо экземпляра этого класса. (т. е. если вы измените какое-либо состояние статической переменной, оно будет отражено во всех объектах класса). Из-за этого вы называете это переменной класса или методом класса. И многое другое о «статическом» ключевом слове. Надеюсь, теперь у вас есть идея. Сначала измените область действия переменной и объявите ее как статическую (чтобы использовать ее в статических методах).
И совет для вас: вы неправильно поняли идею сферы переменных и статические функции. Получите ясное представление об этом.
Вы можете использовать PyPNG . Это чистый Python (без зависимостей) с открытым исходным кодом PNG-кодировщик / декодер, и он поддерживает запись массивов NumPy в виде изображений.
matplotlib svn имеет новую функцию для сохранения изображений только как изображение - без осей и т. д., это очень простая функция для резервного копирования, если вы не хотите устанавливать svn (скопировано прямо из image.py в matplotlib svn , для краткости удалили docstring):
def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None):
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig = Figure(figsize=arr.shape[::-1], dpi=1, frameon=False)
canvas = FigureCanvas(fig)
fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)
fig.savefig(fname, dpi=1, format=format)
Добавление к ответу @ ideaman42:
def saveAsPNG(array, filename):
import struct
if any([len(row) != len(array[0]) for row in array]):
raise ValueError, "Array should have elements of equal size"
#First row becomes top row of image.
flat = []; map(flat.extend, reversed(array))
#Big-endian, unsigned 32-byte integer.
buf = b''.join([struct.pack('>I', ((0xffFFff & i32)<<8)|(i32>>24) )
for i32 in flat]) #Rotate from ARGB to RGBA.
data = write_png(buf, len(array[0]), len(array))
f = open(filename, 'wb')
f.write(data)
f.close()
Итак, вы можете сделать:
saveAsPNG([[0xffFF0000, 0xffFFFF00],
[0xff00aa77, 0xff333333]], 'test_grid.png')
Произведение test_grid.png
:
[/g0]
(Прозрачность также работает, уменьшая старший байт с 0xff
.)
Предполагая, что вы хотите изображение в оттенках серого:
im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
Pure Python (2 & amp; 3), фрагмент без зависимостей сторонних разработчиков.
Эта функция записывает сжатые, true-color (4 байта на пиксель) RGBA
PNG.
def write_png(buf, width, height):
""" buf: must be bytes or a bytearray in Python3.x,
a regular string in Python2.x.
"""
import zlib, struct
# reverse the vertical line order and add null bytes at the start
width_byte_4 = width * 4
raw_data = b''.join(
b'\x00' + buf[span:span + width_byte_4]
for span in range((height - 1) * width_byte_4, -1, - width_byte_4)
)
def png_pack(png_tag, data):
chunk_head = png_tag + data
return (struct.pack("!I", len(data)) +
chunk_head +
struct.pack("!I", 0xFFFFFFFF & zlib.crc32(chunk_head)))
return b''.join([
b'\x89PNG\r\n\x1a\n',
png_pack(b'IHDR', struct.pack("!2I5B", width, height, 8, 6, 0, 0, 0)),
png_pack(b'IDAT', zlib.compress(raw_data, 9)),
png_pack(b'IEND', b'')])
... Данные должны быть записаны непосредственно в файл, открытый как двоичный, например:
data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fd:
fd.write(data)
buf
)? Кажется, это не массивный массив ...
– christianbrodbeck
2 April 2014 в 21:28
Если у вас есть matplotlib, вы можете сделать:
import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)
Вы можете использовать библиотеку skimage в Python
Пример:
from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
Это использует PIL, но, возможно, некоторым может показаться полезным:
import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
EDIT: Текущая версия scipy
начала нормализовать все изображения, чтобы мин (данные) становились черными и максимальными (данные ) станет белым. Это нежелательно, если данные должны быть точными уровнями серого или точными каналами RGB. Решение:
import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
Если вы работаете в среде python Spyder, то это не может быть проще, чем просто щелкнуть правой кнопкой мыши массив в проводнике переменных, а затем выбрать параметр «Показать изображение».
Это попросит вас сохранить изображение в dsik, в основном в формате PNG.
Библиотека PIL в этом случае не понадобится.
В мире, вероятно, не нужен еще один пакет для записи массива numpy в файл PNG, но для тех, кто не может получить достаточное количество, я недавно установил numpngw
в github:
https://github.com/WarrenWeckesser/numpngw
и на pypi: https://pypi.python.org/pypi/numpngw/
Единственная внешняя зависимость - numpy.
Вот первый пример из каталога examples
репозитория. Существенной линией является просто
write_png('example1.png', img)
, где img
является массивом numpy. Весь код перед этой строкой - это операторы импорта и код для создания img
.
import numpy as np
from numpngw import write_png
# Example 1
#
# Create an 8-bit RGB image.
img = np.zeros((80, 128, 3), dtype=np.uint8)
grad = np.linspace(0, 255, img.shape[1])
img[:16, :, :] = 127
img[16:32, :, 0] = grad
img[32:48, :, 1] = grad[::-1]
img[48:64, :, 2] = grad
img[64:, :, :] = 127
write_png('example1.png', img)
Вот файл PNG, который он создает:
Есть opencv
для python ( http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html ).
import cv2
import numpy as np
cv2.imwrite("filename.png", np.zeros((10,10)))
полезно, если вам нужно сделать больше обработки, кроме сохранения.
cmap="gray"
, когда я сохраняю изображение с помощью cv2?
– Mona Jalal
13 June 2017 в 02:55