आरजीबी छवि को सुपीरियर एरे में कैसे बदलें?


113

मेरे पास RGB इमेज है। मैं इसे सुपीरियर एरे में बदलना चाहता हूं। मैंने निम्नलिखित किया

im = cv.LoadImage("abc.tiff")
a = numpy.asarray(im)

यह बिना किसी आकार के एक सरणी बनाता है। मुझे लगता है कि यह एक iplimage ऑब्जेक्ट है।


2
यदि cvOpenCV मॉड्यूल है, तो आपको इसे इस तरह टैग करना चाहिए। इस कड़ी में मदद मिल सकती है: opencv.willowgarage.com/documentation/python/...
पॉल

जवाबों:


142

आप नए OpenCV पायथन इंटरफ़ेस का उपयोग कर सकते हैं (यदि मैं गलत नहीं हूँ तो यह OpenCV 2.2 के बाद से उपलब्ध है)। यह मूल रूप से सुन्न सरणियों का उपयोग करता है:

import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)

परिणाम:

<type 'numpy.ndarray'>

95
सावधान रहें कि cv2.imread () BGR में एक आरजीबी नहीं आरजीबी के बराबर है।
Jan17

6
@ और आपकी टिप्पणी पवित्र है!
एडुआर्डो पिग्नाटेली

4
भविष्य के संदर्भ के लिए: $ pip install opencv-pythonopencv
Kyle C

2
TypeError: 'mode' is an invalid keyword argument for imread()
ऋषभ अग्रहरी

8
ओपनसीवी ने modeतर्क को गिरा दिया है। अद्यतन विधि के लिए नीचे मेरा उत्तर देखें।
बेल्वदरफ

73

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" )

1
यह एक त्रुटि के साथ विफल हो जाता है, TypeError: long() argument must be a string or a number, not 'PixelAccess'और पीआईएल के PixelAccessवर्ग के लिए प्रलेखन को देखते हुए , यह उन तरीकों की पेशकश नहीं करता है जो np.arrayइसके अंतर्निहित डेटा को एक ndarrayप्रारूप में बदलने में सक्षम होंगे । आपको इसके उपयोग को छोड़ना होगा img.load()और केवल इसके परिणाम से निपटना होगा Image.open(...)
Ely

PIL में img.load () एक अजीब कैशिंग मुद्दे के आसपास काम करता है। स्पष्ट रूप से आवश्यक होने तक डेटा लोड नहीं किया जाएगा। पिलो (पीआईएल कांटा) के साथ काम करने पर "आयात छवि" को "पीआईएल आयात छवि से" बदलने के अपवाद के साथ अभी भी उदाहरण मेरे लिए काम करता है।
डेविड पूले

केवल पीआईएल का उपयोग करने के लिए अपवोट करें न कि ओपनसीवी। मैं हालांकि OpenCV के खिलाफ नहीं हूं।
progyammer


19

आज के अनुसार, आपका सबसे अच्छा दांव उपयोग करना है:

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'>

12

देर से जवाब, लेकिन मैं imageioअन्य विकल्पों के लिए मॉड्यूल को पसंद करने आया हूं

import imageio
im = imageio.imread('abc.tiff')

इसी तरह cv2.imread(), यह डिफ़ॉल्ट रूप से एक संख्यात्मक सरणी का उत्पादन करता है, लेकिन आरजीबी रूप में।


7

आपको 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)

बहुत बहुत धन्यवाद ... क्या आप कृपया मुझे यह पता लगाने में भी मदद कर सकते हैं कि अगर मैं 'cv.CreateImage (चौड़ाई, ऊंचाई, चैनल)' का उपयोग करके एक छवि बनाता हूं ... तो इसे सुपीरियर सरणी में कैसे बदला जा सकता है?
शान

मुझे लगता है कि आपको इसके बजाय cv.CreateMat का उपयोग करने की आवश्यकता है या cv.CreateMat का उपयोग करें और cv.CvtColor या कुछ इसी तरह की चीज़ का उपयोग करके छवि से कॉपी करें। उस लिंक को देखें जो पॉल ने ऊपर पोस्ट किया है।
जस्टिन पील

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 () सभी फ़ाइलों के लिए काम करेगा, लेकिन यह धीमा है, इसलिए मैं इसका उपयोग केवल तभी करता हूं जब दूसरी विधि विफल हो जाती है।


2

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

1

मैंने भी इमेजियो को अपनाया, लेकिन मैंने निम्नलिखित मशीनरी को पूर्व और बाद के प्रसंस्करण के लिए उपयोगी पाया:

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 के बाहर था), उन मानों के लिए जो रेंज के अंदर थे।)

कुछ अन्य विषमताएँ भी थीं, जिनका उल्लेख मैंने टिप्पणियों में किया।


1

आप आसानी से 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

0

निम्नलिखित सिंटैक्स का उपयोग करके छवि लोड करें: -

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.