Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.
Вы можете использовать новый интерфейс OpenCV python (если я не ошибаюсь, он доступен с OpenCV 2.2). Он изначально использует массивы numpy:
import cv2
im = cv2.imread("abc.tiff")
print type(im)
результат:
<type 'numpy.ndarray'>
PIL (Python Imaging Library) и Numpy хорошо работают вместе.
Я использую следующие функции.
from PIL import Image
import numpy as np
def load_image( infilename ) :
img = Image.open( infilename )
img.load()
data = np.asarray( img, dtype="int32" )
return data
def save_image( npdata, outfilename ) :
img = Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"), "L" )
img.save( outfilename )
«Image.fromarray» немного уродлив, потому что я закрепите входящие данные на [0,255], преобразуйте в байты, затем создайте изображение в градациях серого. Я в основном работаю в сером цвете.
Изображение RGB будет выглядеть примерно так:
outimg = Image.fromarray( ycc_uint8, "RGB" )
outimg.save( "ycc.tif" )
При использовании ответа от David Poole я получаю SystemError с PNG с серой шкалой и, возможно, с другими файлами. Мое решение:
import numpy as np
from PIL import Image
img = Image.open( filename )
try:
data = np.asarray( img, dtype='uint8' )
except SystemError:
data = np.asarray( img.getdata(), dtype='uint8' )
Фактически img.getdata () будет работать для всех файлов, но он медленнее, поэтому я использую его только тогда, когда другой метод выходит из строя.
Я также принял изображение, но я нашел следующий механизм, полезный для предварительной и последующей обработки:
import imageio
import numpy as np
def imload(*a, **k):
i = imageio.imread(*a, **k)
i = i.transpose((1, 0, 2)) # x and y are mixed up for some reason...
i = np.flip(i, 1) # make coordinate system right-handed!!!!!!
return i/255
def imsave(i, url, *a, **k):
# Original order of arguments was counterintuitive. It should
# read verbally "Save the image to the URL" — not "Save to the
# URL the image."
i = np.flip(i, 1)
i = i.transpose((1, 0, 2))
i *= 255
i = i.round()
i = np.maximum(i, 0)
i = np.minimum(i, 255)
i = np.asarray(i, dtype=np.uint8)
imageio.imwrite(url, i, *a, **k)
Обоснование заключается в том, что я использую numpy для обработки изображений, а не только для отображения изображений. Для этой цели uint8s неудобны, поэтому я конвертирую значения с плавающей запятой в диапазоне от 0 до 1.
При сохранении изображений я заметил, что сам должен был вырезать значения вне диапазона, иначе я закончил с действительно серым выходом. (Серое выходное изображение было результатом сжатия изображения полного диапазона, находящегося вне [0, 256], до значений, которые находились внутри диапазона.)
Также была пара других странностей, которые Я упомянул в комментариях.
Вам нужно использовать cv.LoadImageM вместо cv.LoadImage:
In [1]: import cv
In [2]: import numpy as np
In [3]: x = cv.LoadImageM('im.tif')
In [4]: im = np.asarray(x)
In [5]: im.shape
Out[5]: (487, 650, 3)
Вы также можете использовать matplotlib для этого.
import matplotlib.image as mpimg
img = mpimg.imread('abc.tiff')
print(type(img))
output: <class 'numpy.ndarray'>
Поздний ответ, но я предпочел использовать модуль imageio
для других альтернатив
import imageio
im = imageio.imread('abc.tiff')
Как и в cv2.imread()
, он создает массив numpy по умолчанию, но в форме RGB .
def opencv_image_as_array(im):
"""Interface image from OpenCV's native format to a numpy array.
note: this is a slicing trick, and modifying the output array will also change
the OpenCV image data. if you want a copy, use .copy() method on the array!
"""
import numpy as np
w, h, n = im.width, im.height, im.channels
modes = {1:"L", 3:"RGB"}#, 4:"RGBA"}
if n not in modes:
raise StandardError('unsupported number of channels: {0}'.format(n))
out = np.asarray(im) if n == 1 else np.asarray(im)[:,:,::-1] ## BGR -> RGB
return out