কীভাবে কোনও আরজিবি চিত্রকে ন্যালি অ্যারেতে রূপান্তর করবেন?


113

আমার একটি আরজিবি চিত্র রয়েছে। আমি এটিকে নম্পার অ্যারেতে রূপান্তর করতে চাই। আমি নিম্নলিখিতটি করেছিলাম

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

এটি কোনও আকার ছাড়াই একটি অ্যারে তৈরি করে। আমি ধরে নিলাম এটি একটি আইপ্লেমেজ অবজেক্ট।


2
যদি cvওপেনসিভি মডিউল হয় তবে আপনার এটির মতো ট্যাগ করা উচিত। এই লিঙ্কটি সাহায্য করতে পারে: opencv.willowgarage.com/docamentation/python/…
পল

উত্তর:


142

আপনি নতুন ওপেনসিভি পাইথন ইন্টারফেস ব্যবহার করতে পারেন (যদি আমি ভুল না করি তবে এটি ওপেনসিভি ২.২ থেকে পাওয়া যায়)। এটি নেটিভ অ্যারে ব্যবহার করে:

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

ফলাফল:

<type 'numpy.ndarray'>

94
সাবধান থাকুন যে সিভি 2.আইম্রিড () আরজিবি নয়, বিজিআর-তে একটি নমপি অ্যারে প্রদান করে।
25:55

6
আপনার মন্তব্য পবিত্র!
এডুয়ার্ডো পিগনেটেলি

4
ভবিষ্যতের রেফারেন্সের জন্য: $ pip install opencv-pythonওপেনসিভি ইনস্টল করতে
কাইল সি

2
TypeError: 'mode' is an invalid keyword argument for imread()
habষভ অগ্রহরি

8
ওপেনসিভি মনে হচ্ছে modeযুক্তিটি বাদ দিয়েছে । একটি আপডেট পদ্ধতির জন্য নীচে আমার উত্তর দেখুন।
Belvederef

73

পিআইএল (পাইথন ইমেজিং লাইব্রেরি) এবং নম্পি একসাথে ভাল কাজ করে।

আমি নিম্নলিখিত ফাংশন ব্যবহার।

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 )

'ইমেজ.ফ্রোমারে' কিছুটা কুৎসিত কারণ আমি আগত ডেটাগুলিকে [0,255] এ ক্লিপ করি, বাইটে রূপান্তর করি, তারপরে একটি গ্রেস্কেল চিত্র তৈরি করি। আমি বেশিরভাগ ধূসর রঙে কাজ করি।

আরজিবি চিত্রটি এমন কিছু হবে:

 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বিন্যাসে রূপান্তর করতে সক্ষম করে would আপনার ব্যবহার বাদ দিতে হবে img.load()এবং কেবল ফলাফলের সাথে ডিল করতে হবে Image.open(...)
ely

Img.load () পিআইএল-তে একটি অদ্ভুত ক্যাশিং ইস্যুতে কাজ করে। স্পষ্টভাবে প্রয়োজন না হওয়া পর্যন্ত ডেটা লোড করা হবে না। বালিশ (পিআইএল কাঁটাচামচ) সাথে কাজ করার সময় উদাহরণটি এখনও আমার জন্য "আমদানি চিত্র" থেকে "পিআইএল আমদানি চিত্র" থেকে "পরিবর্তিত ব্যতীত কাজ করে।
ডেভিড পুল

কেবলমাত্র পিআইএল ব্যবহারের জন্য উপনোট করুন ওপেনসিভি নয়। যদিও আমি ওপেনসিভির বিপক্ষে নই।
প্রগতিমার

54

আপনি এটির জন্য ম্যাটপ্ল্লিটিবও ব্যবহার করতে পারেন ।

from matplotlib.image import imread

img = imread('abc.tiff')
print(type(img))

আউটপুট: <class 'numpy.ndarray'>


2
এটি খুব সহজ। আমি এটি পছন্দ করি :)
jeongmin.cha

@ মৃণাল হ্যাঁ, এটি করে।
habষভ অগ্রহরি 20'19

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

আপনাকে সিভি.লুডআইমেজএম এর পরিবর্তে সিভি.লুডআইমেজ ব্যবহার করতে হবে:

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.CreateMat ব্যবহার করা বা cv.CreateMat ব্যবহার করা উচিত এবং cv.CvtColor বা অন্য কিছু অনুরূপ জিনিস ব্যবহার করে ইমেজ থেকে মাদুরের অনুলিপি করা উচিত। উপরে লিখিত পোস্ট করা লিঙ্কটি একবার দেখুন।
জাস্টিন পিল

3

ডেভিড পুলের উত্তরটি ব্যবহার করার সময় আমি ধূসর স্কেল পিএনজি এবং সম্ভবত অন্যান্য ফাইলগুলির সাথে একটি সিস্টেমআরর পাই। আমার সমাধানটি হ'ল:

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

ওপেনসিভি চিত্র বিন্যাসটি নমপি অ্যারে ইন্টারফেসকে সমর্থন করে। গ্রেস্কেল বা রঙের চিত্রগুলিকে সমর্থন করার জন্য একটি সহায়ক ফাংশন তৈরি করা যেতে পারে। এর অর্থ বিজিআর -> আরজিবি রূপান্তরটি সুবিধামত একটি অদ্ভুত ফালি দিয়ে করা যেতে পারে, চিত্রের ডেটার সম্পূর্ণ কপি নয়।

দ্রষ্টব্য: এটি একটি ধীরে ধীরে কৌশল, সুতরাং আউটপুট অ্যারে সংশোধন করা ওপেনসিভি চিত্রের ডেটাও পরিবর্তন করবে। আপনি যদি একটি অনুলিপি চান, .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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.