Jak najít, kde se pixel mapy v cv2.resize?

0

Otázka

Zajímalo mě, vzhledem k tomu, typ interpolace, která se používá pro obraz změní pomocí cv2.změnit velikost. Jak můžu zjistit, kde přesně konkrétní pixel mapy? Například, když jsem zvýšení velikosti obrazu pomocí Linear_interpolation a já si souřadnice (785, 251) pro konkrétní pixel, bez ohledu na to, zda nebo ne poměr stran změny mezi zdrojem obrazu a velikost obrazu, jak bych mohl přesně zjistit, do jaké souřadnice pixel ve zdrojovém obrázku souřadnice s == (785, 251) mapy v změněnou velikostí? Podíval jsem se přes internet na řešení, ale všechna řešení se zdá být nepřímé metody zjistit, kde pixel mapy, které nejsou ve skutečnosti pracovat pro jiný poměr stran je:

https://answers.opencv.org/question/209827/resize-and-remap/

Po změně velikosti obrázku s cv2, jak získat nové vymezovací rámeček koordinovat

Existuje způsob, jak přes cv2 přístup k cesta pixelů jsou mapovány možná a přes zpětný scénář zjistit nové souřadnice?

Důvod, proč bych chtěl, je to, že chci mít možnost vytvořit vymezovací rámeček, že mi vrátí stejné informace bez ohledu na změny v poměru stran daného obrazu. Všechny metody, které jsem použil tak daleko, nedává mi stejné informace. Myslím, že jestli můžu přijít na to, kde konkrétní pixel souřadnice x,y vlevo nahoře a vpravo dole mapy dokážu vytvořit přesný vymezovacího rámečku bez ohledu na poměr stran se změní.

cv2 image-resizing numpy opencv
2021-11-16 12:13:05
1

Nejlepší odpověď

0

Škálování souřadnice funguje při centru souřadnice jsou (0, 0).

Můžete vypočítat x_scaled a y_scaled takto:

  • Odečíst x_original_center a y_original_center z x_original a y_original.
    Poté, odčítání, (0, 0) je "nové centrum".
  • Stupnici "nula střed" souřadnic scale_x a scale_y.
  • Převést "zmenšen žádné střed" souřadnice "v levém horním rohu (0, 0)" přidáním x_scaled_center a y_scaled_center.

Výpočetní centrum přesně:
Python konverze je:
(0, 0) je levý horní, a (cols-1, řádky-1) je vpravo dole koordinovat.
Přesný střed souřadnic je:
x_original_center = (original_rows-1)/2
y_original_center = (original_cols-1)/2


Python kód (předpokládejme img je původní obrázek):

resized_img = cv2.resize(img, [int(cols*scale_x), int(rows*scale_y)])

rows, cols = img.shape[0:2]
resized_rows, resized_cols = resized_img.shape[0:2]

x_original_center = (cols-1) / 2
y_original_center = (rows-1) / 2

x_scaled_center = (resized_cols-1) / 2
y_scaled_center = (resized_rows-1) / 2

# Subtract the center, scale, and add the "scaled center".
x_scaled = (x_original - x_original_center)*scale_x + x_scaled_center
y_scaled = (y_original - y_original_center)*scale_y + y_scaled_center

Testování

Následující ukázka kódu kreslí křížky na několik originálních a měřítko souřadnice:

import cv2

def draw_cross(im, x, y, use_color=False):
    """ Draw a cross with center (x,y) - cross is two rows and two columns """
    x = int(round(x - 0.5))
    y = int(round(y - 0.5))
    if use_color:
        im[y-4:y+6, x] = [0, 0, 255]
        im[y-4:y+6, x+1] = [255, 0, 0]
        im[y, x-4:x+6] = [0, 0, 255]
        im[y+1, x-4:x+6] = [255, 0, 0]
    else:
        im[y-4:y+6, x] = 0
        im[y-4:y+6, x+1] = 255
        im[y, x-4:x+6] = 0
        im[y+1, x-4:x+6] = 255


img = cv2.imread('graf.png')  # http://man.hubwiz.com/docset/OpenCV.docset/Contents/Resources/Documents/db/d70/tutorial_akaze_matching.html
rows, cols = img.shape[0:2]  # cols = 320, rows = 256

# 3 points for testing:
x0_original, y0_original = cols//2-0.5, rows//2-0.5  # 159.5, 127.5
x1_original, y1_original = cols//5-0.5, rows//4-0.5  # 63.5, 63.5
x2_original, y2_original = (cols//5)*3+20-0.5, (rows//4)*3+30-0.5  # 211.5, 221.5
draw_cross(img, x0_original, y0_original)  # Center of cross (159.5, 127.5)
draw_cross(img, x1_original, y1_original)
draw_cross(img, x2_original, y2_original)

scale_x = 2.5
scale_y = 2

resized_img = cv2.resize(img, [int(cols*scale_x), int(rows*scale_y)], interpolation=cv2.INTER_NEAREST)
resized_rows, resized_cols = resized_img.shape[0:2]  # cols = 800, rows = 512

# Compute center column and center row
x_original_center = (cols-1) / 2  # 159.5
y_original_center = (rows-1) / 2  # 127.5

# Compute center of resized image
x_scaled_center = (resized_cols-1) / 2  # 399.5
y_scaled_center = (resized_rows-1) / 2  # 255.5

# Compute the destination coordinates after resize
x0_scaled = (x0_original - x_original_center)*scale_x + x_scaled_center  # 399.5
y0_scaled = (y0_original - y_original_center)*scale_y + y_scaled_center  # 255.5

x1_scaled = (x1_original - x_original_center)*scale_x + x_scaled_center  # 159.5
y1_scaled = (y1_original - y_original_center)*scale_y + y_scaled_center  # 127.5

x2_scaled = (x2_original - x_original_center)*scale_x + x_scaled_center  # 529.5
y2_scaled = (y2_original - y_original_center)*scale_y + y_scaled_center  # 443.5

# Draw crosses on resized image
draw_cross(resized_img, x0_scaled, y0_scaled, True)
draw_cross(resized_img, x1_scaled, y1_scaled, True)
draw_cross(resized_img, x2_scaled, y2_scaled, True)

cv2.imshow('img', img)
cv2.imshow('resized_img', resized_img)
cv2.waitKey()
cv2.destroyAllWindows()

Originální obrázek:
enter image description here

Velikost obrazu:
enter image description here

Ujistěte se, že kříže jsou v souladu:
enter image description here


Poznámka:
Ve své odpovědi byl jsem pomocí konvence pojmenování Miki komentář.

2021-11-16 22:40:43

Ok, budu to vyzkoušet
PeterQuando

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................