web-dev-qa-db-ja.com

OpenCV2.0とPython2.6で画像をリサイズする方法

サイズ変更された画像を表示するために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には属性行、列、またはサイズがありません。誰もが私にヒントを与えることができます、この問題を解決する方法?ありがとう。

137
Bastian

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.resizescipy.misc.imresize )。


更新:
SciPyのドキュメント によると:

imresizeはSciPy 1.0.0では非推奨で、1.2.0では削除される予定です。
代わりに skimage.transform.resize を使用してください。

ファクタでリサイズしようとしているなら、実際には skimage.transform.rescale が欲しいかもしれません。

298
Eran Marom

画像サイズを2倍にした例

画像のサイズを変更する方法は2つあります。新しいサイズを指定できます。

  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, (width/10, height/10), interpolation = cv.INTER_AREA)

cv.imshow('exampleshq', thumbnail)
cv.waitKey(0)
cv.destroyAllWindows()
51
João Cartucho

GetSize関数を使ってこれらの情報を取得することができます。cv.GetSize(im)は画像の幅と高さを持つTupleを返します。また、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)

お役に立てれば ;)

ジュリアン

7
jlengrand
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)
4
AndyP