উত্তর:
আপনি নতুন ওপেনসিভি পাইথন ইন্টারফেস ব্যবহার করতে পারেন (যদি আমি ভুল না করি তবে এটি ওপেনসিভি ২.২ থেকে পাওয়া যায়)। এটি নেটিভ অ্যারে ব্যবহার করে:
import cv2
im = cv2.imread("abc.tiff",mode='RGB')
print type(im)
ফলাফল:
<type 'numpy.ndarray'>
$ pip install opencv-python
ওপেনসিভি ইনস্টল করতে
TypeError: 'mode' is an invalid keyword argument for imread()
mode
যুক্তিটি বাদ দিয়েছে । একটি আপডেট পদ্ধতির জন্য নীচে আমার উত্তর দেখুন।
পিআইএল (পাইথন ইমেজিং লাইব্রেরি) এবং নম্পি একসাথে ভাল কাজ করে।
আমি নিম্নলিখিত ফাংশন ব্যবহার।
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" )
TypeError: long() argument must be a string or a number, not 'PixelAccess'
এবং পিআইএল-এর PixelAccess
ক্লাসের ডকুমেন্টেশনের দিকে তাকালে এটি এমন পদ্ধতিগুলি সরবরাহ করে না যা np.array
এর অন্তর্নিহিত ডেটাটিকে ndarray
বিন্যাসে রূপান্তর করতে সক্ষম করে would আপনার ব্যবহার বাদ দিতে হবে img.load()
এবং কেবল ফলাফলের সাথে ডিল করতে হবে Image.open(...)
।
আপনি এটির জন্য ম্যাটপ্ল্লিটিবও ব্যবহার করতে পারেন ।
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'>
আপনাকে সিভি.লুডআইমেজএম এর পরিবর্তে সিভি.লুডআইমেজ ব্যবহার করতে হবে:
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)
ডেভিড পুলের উত্তরটি ব্যবহার করার সময় আমি ধূসর স্কেল পিএনজি এবং সম্ভবত অন্যান্য ফাইলগুলির সাথে একটি সিস্টেমআরর পাই। আমার সমাধানটি হ'ল:
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 () সমস্ত ফাইলের জন্য কাজ করবে, তবে এটি ধীর গতির, তাই আমি অন্য পদ্ধতিটি ব্যর্থ হলেই এটি ব্যবহার করি।
ওপেনসিভি চিত্র বিন্যাসটি নমপি অ্যারে ইন্টারফেসকে সমর্থন করে। গ্রেস্কেল বা রঙের চিত্রগুলিকে সমর্থন করার জন্য একটি সহায়ক ফাংশন তৈরি করা যেতে পারে। এর অর্থ বিজিআর -> আরজিবি রূপান্তরটি সুবিধামত একটি অদ্ভুত ফালি দিয়ে করা যেতে পারে, চিত্রের ডেটার সম্পূর্ণ কপি নয়।
দ্রষ্টব্য: এটি একটি ধীরে ধীরে কৌশল, সুতরাং আউটপুট অ্যারে সংশোধন করা ওপেনসিভি চিত্রের ডেটাও পরিবর্তন করবে। আপনি যদি একটি অনুলিপি চান, .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.willowgarage.com/docamentation/python/…