जवाबों:
आप नए OpenCV पायथन इंटरफ़ेस का उपयोग कर सकते हैं (यदि मैं गलत नहीं हूँ तो यह OpenCV 2.2 के बाद से उपलब्ध है)। यह मूल रूप से सुन्न सरणियों का उपयोग करता है:
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 (पायथन इमेजिंग लाइब्रेरी) और 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'
और पीआईएल के PixelAccess
वर्ग के लिए प्रलेखन को देखते हुए , यह उन तरीकों की पेशकश नहीं करता है जो np.array
इसके अंतर्निहित डेटा को एक ndarray
प्रारूप में बदलने में सक्षम होंगे । आपको इसके उपयोग को छोड़ना होगा img.load()
और केवल इसके परिणाम से निपटना होगा Image.open(...)
।
आप इसके लिए matplotlib का भी उपयोग कर सकते हैं ।
from matplotlib.image import imread
img = imread('abc.tiff')
print(type(img))
उत्पादन:
<class 'numpy.ndarray'>
आज के अनुसार, आपका सबसे अच्छा दांव उपयोग करना है:
img = cv2.imread(image_path) # reads an image in the BGR format
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR -> RGB
आप देखेंगे कि 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)
डेविड पूले के उत्तर का उपयोग करते समय मुझे ग्रे स्केल 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 छवि प्रारूप सुपीरियर सरणी इंटरफ़ेस का समर्थन करता है। ग्रेस्केल या रंगीन चित्रों का समर्थन करने के लिए एक सहायक फ़ंक्शन बनाया जा सकता है। इसका मतलब यह है कि BGR -> RGB रूपांतरण आसानी से एक संख्यात्मक स्लाइस के साथ किया जा सकता है, न कि छवि डेटा की पूरी प्रतिलिपि।
नोट: यह एक कठिन चाल है, इसलिए आउटपुट सरणी को संशोधित करने से 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
मैंने भी इमेजियो को अपनाया, लेकिन मैंने निम्नलिखित मशीनरी को पूर्व और बाद के प्रसंस्करण के लिए उपयोगी पाया:
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)
औचित्य यह है कि मैं छवि प्रसंस्करण के लिए संख्यात्मक उपयोग कर रहा हूं, न कि केवल छवि प्रदर्शित करने के लिए। इस प्रयोजन के लिए, uint8s अजीब हैं, इसलिए मैं 0 से 1 तक के फ़्लोटिंग पॉइंट वैल्यूज़ में परिवर्तित करता हूँ।
छवियों को सहेजते समय, मैंने देखा कि मुझे खुद से बाहर के मूल्यों को काटना पड़ा, वरना मैं वास्तव में ग्रे आउटपुट के साथ समाप्त हो गया। (ग्रे आउटपुट पूर्ण रेंज को कंप्रेस करने का परिणाम था, जो [0, 256 के बाहर था), उन मानों के लिए जो रेंज के अंदर थे।)
कुछ अन्य विषमताएँ भी थीं, जिनका उल्लेख मैंने टिप्पणियों में किया।
आप आसानी से 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
निम्नलिखित सिंटैक्स का उपयोग करके छवि लोड करें: -
from keras.preprocessing import image
X_test=image.load_img('four.png',target_size=(28,28),color_mode="grayscale"); #loading image and then convert it into grayscale and with it's target size
X_test=image.img_to_array(X_test); #convert image into array
cv
OpenCV मॉड्यूल है, तो आपको इसे इस तरह टैग करना चाहिए। इस कड़ी में मदद मिल सकती है: opencv.willowgarage.com/documentation/python/...