Görüntüyü OpenCV2.0 ve Python2.6 ile yeniden boyutlandırma


163

Yeniden boyutlandırılmış görüntüleri göstermek için OpenCV2.0 ve Python2.6 kullanmak istiyorum. Örneği http://opencv.willowgarage.com/documentation/python/cookbook.html adresinde kullandım ve kabul ettim ancak maalesef bu kod OpenCV2.1 için ve 2.0 üzerinde çalışmıyor gibi görünüyor. İşte benim kod:

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)

Kullanamadığım için

cv.LoadImageM

kullandım

cv.LoadImage

bunun yerine, diğer uygulamalarda sorun değildi. Bununla birlikte, cv.iplimage'in özellik satırları, sütunları veya boyutları yoktur. Birisi bana bir ipucu verebilir, bu sorunu nasıl çözebilirim? Teşekkürler.


4
Yanıtlardan herhangi biri doğruysa, lütfen başkalarına yardımcı olacak şekilde işaretleyin.
Michał

Yanıtlar:


342

CV2'yi kullanmak istiyorsanız, bu resizeişlevi kullanmanız gerekir .

Örneğin, bu her iki ekseni de yarıya indirir:

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

ve bu, resmi 100 sütun (genişlik) ve 50 satır (yükseklik) olacak şekilde yeniden boyutlandırır:

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

Başka bir seçenek de scipymodülü kullanarak:

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

Bu işlevlerin belgelerinde okuyabileceğiniz daha fazla seçenek var ( cv2.resize , scipy.misc.imresize ).


Güncelleme:
göre scipy belgelerinde :

imresizeolduğu kaldırıldı SciPy 1.0.0 içinde ve 1.2.0 kaldırılacaktır. Bunun yerine
kullanın skimage.transform.resize.

Eğer arıyorsanız eğer Not faktör tarafından yeniden boyutlandırmak , aslında isteyebilirsiniz skimage.transform.rescale.


1
resize () işlevi resmin kendisi hakkında bilgi kaybetmesini sağlamaz mı?

8
Evet, bilgi kaybetmeden görüntünün boyutunu küçültemezsiniz.
Rafael_Espericueta

1
Opencv (görüntü başına 0.05ms) uygulaması, scipy (0.33ms görüntü) uygulamasından çok daha hızlı görünmektedir. Bilineer enterpolasyon ile 210x160x1 - 84x84x1 resimlere boyut verdim.
gizzmole

@gizzmole İlginç bilgiler. Uygulamaların verimliliğini test etmedim veya sonuçları karşılaştırmadım - böylece sonuç biraz farklı olabilir. Yeniden boyutlandırılan görüntülerin bitsel olarak eşleştiğini test ettiniz mi?
emem

Yeniden boyutlandırma işlevinin (W * H) aldığını işaret ettiği için teşekkürler, cv2 (H * W) olarak yazdırılıyor
Shivam Kotwalia

59

Görüntü boyutunu iki katına çıkarma örneği

Görüntüyü yeniden boyutlandırmanın iki yolu vardır. Yeni boyut belirtilebilir:

  1. Manuel;

    height, width = src.shape[:2]

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

  2. Ölçeklendirme faktörü ile.

    dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)burada fx , yatay eksen boyunca ölçeklendirme faktörüdür ve dikey eksen boyunca fy'dir .

Bir görüntüyü daraltmak için, genellikle INTER_AREA enterpolasyonu ile en iyi görünürken, görüntüyü büyütmek için genellikle en iyi INTER_CUBIC (yavaş) veya INTER_LINEAR (daha hızlı fakat yine de iyi görünür) ile görünür.

Maksimum yükseklik / genişliğe sığdırmak için shrink resmi örneği (en boy oranını koruyarak)

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

Kodunuzu CV2 ile kullanma

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

ölçeklendirme faktörlerini kullanan çözümünüz, cv2.resize () işlevinde 'src sayısal bir dizi değil, bir skaler değildir' hatası verir. tavsiye lütfen?
BenP

yaptınız: src = cv2.imread('YOUR_PATH_TO_IMG')ve 'YOUR_PATH_TO_IMG' dosyasını kendi resminizin yolunda düzenlediniz mi?
João Cartucho

does cv2.resizeotomatik doldurma kullanır? istenen çıktı boyutu olarak oluşturulan pencerenin boyutu (width/10, height/10)nedir?
seralouk

@makaros hem genişlik hem de yükseklik açısından 10 kat daha küçük bir görüntü elde edersiniz
João Cartucho

@ JoãoCartucho evet bunu anlıyorum. Ancak en yakın_neğimler kullanıldığında, perde arkasına bir pencere uygulanmalıdır.
Sorduğum

8

Bu bilgileri almak için GetSize işlevini kullanabilirsiniz, cv.GetSize (im) görüntünün genişliği ve yüksekliğiyle bir demet döndürür. Daha fazla bilgi almak için im.depth ve img.nChan komutlarını da kullanabilirsiniz.

Ve bir görüntüyü yeniden boyutlandırmak için, matris yerine başka bir görüntüyle biraz farklı bir işlem kullanırdım. Aynı tür verilerle çalışmaya çalışmak daha iyidir:

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

Bu yardımcı olur umarım ;)

Julien


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)

does cv2.resizeotomatik doldurma kullanır? (w, target_height)bağımsız değişkenler kullanılarak oluşturulan pencerenin boyutu nedir?
seralouk

4

En boy oranını korurken görüntüyü istenen genişliğe veya yüksekliğe göre büyütmek veya küçültmek için bir işlev

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

kullanım

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

Bu örnek görüntüyü kullanma

resim açıklamasını buraya girin

Sadece width=100(sol) veya küçültme width=300(sağ)

resim açıklamasını buraya girin resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.