OpenCV2.0 और Python2.6 के साथ छवि का आकार कैसे बदलें


163

मैं OpenCV2.0 और Python2.6 का उपयोग करना चाहते हैं ताकि वे संशोधित चित्र दिखा सकें। मैंने http://opencv.willowgarage.com/documentation/python/cookbook.html पर उदाहरण का उपयोग किया और अपनाया लेकिन दुर्भाग्य से यह कोड OpenCV2.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

इसके बजाय, जो अन्य अनुप्रयोगों में कोई समस्या नहीं थी। फिर भी cv.iplimage में कोई विशेषता पंक्तियाँ, कॉल या आकार नहीं हैं। क्या कोई मुझे संकेत दे सकता है, इस समस्या को कैसे हल किया जाए? धन्यवाद।


4
यदि कोई उत्तर सही था, तो कृपया इसे चिह्नित करें क्योंकि यह दूसरों की मदद करेगा।
मिशैल

जवाबों:


342

यदि आप CV2 का उपयोग करना चाहते हैं, तो आपको 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 )।


अद्यतन: SciPy प्रलेखन के
अनुसार :

imresizeहै पदावनत SciPy 1.0.0 में, और 1.2.0 में निकाल दिया जाएगा। इसके बजाय
उपयोग करें skimage.transform.resize

ध्यान दें कि यदि आप किसी कारक द्वारा आकार बदलना चाह रहे हैं, तो आप वास्तव में चाहते हैंskimage.transform.rescale


1
आकार () फ़ंक्शन अपने बारे में जानकारी खोने वाली तस्वीर नहीं बनाता है?

8
हां, आप बिना जानकारी खोए छवि का आकार कम नहीं कर सकते।
राफेल_एस्पेरिकुटा

1
Opencv (0.05ms प्रति छवि) कार्यान्वयन scipy (0.33ms छवि) कार्यान्वयन की तुलना में बहुत तेज़ लगता है। मैंने बिलिनियर इंटरपोलेशन के साथ 210x160x1 से 84x84x1 छवियों का आकार बदला।
गिज्मोले

@gizzmole दिलचस्प अंतर्दृष्टि। मैंने कार्यान्वयन की दक्षता का परीक्षण नहीं किया, और न ही परिणामों की तुलना की - इसलिए अंतिम परिणाम भी थोड़ा भिन्न हो सकता है। क्या आपने आकार बदलने वाली छवियों को देखने के लिए परीक्षण किया है?
EMEM

इंगित करने के लिए थैक्स जो कि फ़ंक्शन ले (W * H) का आकार बदलता है, जबकि cv2 प्रिंट (H * W) के रूप में
शिवम कोतवालिया

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 (तेजी से लेकिन अभी भी ठीक दिखता है) के साथ सबसे अच्छा लगेगा।

उदाहरण एक अधिकतम ऊंचाई / चौड़ाई (पहलू अनुपात रखते हुए) फिट करने के लिए छवि को सिकोड़ें

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

Cv2 के साथ अपने कोड का उपयोग करना

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

स्केलिंग कारकों का उपयोग करके आपका समाधान cv2.resize () पर यह कहते हुए एक त्रुटि देता है कि 'src एक संख्यात्मक सरणी नहीं है, न ही कोई स्केलर।' कृपया सलाह दें?
बेनपी

आपने क्या किया: src = cv2.imread('YOUR_PATH_TO_IMG')और 'Your_PATH_TO_IMG' को अपनी छवि के पथ पर संपादित किया?
जोआ कार्टूको

करता है cv2.resizeस्वचालित रूप से padding का उपयोग करता है? वांछित आउटपुट आकार का उपयोग करके बनाई गई विंडो का आकार क्या है (width/10, height/10)?
सेरालोक

@ मकारोस आपको एक ऐसी छवि मिलती है जो चौड़ाई और ऊंचाई दोनों में 10
गुना

@ JoãoCartucho हाँ मैं इसे समझता हूँ। लेकिन जब निकटतम_नीचर्स का उपयोग किया जाता है, तो पर्दे के पीछे एक खिड़की को लागू किया जाना चाहिए। यही मैं पूछ रहा हूं ..
1919

8

आप उन सूचनाओं को प्राप्त करने के लिए GetSize फ़ंक्शन का उपयोग कर सकते हैं, cv.GetSize (im) छवि की चौड़ाई और ऊंचाई के साथ एक टपल लौटाएगा। कुछ और जानकारी पाने के लिए आप 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स्वचालित रूप से padding का उपयोग करता है? उस विंडो का आकार क्या है जो (w, target_height)तर्कों का उपयोग करके बनाई गई है?
सर्लौक

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(दाएं) के लिए डाउनस्केल करें

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

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