programing

OpenCV & Python - 이미지가 너무 커서 표시할 수 없습니다.

yoursource 2023. 9. 4. 22:55
반응형

OpenCV & Python - 이미지가 너무 커서 표시할 수 없습니다.

이미지는 6400 x 3200이고 화면은 1280 x 800입니다.따라서 표시용으로만 이미지 크기를 조정해야 합니다.저는 Python과 OpenCV 2.4.9를 사용하고 있습니다.OpenCV 설명서에 따르면,

화면 해상도보다 큰 이미지를 표시해야 하는 경우, imshow 전에 Window(", WINDOW_NORMAL)라는 이름을 호출해야 합니다.

그렇게 하고 있는데 화면에 이미지가 안 맞고 너무 커서 일부만 보여요.저도 cv2.resize로 시도해봤어요.창문, 하지만 아무런 차이가 없습니다.

import cv2
cv2.namedWindow("output", cv2.WINDOW_NORMAL)        # Create window with freedom of dimensions
# cv2.resizeWindow("output", 400, 300)              # Resize window to specified dimensions
im = cv2.imread("earth.jpg")                        # Read image
cv2.imshow("output", im)                            # Show image
cv2.waitKey(0)                                      # Display the image infinitely until any keypress

자동 솔루션(화면에 자동으로 맞춤)을 기대했지만, 크기를 조정하면 문제도 해결됩니다.

import cv2
cv2.namedWindow("output", cv2.WINDOW_NORMAL)    # Create window with freedom of dimensions
im = cv2.imread("earth.jpg")                    # Read image
imS = cv2.resize(im, (960, 540))                # Resize image
cv2.imshow("output", imS)                       # Show image
cv2.waitKey(0)                                  # Display the image infinitely until any keypress

된 다답은고답수다니행합을된정른▁a다▁perform▁the니▁fixed수▁other합▁answers.(width, height)크기를 조정합니다. 세로 비율을 이 크기를 하세요.

def ResizeWithAspectRatio(image, width=None, height=None, inter=cv2.INTER_AREA):
    dim = None
    (h, w) = image.shape[:2]

    if width is None and height is None:
        return image
    if width is None:
        r = height / float(h)
        dim = (int(w * r), height)
    else:
        r = width / float(w)
        dim = (width, int(h * r))

    return cv2.resize(image, dim, interpolation=inter)

image = cv2.imread('img.png')
resize = ResizeWithAspectRatio(image, width=1280) # Resize by width OR
# resize = ResizeWithAspectRatio(image, height=1280) # Resize by height 

cv2.imshow('resize', resize)
cv2.waitKey()

예를 들어 다음과 같습니다.

cv2.namedWindow('finalImg', cv2.WINDOW_NORMAL)
cv2.imshow("finalImg",finalImg)

한 방법은 ㅠㅠㅠㅠㅠresizeWindow나를 위해 일한 것은 그 후에 그것을 갖는 것이었습니다.imshow내가 사용하는 주문은 다음과 같습니다.

# Create a Named Window
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)

# Move it to (X,Y)
cv2.moveWindow(win_name, X, Y)
    
# Show the Image in the Window
cv2.imshow(win_name, image)
    
# Resize the Window
cv2.resizeWindow(win_name, width, height)
    
# Wait for <> miliseconds
cv2.waitKey(wait_time)

OpenCV는cv2.namedWindow()창 개체만 만들 뿐 원본 이미지의 크기는 조정되지 않습니다.사용할 수 있습니다.cv2.resize(img, resolution)문제를 해결하기 위해.

이것은 740*411 해상도 이미지를 보여줍니다.

image = cv2.imread("740*411.jpg")
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

여기서는 크기 조정 후 100 * 200 해상도 이미지를 표시합니다.해상도 매개 변수 사용 열을 먼저 기억한 다음 행을 기억하십시오.

Image after resizing

image = cv2.imread("740*411.jpg")
image = cv2.resize(image, (200, 100))
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

이 코드는 가로 세로 비율을 유지하고 화면 영역의 지정된 부분만 차지할 수 있도록 이미지 크기를 조정합니다.

화면 크기와 이미지 크기에 따라 자동으로 조정됩니다.

영역 변수를 사용하여 이미지가 차지할 수 있는 최대 화면 영역을 변경합니다.예제에서는 화면 크기의 1/4에 표시됩니다.

import cv2
import tkinter as tk
from math import *

img = cv2.imread("test.jpg")
area = 0.25

h, w = img.shape[:2]
root = tk.Tk()
screen_h = root.winfo_screenheight()
screen_w = root.winfo_screenwidth()
vector = sqrt(area)
window_h = screen_h * vector
window_w = screen_w * vector

if h > window_h or w > window_w:
    if h / window_h >= w / window_w:
        multiplier = window_h / h
    else:
        multiplier = window_w / w
    img = cv2.resize(img, (0, 0), fx=multiplier, fy=multiplier)

cv2.imshow("output", img)
cv2.waitKey(0)

면적이 여전히 매개변수이지만 창 높이와 창 너비도 마찬가지인 비슷한 기능을 만들었습니다.

영역을 입력하지 않으면 이미지를 내부에 넣을 창 크기의 정의된 높이와 너비(window_h, window_w)를 사용합니다.

모든 파라미터에 대해 입력이 제공되면 '영역'이 우선됩니다.

import cv2
import tkinter as tk
from math import *

def resize_image(img, area=0.0, window_h=0, window_w=0):
    h, w = img.shape[:2]
    root = tk.Tk()
    screen_h = root.winfo_screenheight()
    screen_w = root.winfo_screenwidth()

    if area != 0.0:
        vector = math.sqrt(area)
        window_h = screen_h * vector
        window_w = screen_w * vector

    if h > window_h or w > window_w:
        if h / window_h >= w / window_w:
            multiplier = window_h / h
        else:
            multiplier = window_w / w
        img = cv2.resize(img, (0, 0), fx=multiplier, fy=multiplier)

    return img

# using area
initial_image = cv2.imread("test.jpg")
resized_image = resize_image(initial_image, area=0.25))
cv2.imshow("output", resized_image)
cv2.waitKey(0)

# using window height and width
initial_image = cv2.imread("test.jpg")
resized_image = resize_image(initial_image, window_h = 480, window_w = 270))
cv2.imshow("output", resized_image)
cv2.waitKey(0)

opencvlib은 메소드에 전달된 매개 변수에 상당히 민감한 것 같습니다.다음 코드는 opencv 4.3.0을 사용하여 작동했습니다.

win_name = "visualization"  #  1. use var to specify window name everywhere
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)  #  2. use 'normal' flag
img = cv2.imread(filename)
h,w = img.shape[:2]  #  suits for image containing any amount of channels
h = int(h / resize_factor)  #  one must compute beforehand
w = int(w / resize_factor)  #  and convert to INT
cv2.resizeWindow(win_name, w, h)  #  use variables defined/computed BEFOREHAND
cv2.imshow(win_name, img)

사용해 보십시오.

image = cv2.imread("img/Demo.jpg")
image = cv2.resize(image,(240,240))

image이제 크기가 조정됩니다.표시하면 240x240으로 렌더링됩니다.

cv2.WINDOW_NORMAL 옵션은 올바르게 작동하지만 창을 처음으로 표준 크기로 표시합니다.

컴퓨터의 다른 창처럼 창의 크기를 조정하는 경우 크기를 조정할 창의 가장자리 위에 마우스를 놓은 다음 원하는 위치로 마우스를 끕니다.원하는 크기로 창의 너비와 높이를 모두 지정할 경우.

다음에 코드를 실행하여 창을 새로 고칠 때 OpenCV는 마지막으로 표시되거나 수정된 시간의 크기로 창을 생성합니다.

이 코드를 사용해 보십시오.

img = cv2.imread("Fab2_0.1 X 1.03MM GRID.jpg", cv2.IMREAD_GRAYSCALE)
image_scale_down = 3
x = (int)(img.shape[0]/image_scale_down)
y = (int)(img.shape[1]/image_scale_down)
image = cv2.resize(img, (x,y))
cv2.imshow("image_title", image)
cv2.waitKey(5000)
cv2.destroyAllWindows()

가장 인기 있는 답변은 완벽합니다! 저는 단지 비율에 따라 "동적인" 크기 조정을 원하는 사람들을 위해 제 코드를 추가할 뿐입니다.

import cv2
from win32api import GetSystemMetrics

def get_resized_for_display_img(img):
    screen_w, screen_h = GetSystemMetrics(0), GetSystemMetrics(1)
    print("screen size",screen_w, screen_h)
    h,w,channel_nbr = img.shape
    # img get w of screen and adapt h
    h = h * (screen_w / w)
    w = screen_w
    if h > screen_h: #if img h still too big
        # img get h of screen and adapt w
        w = w * (screen_h / h)
        h = screen_h
    w, h = w*0.9, h*0.9 # because you don't want it to be that big, right ?
    w, h = int(w), int(h) # you need int for the cv2.resize
    return cv2.resize(img, (w, h))

이 코드를 사용해 보십시오.

img = cv2.resize(img,(1280,800))

다음 코드로 시도:

from PIL import Image

Image.fromarray(image).show()

언급URL : https://stackoverflow.com/questions/35180764/opencv-python-image-too-big-to-display

반응형