OpenCV 入門 (C++/Python) - OpenCV を使用してサイズを調整する (3)

OpenCVを使用した画像のサイズ変更。画像のサイズを変更するには、各軸 (高さと幅) に従って拡大縮小したり、指定された倍率を考慮したり、単に目的の高さと幅を設定したりすることができます。

画像のサイズを変更する場合:

  • サイズ変更した画像でも同じアスペクト比を維持したい場合は、画像の元のアスペクト比 (幅と高さ) に留意することが重要です。
  • 画像のサイズを縮小するには、ピクセルをリサンプリングする必要があります。
  • イメージのサイズを大きくするには、イメージを再構築する必要があります。これは、新しいピクセルを補間する必要があることを意味します。

これらの操作を実行するには、さまざまな補間技術が使用されます。OpenCV ではいくつかの方法が利用できますが、選択は通常、特定のアプリケーションによって異なります。


カスタムの高さと幅でサイズを変更することで、画像をどんどん小さくしていきます。さらに進むにつれて、さまざまなスケール係数と補間方法を使用したサイズ変更について説明します。

1. 画像サイズ情報

パイソン

# let's start with the Imports 
import cv2
import numpy as np
 
# Read the image using imread function
image = cv2.imread('image.jpg')
cv2.imshow('Original Image', image)
 
# let's downscale the image using new  width and height
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)
 
# let's upscale the image using new  width and height
up_width = 600
up_height = 400
up_points = (up_width, up_height)
resized_up = cv2.resize(image, up_points, interpolation= cv2.INTER_LINEAR)
 
# Display images
cv2.imshow('Resized Down by defining height and width', resized_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining height and width', resized_up)
cv2.waitKey()
 
#press any key to close the windows
cv2.destroyAllWindows()

C++

// let's start with including libraries 
#include<opencv2/opencv.hpp>
#include<iostream>
 
// Namespace to nullify use of cv::function(); syntax
using namespace std;
using namespace cv;
 
int main()
{
    
    
  // Read the image using imread function
  Mat image = imread("image.jpg");
  imshow("Original Image", image);
 
 
  // let's downscale the image using new  width and height
  int down_width = 300;
  int down_height = 200;
  Mat resized_down;
  //resize down
  resize(image, resized_down, Size(down_width, down_height), INTER_LINEAR);
  // let's upscale the image using new  width and height
  int up_width = 600;
  int up_height = 400;
  Mat resized_up;
  //resize up
  resize(image, resized_up, Size(up_width, up_height), INTER_LINEAR);
  // Display Images and press any key to continue
  imshow("Resized Down by defining height and width", resized_down);
  waitKey();
  imshow("Resized Up image by defining height and width", resized_up);
  waitKey();
 
 
  destroyAllWindows();
  return 0;
}

画像のサイズ変更を開始する前に、元のサイズを確認してください。画像のサイズを取得するには:

  • Python でのシェイプメソッドの使用
  • C++のrowsパラメータとcolsパラメータ

Python の image.shape は、高さ、幅、チャネル数の 3 つの値を返します。
C++ の場合:

  • image.rows: 画像の高さ
  • image.columns: 画像の幅

上記の結果は、size() 関数を使用して取得することもできます。

  • image.size().width は幅を返します
  • image.size().height は高さを返します

パイソン

# Get original height and width
h,w,c = image.shape
print("Original Height and Width:", h,"x", w)

C++

// Get height and width
cout << "Original Height and Width :" << image.rows << "x" << image.cols << endl;

ここで注意すべき重要な点は、OpenCV では高さ ∗ 幅 ∗ チャネル height*width*channelsが使用されることです。身長_ _ _ _ _w i d th _チャンネル形式は画像形状を出力しますが、他のいくつかの画像処理ライブラリは幅、高さの形式で出力ますこれについては論理的な見解があります。

画像が OpenCV で読み込まれると、NumPy 配列として表されます。一般に、常に行 ∗ 列 行*列を使用します。_ _ _c o l u m n s (高さは行、幅は列) で配列の形状を参照します。したがって、OpenCV を使用して画像を読み取ってその形状を取得する場合でも、同じ NumPy 配列ルールが適用されます。得られる形状は、高さ ∗ 幅 ∗ チャネル 高さ * 幅 * チャネル身長_ _ _ _ _w i d th _チャンネル _ _ _ _ _ _ _

OpenCVのresize()関数の構文

OpenCV Simply() 関数の構文には、次の 2 つの入力パラメータが必要です。

  • ソース画像。
  • サイズ変更後の画像の希望のサイズ、d サイズ。

次のセクションでは、さまざまな入力パラメータ オプションについて説明します。

resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  • src: これは必須の入力画像です。入力画像のパスを含む文字列にすることができます (例: "test_image.png")。
  • dsize: 出力画像の希望のサイズであり、新しい高さと幅にすることができます。
  • fx: 横軸に沿ったスケーリング係数。
  • fy: 縦軸に沿った倍率。
  • 補間: 画像のサイズを変更するさまざまな方法を選択できます。

2.カスタムの幅と高さで画像のサイズを変更します

最初の例では、新しい幅と高さを指定して画像のサイズを変更します。これにより、画像の拡大縮小が縮小されます。次のコードでは次のようになります。

  • 希望の幅を 300 に、希望の高さを 200 に設定します。
  • これら 2 つの値は 2 次元ベクトルに結合されます。これは、resize() 関数が必要とするものです。
  • また、補間方法も指定します。これがデフォルトになります。

パイソン

# Set rows and columns 
# lets downsize the image using new  width and height
down_width = 300
down_height = 200
down_points = (down_width, down_height)
resized_down = cv2.resize(image, down_points, interpolation= cv2.INTER_LINEAR)

C++

// Set rows and columns 
// lets downsize the image using new width and height
   int down_width = 300;
   int down_height = 200;
   Mat resize_down;
 
   // resize down
   resize(image, resize_down, Size(down_width, down_height), INTER_LINEAR);

次に、画像のサイズを増やす別の変数を作成します。
パイソン

# Set rows and columns
up_width = 600
up_height = 400
up_points = (up_width, up_height)
# resize the image
resized_up = cv2.resize(image, up_points, interpolation = cv2.INTER_LINEAR)

C++

// Set rows and columns
int up_width = 600;
int up_height = 400;
Mat resized_up;
//resize up
resize(image, resized_up, Size(up_width, up_height), INTER_LINEAR);

上記の Python コードでは、resize() 関数を使用して画像をアップグレードし、新しい幅と高さを定義しています。プロセスと手順は前のスニペットと似ています。

C++ コードでは次のようになります。

  • アップグレードの幅と高さの新しい整数を定義します。
  • 出力画像の行列を与えます。
  • 次に、前のコードと同じように、resize() 関数を使用します。

ここで、OpenCV の imshow() 関数を使用してすべての画像を表示してみましょう。

パイソン

# Display images
cv2.imshow('Resized Down by defining height and width', resized_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining height and width', resized_up)
cv2.waitKey()
cv2.destroyAllWindows()

C++

// Display Images and press any key to continue
imshow("Resized Down by defining height and width", resized_down);
waitKey();
imshow("Resized Up image by defining height and width", resized_up);
waitKey();
destroyAllWindows();

ここに画像の説明を挿入

3. 倍率を使用して画像のサイズを変更します

次に、倍率を使用して画像のサイズを変更します。ただし、先に進む前に、スケーリング係数とは何かを理解する必要があります。

倍率は通常、一定の量を拡大縮小または乗算する数値であり、画像では、寸法は画像の幅と高さです。スケーリング係数は、アスペクト比を維持し、表示品質を維持するのに役立ちます。したがって、画像を拡大または縮小しても、画像が歪んで見えることはありません。

パイソン

# Scaling Up the image 1.2 times by specifying both scaling factors
scale_up_x = 1.2
scale_up_y = 1.2
# Scaling Down the image 0.6 times specifying a single scale factor.
scale_down = 0.6
 
scaled_f_down = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
scaled_f_up = cv2.resize(image, None, fx= scale_up_x, fy= scale_up_y, interpolation= cv2.INTER_LINEAR)

C++

// Scaling Up the image 1.2 times by specifying both scaling factors
double scale_up_x = 1.2;
double scale_up_y = 1.2;
// Scaling Down the image 0.6 times specifying a single scale factor.
double scale_down = 0.6;
Mat scaled_f_up, scaled_f_down;
//resize 
resize(image,scaled_f_down, Size(), scale_down, scale_down, INTER_LINEAR);
resize(image, scaled_f_up, Size(), scale_up_x, scale_up_y, INTER_LINEAR);

上記の Python コードでは次のようになります。

  • 横軸と縦軸に沿って新しいスケーリング係数を定義します。
  • 倍率を定義します。新しい画像の幅と高さを追加する必要はありません。したがって、値は None になります。

上記の C++ コードでは次のようになります。

  • 新しい画像の行列だけでなく、新しい倍率も定義します。
  • 新しい幅と高さのポイントは必要ないので、Size() を空のままにして、resize() 関数を使用します。

ここで、視覚化して理解を深めるために画像を示してみましょう。
パイソン

# Display images and press any key to check next image
cv2.imshow('Resized Down by defining scaling factor', scaled_f_down)
cv2.waitKey()
cv2.imshow('Resized Up image by defining scaling factor', scaled_f_up)
cv2.waitKey()

C++

// Display images and Press any key to continue check next image
imshow("Resized Down by defining scaling factor", scaled_f_down);
waitKey();
imshow("Resized Up by defining scaling factor", scaled_f_up);
waitKey();

ここに画像の説明を挿入
左の画像は縮小バージョン、右の画像は拡大バージョンです。

4. さまざまな補間方法を使用してサイズを変更する

異なる次元をスケーリングするには、異なる補間方法が使用されます。

  • INTER_AREA : INTER_AREA は、リサンプリングにピクセル領域の関係を使用します。これは、画像のサイズを縮小する (ズームアウトする) 場合に最適です。画像を拡大するために使用される場合は、INTER_NEAREST メソッドが使用されます。
  • INTER_CUBIC : バイキュービック補間を使用して画像のサイズを変更します。このメソッドは、新しいピクセルのサイズ変更と補間を行うときに、画像の 4×4 の隣接ピクセルに作用します。次に、新しい補間ピクセルを作成するには、平均 16 ピクセルの重みが必要です。
  • INTER_LINEAR : この方法は、INTER_CUBIC 補間と似ています。ただし、INTER_CUBIC とは異なり、これは 2×2 の隣接ピクセルを使用して、補間ピクセルの加重平均を取得します。
  • INTER_NEAREST : INTER_NEAREST メソッドは、補間に最近傍概念を使用します。これは最も簡単な方法の 1 つで、画像内の隣接ピクセルを 1 つだけ使用して補間します。

補間方法がよくわからなくても心配する必要はありません。それらについては別の例で説明します。

パイソン

# Scaling Down the image 0.6 times using different Interpolation Method
res_inter_nearest = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_NEAREST)
res_inter_linear = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_LINEAR)
res_inter_area = cv2.resize(image, None, fx= scale_down, fy= scale_down, interpolation= cv2.INTER_AREA)

C++

# Scaling Down the image 0.6 using different Interpolation Method
Mat res_inter_linear, res_inter_nearest, res_inter_area;
resize(image, res_inter_linear, Size(), scale_down, scale_down, INTER_LINEAR);
resize(image, res_inter_nearest, Size(), scale_down, scale_down, INTER_NEAREST);
resize(image, res_inter_area, Size(), scale_down, scale_down, INTER_AREA);

上記の Python スニペットでは、さまざまな補間方法を使用して画像のサイズを変更しています。また、C++ スニペットでは、最初に出力イメージの新しい行列を定義し、次にさまざまな補間方法を使用してそれらのサイズを変更します。では、画像を表示してみましょう。

パイソン

# Concatenate images in horizontal axis for comparison
vertical= np.concatenate((res_inter_nearest, res_inter_linear, res_inter_area), axis = 0)
# Display the image Press any key to continue
cv2.imshow('Inter Nearest :: Inter Linear :: Inter Area', vertical)

C++

Mat a,b,c;
vconcat(res_inter_linear, res_inter_nearest, a);
vconcat(res_inter_area, res_inter_area, b);
vconcat(a, b, c);
// Display the image Press any key to continue
imshow("Inter Linear :: Inter Nearest :: Inter Area :: Inter Area", c);

ここに画像の説明を挿入
左側がINTER_LINEAR、中央がINTER_NEAREST、右側がINTER_AREA

おすすめ

転載: blog.csdn.net/weixin_42010722/article/details/128181554