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
答えが正しかった場合は、他の人の役に立つようにマークを付けてください。
のMichał

回答:


342

CV2を使用する場合は、resize関数を使用する必要があります。

たとえば、これは両方の軸のサイズを半分に変更します。

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

これにより、画像のサイズが100 cols(幅)および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


1
resize()関数は、画像自体の情報を失うのではないですか?

8
はい、情報を失わずに画像のサイズを縮小することはできません。
Rafael_Espericueta 2015年

1
opencv(画像あたり0.05ミリ秒)の実装は、scipy(画像では0.33ミリ秒)の実装よりもはるかに高速であるようです。バイリニア補間を使用して、210x160x1の画像を84x84x1の画像にサイズ変更しました。
gizzmole

@gizzmole興味深い洞察。実装の効率をテストしたり、結果を比較したりしなかったため、最終結果も少し異なる場合があります。サイズ変更された画像がビットごとに一致することを確認するためにテストしましたか?
emem

サイズ変更機能には(W * H)が必要であるのに対し、cv2は(H * W)として印刷されることを指摘してください
Shivam Kotwalia 2018

59

画像サイズを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, (round(width / 10), round(height / 10)), interpolation=cv.INTER_AREA)

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

スケーリング係数を使用するソリューションは、cv2.resize()で「srcはnumpy配列ではなく、スカラーでもない」というエラーを返します。お知らせ下さい?
BenP

あなたはしましたか:src = cv2.imread('YOUR_PATH_TO_IMG')'YOUR_PATH_TO_IMG'をあなた自身の画像のパスに編集しましたか?
ジョアンCartucho

cv2.resize自動的に詰め物を使用していますか?希望する出力サイズを使用して作成されるウィンドウのサイズは何(width/10, height/10)ですか?
seralouk

あなたは幅と高さの両方の10倍小さい画像を取得@makaros
ジョアン・Cartucho

@JoãoCartuchoはい私はこれを理解しています。ただし、nearest_neighborsを使用する場合は、ウィンドウを背後で適用する必要があります。これは私が求めていることです
。– seralouk

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自動的に詰め物を使用していますか?(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.