ওপেনসিভি ২.০ এবং পাইথন ২..6 সহ কোনও চিত্র কীভাবে আকার পরিবর্তন করবেন to


163

পুনরায় আকারযুক্ত চিত্রগুলি দেখানোর জন্য আমি ওপেনসিভি ২.০ এবং পাইথন ২..6 ব্যবহার করতে চাই। আমি http://opencv.willowgarage.com/docamentation/python/cookbook.html এ উদাহরণটি ব্যবহার করেছি এবং গ্রহণ করেছি তবে দুর্ভাগ্যক্রমে এই কোডটি ওপেনসিভি 2.1 এর জন্য এবং এটি 2.0 তে কাজ করছে বলে মনে হয় না। এখানে আমার কোড:

import os, glob
import cv

ulpath = "exampleshq/"

for infile in glob.glob( os.path.join(ulpath, "*.jpg") ):
    im = cv.LoadImage(infile)
    thumbnail = cv.CreateMat(im.rows/10, im.cols/10, cv.CV_8UC3)
    cv.Resize(im, thumbnail)
    cv.NamedWindow(infile)
    cv.ShowImage(infile, thumbnail)
    cv.WaitKey(0)
    cv.DestroyWindow(name)

যেহেতু আমি ব্যবহার করতে পারি না

cv.LoadImageM

আমি ব্যবহার করতাম

cv.LoadImage

পরিবর্তে, যা অন্যান্য অ্যাপ্লিকেশনগুলিতে কোনও সমস্যা ছিল না। তবুও সিভি.প্লিমিজেজে কোনও বৈশিষ্ট্য সারি, কলস বা আকার নেই। কেউ কি আমাকে ইঙ্গিত দিতে পারেন, কীভাবে এই সমস্যাটি সমাধান করবেন? ধন্যবাদ।


4
যদি উত্তরগুলির কোনও ঠিক থাকে তবে দয়া করে এটি চিহ্নিত করুন কারণ এটি অন্যকে সহায়তা করবে।
মিচা

উত্তর:


342

আপনি যদি সিভি 2 ব্যবহার করতে চান তবে আপনাকে resizeফাংশনটি ব্যবহার করতে হবে।

উদাহরণস্বরূপ, এটি উভয় অক্ষকে অর্ধেক আকারে পরিবর্তন করবে:

small = cv2.resize(image, (0,0), fx=0.5, fy=0.5) 

এবং এটি চিত্রটি পুনরায় আকার দেবে 100 টি কলস (প্রস্থ) এবং 50 টি সারি (উচ্চতা):

resized_image = cv2.resize(image, (100, 50)) 

আরেকটি বিকল্প হ'ল scipyমডিউলটি ব্যবহার করে:

small = scipy.misc.imresize(image, 0.5)

এই ফাংশনগুলির ডকুমেন্টেশনে আপনি স্পষ্টতই আরও বিকল্পগুলি পড়তে পারেন ( cv2.resize , scipy.misc.imresize )।


আপডেট: সায়পাই ডকুমেন্টেশন
অনুসারে :

imresizeহয় অবচিত SciPy 1.0.0, এবং 1.2.0 মধ্যে সরানো হবে। পরিবর্তে
ব্যবহার skimage.transform.resizeকরুন।

মনে রাখবেন যে আপনি যদি কোনও ফ্যাক্টরটির মাধ্যমে আকার পরিবর্তন করতে চান তবে আপনি বাস্তবে চাইবেন skimage.transform.rescale


1
আকার পরিবর্তন () ফাংশনটি কী ছবিটিকে নিজের সম্পর্কে তথ্য হারিয়ে দেয়?

8
হ্যাঁ, তথ্য না হারিয়ে আপনি চিত্রের আকার হ্রাস করতে পারবেন না।
রাফায়েল_স্পেরিকুয়েতা

1
ওপেনসিভি (চিত্র প্রতি 0.05 মিমি) বাস্তবায়ন স্কিপি (0.33ms চিত্র) প্রয়োগের চেয়ে অনেক দ্রুত বলে মনে হচ্ছে। আমি 210x160x1 থেকে 84x84x1 চিত্রগুলিকে বিলিনিয়ার অন্তরঙ্গকরণের সাথে পুনরায় আকার দিয়েছি।
গিজমল

@ gizzmole আকর্ষণীয় অন্তর্দৃষ্টি। আমি বাস্তবায়নগুলির দক্ষতা পরীক্ষা করিনি, ফলাফলগুলি তুলনাও করিনি - সুতরাং শেষ ফলাফলটিও কিছুটা আলাদা হতে পারে। আপনি কি পুনরায় আকারিত চিত্রগুলি কিছুটা মিলে যাওয়ার পরীক্ষা করেছেন?
ইমাম

পুনরায় আকার ফাংশনটি (ডাব্লু * এইচ) নেওয়ার জন্য সিভি 2 মুদ্রণ করার জন্য ধন্যবাদ
শিবাম কোতোয়ালিয়া

59

চিত্রের আকার দ্বিগুণ করার উদাহরণ

কোনও চিত্রকে পুনরায় আকার দেওয়ার দুটি উপায় রয়েছে। নতুন আকার নির্দিষ্ট করা যেতে পারে:

  1. ম্যানুয়ালি;

    height, width = src.shape[:2]

    dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)

  2. একটি স্কেলিং ফ্যাক্টর দ্বারা।

    dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)যেখানে fx অনুভূমিক অক্ষ বরাবর অনুভূমিক অক্ষ বরাবর স্কেলিং ফ্যাক্টর এবং fy

কোনও চিত্র সঙ্কুচিত করতে, এটি সাধারণত INTER_AREA অন্তরঙ্গকরণের সাথে সবচেয়ে ভাল দেখায়, অন্যদিকে কোনও চিত্র বড় করার জন্য এটি সাধারণত INTER_CUBIC (ধীর) বা INTER_LINEAR (দ্রুত তবে তবুও ঠিক আছে) দেখাচ্ছে looks

উদাহরণস্বরূপ সর্বাধিক উচ্চতা / প্রস্থে মাপতে চিত্র সঙ্কুচিত করুন (দিকের অনুপাত বজায় রাখা)

import cv2

img = cv2.imread('YOUR_PATH_TO_IMG')

height, width = img.shape[:2]
max_height = 300
max_width = 300

# only shrink if img is bigger than required
if max_height < height or max_width < width:
    # get scaling factor
    scaling_factor = max_height / float(height)
    if max_width/float(width) < scaling_factor:
        scaling_factor = max_width / float(width)
    # resize image
    img = cv2.resize(img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)

cv2.imshow("Shrinked image", img)
key = cv2.waitKey()

সিভি 2 সহ আপনার কোড ব্যবহার করা

import cv2 as cv

im = cv.imread(path)

height, width = im.shape[:2]

thumbnail = cv.resize(im, (round(width / 10), round(height / 10)), interpolation=cv.INTER_AREA)

cv.imshow('exampleshq', thumbnail)
cv.waitKey(0)
cv.destroyAllWindows()

স্কেলিং ফ্যাক্টরগুলি ব্যবহার করে আপনার সমাধানটি সিভি 2.resize () এ ত্রুটি দেয় যা বলেছিল যে 'এসসিআরটি একটি আঙ্কুল অ্যারে নয়, কোনও স্কেলারও নয়' ' দয়া করে উপদেশ দাও?
বেনপ

আপনি কি করেছেন: src = cv2.imread('YOUR_PATH_TO_IMG')এবং আপনার নিজের ইমেজের পথে 'YOUR_PATH_TO_IMG' সম্পাদনা করেছেন?
জোও কার্টুচো

না cv2.resizeস্বয়ংক্রিয়ভাবে প্যাডিং প্রয়োগ ব্যবহার করে? উইন্ডোটির আকারটি যা পছন্দসই আউটপুট আকার ব্যবহার করে তৈরি করা হয় (width/10, height/10)?
seralouk

@makaros আপনি এমন একটি চিত্র 10x ছোট উভয় প্রস্থ ও উচ্চতা পেতে
জোয়াও Cartucho

@ জোওকার্টুচো হ্যাঁ আমি এটি বুঝতে পারি। তবে যখন নিকটস্থ_নিবারগুলি ব্যবহৃত হয় তখন পর্দার আড়ালে একটি উইন্ডো প্রয়োগ করা উচিত। এই আমি যা জিজ্ঞাসা করছি ..
seralouk

8

আপনি এই তথ্যগুলি পেতে গেটসাইজ ফাংশনটি ব্যবহার করতে পারেন, সিভি.গেটসাইজ (আইএম) চিত্রের প্রস্থ এবং উচ্চতা সহ একটি টুপল ফিরিয়ে দেবে। আপনি আরও কিছু তথ্য পেতে im.depth এবং img.nChan ব্যবহার করতে পারেন।

এবং একটি চিত্রের আকার পরিবর্তন করতে, আমি ম্যাট্রিক্সের পরিবর্তে অন্য চিত্র সহ কিছুটা আলাদা প্রক্রিয়া ব্যবহার করব। একই ধরণের ডেটা নিয়ে কাজ করার চেষ্টা করা ভাল:

size = cv.GetSize(im)
thumbnail = cv.CreateImage( ( size[0] / 10, size[1] / 10), im.depth, im.nChannels)
cv.Resize(im, thumbnail)

আশাকরি এটা সাহায্য করবে ;)

জুলিয়েন


6
def rescale_by_height(image, target_height, method=cv2.INTER_LANCZOS4):
    """Rescale `image` to `target_height` (preserving aspect ratio)."""
    w = int(round(target_height * image.shape[1] / image.shape[0]))
    return cv2.resize(image, (w, target_height), interpolation=method)

def rescale_by_width(image, target_width, method=cv2.INTER_LANCZOS4):
    """Rescale `image` to `target_width` (preserving aspect ratio)."""
    h = int(round(target_width * image.shape[0] / image.shape[1]))
    return cv2.resize(image, (target_width, h), interpolation=method)

না cv2.resizeস্বয়ংক্রিয়ভাবে প্যাডিং প্রয়োগ ব্যবহার করে? (w, target_height)যুক্তি ব্যবহার করে তৈরি করা উইন্ডোর আকারটি কী ?
seralouk

4

আকৃতির অনুপাত বজায় রাখার সময় কাঙ্ক্ষিত প্রস্থ বা উচ্চতা অনুসারে একটি চিত্র উত্সাহিত বা ডাউনস্কল করার জন্য এখানে একটি ফাংশন রয়েছে

# Resizes a image and maintains aspect ratio
def maintain_aspect_ratio_resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    # Grab the image size and initialize dimensions
    dim = None
    (h, w) = image.shape[:2]

    # Return original image if no need to resize
    if width is None and height is None:
        return image

    # We are resizing height if width is none
    if width is None:
        # Calculate the ratio of the height and construct the dimensions
        r = height / float(h)
        dim = (int(w * r), height)
    # We are resizing width if height is none
    else:
        # Calculate the ratio of the width and construct the dimensions
        r = width / float(w)
        dim = (width, int(h * r))

    # Return the resized image
    return cv2.resize(image, dim, interpolation=inter)

ব্যবহার

import cv2

image = cv2.imread('1.png')
cv2.imshow('width_100', maintain_aspect_ratio_resize(image, width=100))
cv2.imshow('width_300', maintain_aspect_ratio_resize(image, width=300))
cv2.waitKey()

এই উদাহরণ চিত্র ব্যবহার করে

এখানে চিত্র বর্ণনা লিখুন

খালি width=100(বামে) ডাউনস্কেল বা উপরে width=300(ডানদিকে) উপরে যাওয়া

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.