নম্পি রিসাইজ / রিসাইকেল চিত্র


98

আমি একটি চিত্র নিয়ে যেতে চাই এবং চিত্রটির স্কেল পরিবর্তন করতে চাই, যদিও এটি একটি অল্প অ্যারে।

উদাহরণস্বরূপ আমার কাছে কোকাকোলা বোতলটির এই চিত্রটি রয়েছে: বোতল -১

যা আকারের অলঙ্কার বিন্যাসে অনুবাদ করে (528, 203, 3)এবং আমি এই দ্বিতীয় চিত্রটির আকার বলতে এটির আকার পরিবর্তন করতে চাই: বোতল -২

যার আকৃতি রয়েছে (140, 54, 3)

মূল চিত্রটি বজায় রেখে আমি কীভাবে চিত্রের আকারকে একটি নির্দিষ্ট আকারে পরিবর্তন করব? অন্যান্য উত্তরগুলি প্রতিটি অন্যান্য বা তৃতীয় সারিটি সরিয়ে ফেলার পরামর্শ দেয় তবে আমি যা করতে চাই তা মূলত চিত্রটি সঙ্কুচিত করা হয় আপনি কীভাবে কোনও চিত্র সম্পাদকের মাধ্যমে তবে পাইথন কোডে। নম্পি / সায়পি-তে এটি করার জন্য কোনও লাইব্রেরি আছে কি?


আপনি কি আপনার নাম্পার অ্যারের জন্য কোডটি প্রদর্শন করতে পারেন?
ShpielMeister


4
আপনার লিঙ্ক করা পৃষ্ঠা অনুসারে @ সাসাচা অবমূল্যায়ন করেছেন।
পল পান্জার

@ শপিয়েলমিস্টার আমি ইন্টেলিজকে পুরোপুরি আঙ্কুল অ্যারে মুদ্রণ করতে পারব না, কোনও কারণে যখন আউটপুটগুলি বড় হয় এটি সমস্ত সময় ... রাখে, সুতরাং আমি কেবল কনসোলে অ্যারের আউটপুটটির কিছু অংশ দেখতে পাচ্ছি
ব্রায়ান হ্যামিল

উত্তর:


123

হ্যাঁ, আপনি ইনস্টল করতে পারেন opencv(এটি ইমেজ প্রসেসিং এবং কম্পিউটার ভিশনের জন্য ব্যবহৃত একটি গ্রন্থাগার), এবং cv2.resizeফাংশনটি ব্যবহার করতে পারেন । এবং উদাহরণস্বরূপ ব্যবহার:

import cv2
import numpy as np

img = cv2.imread('your_image.jpg')
res = cv2.resize(img, dsize=(54, 140), interpolation=cv2.INTER_CUBIC)

এখানে imgমূল চিত্রটি সহ resএকটি নম্পী অ্যারে রয়েছে, সেখানে পুনরায় আকারযুক্ত চিত্রযুক্ত একটি নমপি অ্যারে রয়েছে । একটি গুরুত্বপূর্ণ দিকটি হল interpolationপ্যারামিটার: একটি চিত্রকে পুনরায় আকার দেওয়ার বিভিন্ন উপায় রয়েছে। বিশেষত যেহেতু আপনি চিত্রটি স্কেল করেন এবং মূল চিত্রটির আকার পুনরায় আকারিত চিত্রের আকারের একাধিক নয় । সম্ভাব্য ইন্টারপোলেশন স্কিমগুলি হ'ল:

  • INTER_NEAREST - নিকটতম প্রতিবেশী দ্বিখণ্ডিত
  • INTER_LINEAR - একটি বিলাইনার ইন্টারপোলেশন (ডিফল্টরূপে ব্যবহৃত)
  • INTER_AREA- পিক্সেল অঞ্চল সম্পর্ক ব্যবহার করে পুনরায় মডেলিং করা। ইমেজ ডেসিমেশনের জন্য এটি একটি পছন্দসই পদ্ধতি হতে পারে, কারণ এটি মোয়্যার-মুক্ত ফলাফল দেয়। তবে চিত্রটি যখন জুম করা হয়, তবে এটি INTER_NEARESTপদ্ধতির মতো।
  • INTER_CUBIC - 4x4 পিক্সেল পাড়াতে একটি বাইকিউবিক ইন্টারপোলেশন
  • INTER_LANCZOS4 - 8x8 পিক্সেলের আশেপাশের একটি ল্যাঙ্কজোস ইন্টারপোলেশন

বেশিরভাগ বিকল্পের মতো, এই ক্ষেত্রে কোনও "সেরা" বিকল্প নেই যে প্রতি আকার পুনরায় আকারের স্কীমার জন্য এমন পরিস্থিতি রয়েছে যেখানে একটি কৌশল অন্যটির চেয়ে বেশি পছন্দ করা যায়।


4
আমি এই কোডটি স্রেফ চেষ্টা করেছি এবং এটি কার্যকর! কেবলমাত্র একটি পরিবর্তন হ'ল এটি x এর y এর মতোই dsizeহওয়া উচিত dsize=(54, 140), যেখানে একটি নির্গম অ্যারে y হিসাবে আকারটি দেখায় x (y হল সারি সংখ্যা এবং x কলামের সংখ্যা)
ব্রায়ান হ্যামিল

6
আমি সিভি 2 এড়াতে চেষ্টা করি, এটি বিজিআর চ্যানেল ফর্ম্যাটে মাত্রা এবং লোডগুলি অদলবদল করে। আমি পছন্দ করি skimage.io.imread('image.jpg')এবং skimage.transform.resize(img)scikit-image.org/docs/dev/install.html
এডুয়ার্ডো

4
@ এদুয়ার্ডোপিনেটেলসি আমি স্কিমাজ.টান্সফর্ম.সাইজার এড়িয়ে চলেছি কারণ এটি যে দ্বি-বিভাজন অ্যালগরিদম ব্যবহার করে তাতে আপনার নিয়ন্ত্রণ নেই। তবে, এটি গুরুত্বপূর্ণ নয়, লোকের ব্যবহারের ক্ষেত্রে নির্ভর করে।
ডেকার

4
@ ডেকার skimage.transform.resize 'অর্ডার'-প্যারামিটারের মাধ্যমে কিছু নিয়ন্ত্রণ সরবরাহ করে। অর্ডার = 0 নিকটতম প্রতিবেশী, 1 = দ্বি-লিনিয়ার, 2 = দ্বি দ্বি-চতুর্ভুজ, 3 = দ্বি-ঘন ইত্যাদি No তবে কোনও ক্ষেত্রের গড় বা ল্যাঙ্কজোস অন্তরঙ্গকরণ নেই।
তাপিও

4
@ টেপিওফ্রিবার্গ আহ্ হ্যাঁ, আমি সংশোধন করছি; আমি skimage.transfor.warp এর 'অর্ডার' প্যারামিটারের জন্য ডকুমেন্টেশনের অধীনে সংজ্ঞায়িত অ্যালগরিদমগুলি দেখছি। কোনও সময়ে ডকস আপডেট করতে সহায়ক হতে পারে প্রকারগুলির জন্য উল্লেখগুলি অন্তর্ভুক্ত করতে, "দ্বি-কোয়ার্টিক", উদাহরণস্বরূপ, ডকুমেন্টেশনের অন্য কোথাও সংজ্ঞায়িত হয়নি, (ডিসেম্বর 10 2019) - একটি ওয়ান-লাইনার ভবিষ্যতের ব্যবহারকারীদের জন্য উপকারী হতে।
ডেকার

67

এটি করার জন্য একা নিম্পী ব্যবহার করা সম্ভব হলেও অপারেশনটি অন্তর্নির্মিত নয়। এটি বলেছিল, আপনি scikit-imageএই ধরণের চিত্রের ম্যানিপুলেশন করতে (যা নিম্পায় নির্মিত) ব্যবহার করতে পারেন ।

সাইকিট-চিত্র পুনরুদ্ধার ডকুমেন্টেশন এখানে

উদাহরণস্বরূপ, আপনি নিজের ইমেজ দিয়ে নিম্নলিখিতটি করতে পারেন:

from skimage.transform import resize
bottle_resized = resize(bottle, (140, 54))

এটি আপনার জন্য ইন্টারপোলেশন, অ্যান্টি-অ্যালাইজিং ইত্যাদির যত্ন নেবে।


4
ধন্যবাদ! এই উত্তরটিও কাজ করে! যদিও আমি anti_aliasingপতাকাটি নিয়ে কিছু সমস্যা পাচ্ছি , মনে হচ্ছে এটি 0.13.1 এর
ব্রায়ান হ্যামিল

8
এই আয় ইমেজ হিসাবে ভাসা ndarray এমনকি যদি আপনার মূল ইমেজ uint8
sziraqui

4
এটি একটি দুর্দান্ত কৌশল কারণ এটি যে কোনও সংখ্যক চ্যানেলের সাথে কাজ করে। আমি ডিগ্রি পয়েন্ট ক্লাউড ডেটার সাথে মিলিয়ে আরজিবি ডেটা দিয়ে এটি চেষ্টা করেছি এবং এটি আমার পছন্দ মতো সম্পর্ক সংরক্ষণ করেছে।
ডারথ এগ্রিগিয়াস

@ ডার্থএগ্রিজিয়াস, জ্যাকেভিডিপি -> আপনি বর্ণিত পদ্ধতির মতো (১৩ 64,২66,৩) অ্যারে (64৪,6464) এর আকার পরিবর্তন করার সময় এটি আমার এলোমেলো শব্দের তথ্যকে একক রঙে পরিণত করেছে। এটি কি সাধারণ কারণ এটি দেখে মনে হচ্ছে এটি সমস্ত তথ্য হারিয়ে গেছে?
দেশওয়াল

4
এটা হতে যাবে না (64,64,3)
ডার্থ গুরুতর

14

গুগল থেকে এখানে আসা লোকেরা numpyমেশিন লার্নিং অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য অ্যারেগুলিতে চিত্রগুলি ডাউনসাম্পল করার দ্রুত উপায় খুঁজছেন , এখানে একটি সুপার দ্রুত পদ্ধতি ( এখান থেকে অভিযোজিত )' s এই পদ্ধতিটি কেবল তখনই কাজ করে যখন ইনপুট মাত্রাগুলি আউটপুট মাত্রার একাধিক।

নিম্নলিখিত উদাহরণগুলি 128x128 থেকে 64x64 এ ডাউনসাম্পল (এটি সহজেই পরিবর্তন করা যেতে পারে)।

চ্যানেলগুলি সর্বশেষ অর্ডার করছে

# large image is shape (128, 128, 3)
# small image is shape (64, 64, 3)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((output_size, bin_size, 
                                   output_size, bin_size, 3)).max(3).max(1)

চ্যানেলগুলি প্রথম অর্ডার করছে

# large image is shape (3, 128, 128)
# small image is shape (3, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((3, output_size, bin_size, 
                                      output_size, bin_size)).max(4).max(2)

গ্রেস্কেল চিত্র শুধু পরিবর্তন জন্য 3একটি থেকে 1ভালো:

চ্যানেলগুলি প্রথম অর্ডার করছে

# large image is shape (1, 128, 128)
# small image is shape (1, 64, 64)
input_size = 128
output_size = 64
bin_size = input_size // output_size
small_image = large_image.reshape((1, output_size, bin_size,
                                      output_size, bin_size)).max(4).max(2)

এই পদ্ধতিতে সর্বাধিক পুলিংয়ের সমতুল্য ব্যবহার করা হয়। এটি খুঁজে পাওয়ার সবচেয়ে দ্রুততম উপায় এটি আমি খুঁজে পেয়েছি।


4
বৃহত্তর_মেজ [:, :: 2, :: 2] অর্ধেক রেজোলিউশন সহ চিত্রটি প্রদান করে।
এল কর্ক্কিনেন

4
@ LasseKärkkäinen কিন্তু এটি কোন নমুনা নয়, এটি কেবলমাত্র প্রতিটি পিক্সেল নির্বাচন করে। পার্থক্যটি হ'ল চূড়ান্ত ফাংশন 'সর্বাধিক' পিক্সেলগুলি কিছুটা ভাল উপায়ে (উদাহরণস্বরূপ 'মিনিট' বা 'গড়' ব্যবহার করে) বা পিক্সেল গণনা করতে পরিবর্তন করা যেতে পারে। আপনার পদ্ধতিটি কার্যকর (এবং দ্রুত) যদি তা বিবেচনা না করে তবে কার্যকর।
ওয়েলন ফ্লিন

@ L.Kärkkäinen ডাবল রেজুলেশন এর বিপরীত কি?
রায়জিন্জ

4
@ রাইজনজnp.repeat(np.repeat(a, 2, axis=0), 2, axis=1)
এল। কার্ক্কিনেদিন

11

অতিরিক্ত লাইব্রেরি ব্যবহার না করে যদি কেউ পাইথনে কোনও চিত্র স্কেল / আকার পরিবর্তন করতে একটি সহজ পদ্ধতির সন্ধান করতে আসে তবে এখানে একটি খুব সাধারণ চিত্র পুনরায় আকার দেওয়া ফাংশন রয়েছে:

#simple image scaling to (nR x nC) size
def scale(im, nR, nC):
  nR0 = len(im)     # source number of rows 
  nC0 = len(im[0])  # source number of columns 
  return [[ im[int(nR0 * r / nR)][int(nC0 * c / nC)]  
             for c in range(nC)] for r in range(nR)]

ব্যবহারের উদাহরণ: একটি (30 x 30) চিত্রকে আকার দিন (100 x 200):

import matplotlib.pyplot as plt

def sqr(x):
  return x*x

def f(r, c, nR, nC):
  return 1.0 if sqr(c - nC/2) + sqr(r - nR/2) < sqr(nC/4) else 0.0

# a red circle on a canvas of size (nR x nC)
def circ(nR, nC):
  return [[ [f(r, c, nR, nC), 0, 0] 
             for c in range(nC)] for r in range(nR)]

plt.imshow(scale(circ(30, 30), 100, 200))

আউটপুট: ছোট আকারের চিত্র

এটি চিত্রগুলি সঙ্কুচিত / স্কেল করতে কাজ করে এবং নাম্পার অ্যারেগুলির সাথে সূক্ষ্মভাবে কাজ করে।


4

SciPy এর imresize()পদ্ধতিটি ছিল অন্য একটি আকার পরিবর্তন পদ্ধতি, তবে এটি SciPy v 1.3.0 দিয়ে শুরু করে মুছে ফেলা হবে। SciPy পিআইএল চিত্রের আকার পরিবর্তন পদ্ধতিটিকে বোঝায় :Image.resize(size, resample=0)

আকার - একটি 2-টিউপল হিসাবে পিক্সেলগুলিতে অনুরোধ করা আকার: (প্রস্থ, উচ্চতা)।
পুনরায় নমুনা - একটি alচ্ছিক পুনরায় মডেলিং ফিল্টার। এটি PIL.Image.NEAREST (নিকটতম প্রতিবেশী ব্যবহার করুন), PIL.I छवि.Belinear (লিনিয়ার অন্তরঙ্গকরণ), PIL.I छवि.BICUBIC (কিউবিক স্প্লাইন ইন্টারপোলেশন), বা PIL.I छवि.LANCZOS (একটি উচ্চ-মানের ডাউনসাম্পলিং ফিল্টারগুলির মধ্যে একটি হতে পারে) )। বাদ দেওয়া থাকলে, বা যদি চিত্রটির মোড "1" বা "পি" থাকে, তবে এটি পিআইএল সেট করুন mage

এখানে লিঙ্ক করুন: https://pillow.readthedocs.io/en/3.1.x/references/Image.html#PIL.I छवि.I छवि. resize


4
দুর্ভাগ্যক্রমে, imresize () অবচয় করা হয়েছে, এটি SciPy 1.3.0 এ সরানো হবে
MiniQuark

1

নম্পি / সায়পি-তে এটি করার জন্য কোনও লাইব্রেরি আছে কি?

অবশ্যই আপনি ওপেনসিভি, বিজ্ঞান-চিত্র বা পিআইএল ছাড়াই এটি করতে পারেন।

চিত্রের আকার পরিবর্তন মূলত প্রতিটি পিক্সেলের স্থানাঙ্কগুলি মুল চিত্র থেকে তার পুনরায় আকারিত স্থানে ম্যাপিং করে।

যেহেতু কোনও চিত্রের স্থানাঙ্কগুলি অবশ্যই পূর্ণসংখ্যা হতে পারে (এটিকে ম্যাট্রিক্স হিসাবে মনে করুন), যদি ম্যাপযুক্ত স্থানাঙ্কের দশমিক মান থাকে তবে আপনার পিক্সেল মানটি এটি পূর্ণসংখ্যার অবস্থানের সাথে আনুমানিকভাবে বিভক্ত করতে হবে (উদাহরণস্বরূপ position পজিশনের নিকটতম পিক্সেলটি জানা যায়) নিকটতম প্রতিবেশী অন্তরঙ্গ হিসাবে )।

আপনার যা দরকার তা হ'ল একটি ফাংশন যা আপনার জন্য এই বিভাজন করে। SciPy আছে interpolate.interp2d

আপনি এটিকে চিত্রের আকারের আকারে আকার পরিবর্তন করতে ব্যবহার করতে পারেন, বলুন arr:

W, H = arr.shape[:2]
new_W, new_H = (600,300)
xrange = lambda x: np.linspace(0, 1, x)

f = interp2d(xrange(W), xrange(H), arr, kind="linear")
new_arr = f(xrange(new_W), xrange(new_H))

অবশ্যই, যদি আপনার চিত্রটি আরজিবি হয় তবে আপনাকে প্রতিটি চ্যানেলের জন্য ইন্টারপোলেশনটি সম্পাদন করতে হবে।

আপনি যদি আরও বুঝতে চান তবে আমি পুনরায় আকার দেওয়ার চিত্রগুলি - কম্পিউটারফিলি দেখার পরামর্শ দিই ।


: এই উত্তর ভিত্তিক কাজ নাও করতে পারে stackoverflow.com/questions/37872171/...
random_dsp_guy

0
import cv2
import numpy as np

image_read = cv2.imread('filename.jpg',0) 
original_image = np.asarray(image_read)
width , height = 452,452
resize_image = np.zeros(shape=(width,height))

for W in range(width):
    for H in range(height):
        new_width = int( W * original_image.shape[0] / width )
        new_height = int( H * original_image.shape[1] / height )
        resize_image[W][H] = original_image[new_width][new_height]

print("Resized image size : " , resize_image.shape)

cv2.imshow(resize_image)
cv2.waitKey(0)

4
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। দুর্দান্ত যে আপনি অন্যদের প্রশ্নের উত্তর দিয়ে তাদের সহায়তা করতে চান। যাইহোক, আমি দেখতে পাই না যে আপনার উত্তরটি বিদ্যমান উত্তরের তুলনায় কীভাবে মান যোগ করে যা ইতিমধ্যে cv2নিকটবর্তী প্রতিবেশী ক্ষয়ের চেয়ে খারাপ কাজ করে এমন একটি "সাব-অনুকূল" পুনরায় আকার ফাংশন পুনরায় প্রয়োগের পরিবর্তে একটি সঠিক আকার পরিবর্তন ফাংশন ব্যবহার করে এবং ব্যবহার করে।
নোহস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.