4. opencv-python画像処理の応用操作(1) - 幾何変換

幾何学的変換

学習内容:

マスター画像のスケーリング、移動、回転
デジタル画像のアフィン変換と射影変換を理解する

主に画像のセット変換について書いています。

1. 画像の拡大縮小

ズームとは画像のサイズを調整すること、つまり画像のサイズを拡大または縮小することです。

1、API

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

パラメータ:
src: 入力画像
dsize: 絶対サイズ、調整画像のサイズを直接指定
fx、fy: 相対サイズ、dsize を None に設定し、スケール係数として fx と fy を設定
interpolation: 補間方法、

2. サンプルコード

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()

ここで自分の写真を使って自由に試してみてください。

2. 画像翻訳

画像の移動は、指定された方向と距離に従って、画像を対応する位置に移動します。

1、API

cv.warpAffine(img,M,dsize)

パラメータ:
img: 入力画像
M: 2**3 移動行列
(x, y) のピクセルを (x+tx, y+ty) に移動したい場合、M 行列を設定する必要があります注ここに画像の説明を挿入します
: MM を np.float32 型の Numpy 配列に設定します。
dsize: 出力画像のサイズ

2. 例

画像のピクセルを (50,100) の距離だけ移動したい場合は、まず画像を分析して、画像を右下隅に移動する必要があります。最初にその効果を想像できます。

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()

レンダリングは含めません。コードは正常に実行できる必要があります。

3. 画像の回転

画像の回転とは、特定の位置に応じて特定の角度で画像を回転する処理を指し、回転中も画像は元のサイズを維持します。画像を回転すると、画像の水平対称軸、垂直対称軸、中心座標原点が変換される場合があるため、それに応じて画像回転時の座標も変換する必要があります。
では、画像を回転するにはどうすればよいでしょうか? ? 以下の図に示すように、
ここに画像の説明を挿入します
画像が反時計回りに θ 回転すると仮定すると、回転変換は
ここに画像の説明を挿入します
次の座標変換に従って取得できます。
ここに画像の説明を挿入します

1、API

cv2.getRotationMatrix2D(center, angle, scale)

パラメータ:
center: 回転中心
angle: 回転角度
scale: スケーリング比
Return:
M: 回転行列
cv.warpAffine を呼び出して画像の回転を完了します.
最後に、回転行列 M は API を通じて生成でき、その後、他の操作が可能です回転行列 M を通じて実行されます。

2. 例

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. 得られる可視化効果

ここに画像の説明を挿入します

4. アフィン変換

画像のアフィン変換は、画像の形状、位置、角度の変更を伴います。これはディープラーニングの前処理で一般的な機能です。アフィン変換は、主に画像の拡大縮小、回転、反転、平行移動などの操作の組み合わせです。 。
では、画像のアフィン変換とは何でしょうか? 以下の図に示すように、図 1 の点 1、2、および 3 が、図 2 の 3 つの点に 1 つずつマッピングされます。これら 2 つの 3 つの点 (注目点) のグループを通じてアフィン変換を見つけ、画像内のすべての点にアフィン変換を適用することで、画像のアフィン変換が完了します。
ここに画像の説明を挿入します
アフィン変換では、元のイメージ内のすべての平行線が、結果のイメージ内で等しく平行になります。この行列を作成するには、元の画像から 3 つの点と出力画像内のそれらの位置を見つける必要があります。次に、cv2.getAffineTransform は 2x3 行列を作成し、最後にこの行列は関数 cv2.warpAffine に渡されます。

1. 例

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. 送信変換

1. 伝送変換の概要

透過変換とは視野角の変化によるもので、視点中心、像点、目標点が同一線上にあるという条件を利用し、透視回転の法則に従って像面(透視面)を回転させることを指します。トレース ライン (透視軸) を中心に特定の角度で元の投影光ビームを破壊しても、支持面上の投影ジオメトリは変更されずに変換できます。
ここに画像の説明を挿入します
その本質は画像を新しい平面に投影することであり、その一般的な変換式は次のとおりです。
ここに画像の説明を挿入します
(u, v) は元の画像のピクセル座標、w は値 1 をとります、(x=x'/z',y=y) '/z') は透過変換の結果です。後者の行列は透視変換行列と呼ばれ、一般に 3 つの部分に分けられます:
ここに画像の説明を挿入します
そのうち、T1 は画像の線形変換を表し、T2 は画像の平行移動を表し、T3 は画像の射影変換を表し、 a22
一般的には1です。

opencv では、4 つの点を見つけて、そのうちの 3 つが同一線上にないことを確認し、変換行列 T を取得して、透過変換を実行する必要があります。関数 cv.getPerspectiveTransform を通じて変換行列を見つけ、この 3x3 変換行列に cv.warpPerspective を適用します。

2. 例

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. イメージピラミッド

1 はじめに

画像ピラミッドは、画像のマルチスケール表現の一種で、主に画像のセグメンテーションに使用され、複数の解像度で画像を説明する概念的に単純な構造です。
マシン ビジョンや画像圧縮で使用されます。画像のピラミッドは、同じ元の画像から派生した、徐々に解像度が低下する画像をピラミッド状に並べたものです。ラダーダウンサンプリングにより取得され、一定の終了条件に達するまでサンプリングは停止されません。

ピラミッドの底部は処理対象の画像の高解像度表現、上部は低解像度の近似値であり、レベルが高くなるほど画像が小さくなり、解像度が低くなります。
ここに画像の説明を挿入します

2、API

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

3. 例

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()

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_44463519/article/details/125907709