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 열 (너비)과 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
resize () 함수가 그림 자체에 대한 정보를 잃어 버리지 않습니까?

8
예, 정보 손실없이 이미지 크기를 줄일 수 없습니다.
Rafael_Espericueta 2016 년

1
opencv (이미지 당 0.05ms) 구현은 scipy (0.33ms 이미지) 구현보다 훨씬 빠른 것 같습니다. 이중 선형 보간으로 210x160x1에서 84x84x1 이미지의 크기를 조정했습니다.
gizzmole가

@gizzmole 재미있는 통찰력. 구현의 효율성을 테스트하거나 결과를 비교하지 않았으므로 최종 결과도 약간 다를 수 있습니다. 크기가 조정 된 이미지가 비트 단위로 일치하는지 테스트 했습니까?
emem

(H * W) CV2로 인쇄하는 반면 그 크기 조정 기능 인출 (W * H)을 지적 Thaks
Shivam Kotwalia

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는 numpy 배열이 아니며 스칼라도 아닙니다'라는 오류를 반환합니다. 조언 부탁드립니다.
BenP

당신은 : src = cv2.imread('YOUR_PATH_TO_IMG')당신의 이미지의 경로에 'YOUR_PATH_TO_IMG'를 편집 했습니까?
João Cartucho

않는 cv2.resize자동으로 패딩 사용한다? 원하는 출력 크기를 사용하여 생성되는 창의 크기는 (width/10, height/10)얼마입니까?
seralouk

@makaros 너비와 높이가 10 배 더 작은 이미지를 얻습니다
João Cartucho

@ JoãoCartucho 네, 이해합니다. 그러나 가장 가까운 _ 이웃이 사용되면 장면 뒤에 창을 적용해야합니다. 이것이 내가 묻는 것입니다.
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.