답변:
최신 OpenCV 파이썬 인터페이스를 사용할 수 있습니다 (오해하지 않으면 OpenCV 2.2부터 사용할 수 있습니다). 기본적으로 numpy 배열을 사용합니다.
import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)
결과:
<type 'numpy.ndarray'>
$ pip install opencv-python
opencv를 설치하려면
TypeError: 'mode' is an invalid keyword argument for imread()
mode
논쟁 을 포기한 것 같습니다 . 업데이트 된 방법은 아래 내 대답을 참조하십시오.
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" )
TypeError: long() argument must be a string or a number, not 'PixelAccess'
PIL의 PixelAccess
클래스 에 대한 설명서를 보면 np.array
기본 데이터를 ndarray
형식 으로 변환 할 수있는 메서드를 제공하지 않는 것으로 보입니다 . 사용을 생략하고 img.load()
의 결과 만 처리하면됩니다 Image.open(...)
.
이를 위해 matplotlib 를 사용할 수도 있습니다 .
from matplotlib.image import imread
img = imread('abc.tiff')
print(type(img))
산출:
<class 'numpy.ndarray'>
cv.LoadImage 대신 cv.LoadImageM을 사용해야합니다.
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)
David Poole의 답변을 사용할 때 그레이 스케일 PNG 및 다른 파일과 함께 SystemError가 발생합니다. 내 솔루션은 다음과 같습니다.
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 ()는 모든 파일에서 작동하지만 속도가 느리므로 다른 방법이 실패 할 때만 사용합니다.
OpenCV 이미지 형식은 numpy 배열 인터페이스를 지원합니다. 회색조 또는 컬러 이미지를 지원하는 도우미 기능을 만들 수 있습니다. 이것은 BGR-> RGB 변환이 이미지 데이터의 전체 사본이 아닌 numpy 슬라이스로 편리하게 수행 될 수 있음을 의미합니다.
참고 : 이것은 진보적 인 트릭이므로 출력 배열을 수정하면 OpenCV 이미지 데이터도 변경됩니다. 복사본을 원하면 .copy()
배열에서 메서드를 사용 하십시오!
import numpy as np
def img_as_array(im):
"""OpenCV's native format to a numpy array view"""
w, h, n = im.width, im.height, im.channels
modes = {1: "L", 3: "RGB", 4: "RGBA"}
if n not in modes:
raise Exception('unsupported number of channels: {0}'.format(n))
out = np.asarray(im)
if n != 1:
out = out[:, :, ::-1] # BGR -> RGB conversion
return out
또한 imageio를 채택했지만 전처리 및 후 처리에 다음과 같은 기계가 유용하다는 것을 알았습니다.
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 사이의 부동 소수점 값으로 변환합니다.
이미지를 저장할 때 범위를 벗어난 값을 직접 잘라 내야한다는 것을 깨달았으며, 그렇지 않으면 정말 회색 출력으로 끝났습니다. (회색 출력은 imageio가 [0, 256)을 벗어난 전체 범위를 범위 내에있는 값으로 압축 한 결과입니다.)
댓글에서 언급 한 몇 가지 다른 이상한 점도있었습니다.
numpy
및 사용하여 쉽게 rgb 이미지의 numpy 배열을 얻을 수 있습니다.Image from PIL
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
im = Image.open('*image_name*') #These two lines
im_arr = np.array(im) #are all you need
plt.imshow(im_arr) #Just to verify that image array has been constructed properly
cv
OpenCV의 모듈이며, 다음과 같은를 태그해야한다. 이 링크가 도움이 될 수 있습니다 : opencv.willowgarage.com/documentation/python/…