4. Erweiterte Operationen der OpenCV-Python-Bildverarbeitung (1) – Geometrische Transformation

geometrische Transformation

Lerninhalte:

Master-Bildskalierung, -Übersetzung und -Rotation
Verstehen Sie affine und projektive Transformationen digitaler Bilder

Hauptsächlich über die Mengentransformation von Bildern geschrieben.

1. Bildskalierung

Beim Zoomen wird die Größe des Bildes angepasst, also das Bild vergrößert oder verkleinert.

1、API

cv2.resize(src,dsize,fx=0,fy=0,interpolation=cv2.INTER_LINEAR)

Parameter:
src: Eingabebild
dsize: absolute Größe, geben Sie direkt die Größe des angepassten Bildes an
fx, fy: relative Größe, setzen Sie dsize auf „Keine“ und legen Sie dann fx und fy als Skalierungsfaktoren fest
interpolation: Interpolationsmethode,

2. Beispielcode

import cv2 as cv
# 1. 读取图片
img1 = cv.imread("./image/dog.jpeg")
# 2.图像缩放
# 2.1 绝对尺寸
rows,cols = img1.shape[:2]
res = cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)

# 2.2 相对尺寸
res1 = cv.resize(img1,None,fx=0.5,fy=0.5)

# 3 图像显示
# 3.1 使用opencv显示图像(不推荐)
cv.imshow("orignal",img1)
cv.imshow("enlarge",res)
cv.imshow("shrink)",res1)
cv.waitKey(0)

# 3.2 使用matplotlib显示图像
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(res[:,:,::-1])
axes[0].set_title("绝对尺度(放大)")
axes[1].imshow(img1[:,:,::-1])
axes[1].set_title("原图")
axes[2].imshow(res1[:,:,::-1])
axes[2].set_title("相对尺度(缩小)")
plt.show()

Probieren Sie es hier gerne mit Ihren eigenen Bildern aus.

2. Bildübersetzung

Durch die Bildübersetzung wird das Bild entsprechend der angegebenen Richtung und Entfernung an die entsprechende Position verschoben.

1、API

cv.warpAffine(img,M,dsize)

Parameter:
img: Eingabebild
M: 2**3-Bewegungsmatrix.
Wenn Sie das Pixel bei (x, y) nach (x+tx, y+ty)​​ verschieben möchten, sollte die M-Matrix festgelegt werden wie folgt: Fügen Sie hier eine Bildbeschreibung ein
Hinweis: Legen Sie MM auf ein Numpy-Array vom Typ np.float32 fest.
dsize: Größe des Ausgabebildes

2. Beispiel

Wenn Sie die Pixel des Bildes um einen Abstand von (50.100) verschieben möchten, analysieren Sie es zunächst. Das Bild sollte in die untere rechte Ecke verschoben werden. Sie können sich zunächst den Effekt vorstellen.

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1. 读取图像
img1 = cv.imread("./image/image2.jpg")

# 2. 图像平移
rows,cols = img1.shape[:2]
M = M = np.float32([[1,0,100],[0,1,50]])# 平移矩阵
dst = cv.warpAffine(img1,M,(cols,rows)) # 这里的宽高仍然是原有宽高

# 3. 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("平移后结果")
plt.show()

Ich werde die Renderings nicht einbeziehen, der Code muss erfolgreich ausgeführt werden können.

3. Bilddrehung

Unter Bilddrehung versteht man den Vorgang, bei dem ein Bild entsprechend einer bestimmten Position um einen bestimmten Winkel gedreht wird. Das Bild behält während der Drehung weiterhin seine ursprüngliche Größe. Nachdem das Bild gedreht wurde, können die horizontale Symmetrieachse, die vertikale Symmetrieachse und der zentrale Koordinatenursprung des Bildes transformiert werden, sodass die Koordinaten bei der Bildrotation entsprechend umgewandelt werden müssen.
Wie dreht man das Bild? ? Wie in der folgenden Abbildung dargestellt:
Fügen Sie hier eine Bildbeschreibung ein
Unter der Annahme, dass das Bild um θ gegen den Uhrzeigersinn gedreht wird, kann die Rotationstransformation gemäß der Koordinatentransformation erhalten werden:
Fügen Sie hier eine Bildbeschreibung ein
wobei:
Fügen Sie hier eine Bildbeschreibung ein

1、API

cv2.getRotationMatrix2D(center, angle, scale)

Parameter:
Zentrum: Rotationszentrumswinkel
: Rotationswinkelskala
: Skalierungsverhältnis
Rückgabe:
M: Rotationsmatrix
Rufen Sie cv.warpAffine auf, um die Rotation des Bildes abzuschließen.
Schließlich kann die Rotationsmatrix M über die API generiert werden, und dann können andere Operationen ausgeführt werden durch die Rotationsmatrix M durchgeführt werden.

2. Beispiel

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread("./image/image2.jpg")

# 2 图像旋转
rows,cols = img.shape[:2]
# 2.1 生成旋转矩阵
M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
# 2.2 进行旋转变换
dst = cv.warpAffine(img,M,(cols,rows))

# 3 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img1[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("旋转后结果")
plt.show()

3. Der erzielte Visualisierungseffekt

Fügen Sie hier eine Bildbeschreibung ein

4. Affine Transformation

Die affine Transformation eines Bildes beinhaltet Änderungen in Form, Position und Winkel des Bildes. Dies ist eine häufige Funktion bei der Deep-Learning-Vorverarbeitung. Die affine Transformation ist hauptsächlich eine Kombination von Vorgängen wie Skalierung, Drehung, Spiegelung und Übersetzung des Bildes .
Was ist also die affine Transformation des Bildes? Wie in der folgenden Abbildung gezeigt, werden die Punkte 1, 2 und 3 in Abbildung 1 nacheinander den drei Punkten in Abbildung 2 zugeordnet. Sie bilden immer noch ein Dreieck, aber die Form wurde geändert stark verändert. Durch diese beiden Gruppen von drei Punkten (Points of Interest) finden Sie die affine Transformation. Als nächstes können wir die affine Transformation auf alle Punkte im Bild anwenden und so die affine Transformation des Bildes abschließen.
Fügen Sie hier eine Bildbeschreibung ein
Bei einer affinen Transformation sind alle parallelen Linien im Originalbild im resultierenden Bild gleich parallel. Um diese Matrix zu erstellen, müssen wir drei Punkte aus dem Originalbild und ihre Positionen im Ausgabebild finden. Dann erstellt cv2.getAffineTransform eine 2x3-Matrix und schließlich wird diese Matrix an die Funktion cv2.warpAffine übergeben.

1. Beispiel

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 图像读取
img = cv.imread("./image/image2.jpg")

# 2 仿射变换
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[100,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
# 2.2 完成仿射变换
dst = cv.warpAffine(img,M,(cols,rows))

# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("仿射后结果")
plt.show()

5. Übertragungstransformation

1. Einführung in die Übertragungstransformation

Die Übertragungstransformation ist das Ergebnis einer Änderung des Betrachtungswinkels. Sie bezieht sich auf die Verwendung der Bedingung, dass das perspektivische Zentrum, der Bildpunkt und der Zielpunkt kollinear sind, und gemäß dem Gesetz der perspektivischen Drehung, um die bildtragende Oberfläche (perspektivische Oberfläche) zu drehen. in einem bestimmten Winkel um die Spurlinie (Perspektivachse). Durch die Zerstörung des ursprünglichen Projektionslichtstrahls kann die Projektionsgeometrie auf der Trägerfläche unverändert verändert werden.
Fügen Sie hier eine Bildbeschreibung ein
Sein Wesen besteht darin, das Bild auf eine neue Ebene zu projizieren, und seine allgemeine Transformationsformel lautet:
Fügen Sie hier eine Bildbeschreibung ein
wobei (u, v) die ursprünglichen Bildpixelkoordinaten sind, w den Wert 1 annimmt, (x=x'/z', y=y). '/z') ist das Ergebnis der Übertragungstransformation. Die letztere Matrix wird als perspektivische Transformationsmatrix bezeichnet. Im Allgemeinen unterteilen wir sie in drei Teile:
Fügen Sie hier eine Bildbeschreibung ein
Darunter: T1 repräsentiert die lineare Transformation des Bildes, T2 repräsentiert die Translation des Bildes, T3 repräsentiert die Projektionstransformation des Bildes, a22
​​​​ Ist im Allgemeinen 1.

In opencv müssen wir vier Punkte finden, von denen drei nicht kollinear sind, dann die Transformationsmatrix T erhalten und dann eine Übertragungstransformation durchführen. Suchen Sie die Transformationsmatrix über die Funktion cv.getPerspectiveTransform und wenden Sie cv.warpPerspective auf diese 3x3-Transformationsmatrix an.

2. Beispiel

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread("./image/image2.jpg")
# 2 透射变换
rows,cols = img.shape[:2]
# 2.1 创建变换矩阵
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[100,145],[300,100],[80,290],[310,300]])

T = cv.getPerspectiveTransform(pts1,pts2)
# 2.2 进行变换
dst = cv.warpPerspective(img,T,(cols,rows))

# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:,:,::-1])
axes[1].set_title("透射后结果")
plt.show()

6. Bildpyramide

1. Einleitung

Die Bildpyramide ist eine Art mehrskaliger Ausdruck von Bildern. Sie wird hauptsächlich zur Bildsegmentierung verwendet. Es handelt sich um eine konzeptionell einfache Struktur, die Bilder mit mehreren Auflösungen erklärt.
Es wird in der Bildverarbeitung und Bildkomprimierung verwendet. Die Pyramide eines Bildes ist eine Sammlung von Bildern mit allmählich abnehmender Auflösung, die in Pyramidenform angeordnet sind und vom gleichen Originalbild abgeleitet sind. Es wird durch Ladder-Down-Sampling ermittelt und das Sampling wird erst dann gestoppt, wenn eine bestimmte Beendigungsbedingung erreicht ist.

Die Basis der Pyramide stellt eine hochauflösende Darstellung des zu verarbeitenden Bildes dar, während die Spitze eine Näherung mit niedriger Auflösung darstellt. Je höher die Ebene, desto kleiner das Bild und desto geringer die Auflösung.
Fügen Sie hier eine Bildbeschreibung ein

2、API

cv.pyrUp(img)       #对图像进行上采样
cv.pyrDown(img)        #对图像进行下采样

3. Beispiel

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 图像读取
img = cv.imread("./image/image2.jpg")
# 2 进行图像采样
up_img = cv.pyrUp(img)  # 上采样操作
img_1 = cv.pyrDown(img)  # 下采样操作
# 3 图像显示
cv.imshow('enlarge', up_img)
cv.imshow('original', img)
cv.imshow('shrink', img_1)
cv.waitKey(0)
cv.destroyAllWindows()

Fügen Sie hier eine Bildbeschreibung ein

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44463519/article/details/125907709
conseillé
Classement