Opencv-補間アルゴリズムとplt.imshow()表示

CV基本チーム学習-CVPR-北のほこりと南の風-タスク1

import cv2
import matplotlib.pyplot as plt

中国のディスプレイの問題を解決するための祖先のコード

import matplotlib as mpl
# 排除警告信息
import warnings
# matplotlib画图常见参数设置
mpl.rcParams["font.family"] = "SimHei" 
# 设置字体
mpl.rcParams["axes.unicode_minus"]=False 
# 用来正常显示负号
plt.rcParams['font.sans-serif']=['SimHei'] 
# 用来正常显示中文标签# 嵌入式显示图形
%matplotlib inline
warnings.filterwarnings("ignore")

補間アルゴリズム

  • 画像処理では、超クリア前処理、画像ゴールドタワーなどの後続の処理を容易にするために、画像のサイズを変更する必要があることがよくあります。画像処理には、元の画像の拡大縮小や回転などの操作が含まれます。私の意見では、ここでの差分アルゴリズムは、主に画像のスケーリングとサイズの変更のためのアルゴリズムです。元の画像がサイズ変更された画像にマッピングされると、整数部分間の座標が生成されます。これらの座標のグレー値を設定する方法には、合理的に補間が必要です。ここでは、主に3つの方法があります。
  • 1.最近傍法
  • 2.双線形補間
  • 3.キュービック補間法

1.最近傍法

マップされた座標のグレー値を、元の画像でそれに最も近いピクセルのグレー値に設定します。利点は処理速度が速いことですが、欠点はエイリアスが発生しやすいことです。

#代码实现,利用imread读取图片,opencv读取格式为BGR,与matplotlib读取图片格式为RGB不同,这里显示会有些不同
img=cv2.imread('E:/Machine Learning/OpenCV/task1.jpg',cv2.IMREAD_UNCHANGED)
print('Original Dimensions : ',img.shape)
#最近邻缩小尺寸为原来0.2倍
scale_percent =0.2    
width = int(img.shape[1] * scale_percent)
height = int(img.shape[0] * scale_percent)
dim = (width, height)
img_l = cv2.resize(img, dim, interpolation = cv2.INTER_NEAREST)#选用最近邻
#这里进行放大1.5倍
fx = 1.5
fy = 1.5
# OPenCV中对图像的操作都放在了resize这个函数中
resized_NN = cv2.resize(img,dsize=None, fx=fx, fy=fy,interpolation = cv2.INTER_NEAREST)
#利用plt在线显示图片
plt.figure(1)
plt.imshow(img)
plt.title('原始图')
plt.figure(2)
plt.imshow(img_l)
plt.title('最近邻缩小0.2倍')
plt.figure(3)
plt.imshow(resized_NN)
plt.title('最近邻放大1.5倍')
plt.show()
Original Dimensions :  (300, 535, 3)

元の画像
補間1
ここに写真の説明を挿入

2.双線形補間

  • バイリニア補間法では、決定するピクセルの隣接する4つのピクセルのグレーレベルを使用して、2方向に線形補間を実行します。
    (i、j + v)の場合、f(i、j)からf(i、j) +1)グレースケールの変化は線形であり、次のようになります。

f(i、j + v)= [f(i、j + 1)-f(i、j)] * v + f(i、j)

同じことが(i + 1、j + v)にも当てはまります。

  f(i+1,j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)

f(i、j + v)からf(i + 1、j + v)へのグレースケールの変化も線形関係であり、これから、決定されるピクセルのグレーレベルの計算式は次のように導き出すことができます。

 f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u *(1-v) * f(i+1, j) + u * v * f(i+1, j+1)

バイリニア補間法の計算は、最近傍法より​​も複雑で計算量も多いですが、灰色の不連続性という欠点はなく、基本的には満足のいく結果が得られます。高周波成分を損なうローパスフィルタリング特性があり、画像の輪郭が少しぼやける場合があります。

#OpenCV中双内线插值为INTER_LINEAR
#双内线插值缩小尺寸为原来0.2倍
img_l_2 = cv2.resize(img, dim, interpolation = cv2.INTER_LINEAR)
#这里进行放大1.5倍
fx = 1.5
fy = 1.5
resized_2 = cv2.resize(img,dsize=None, fx=fx, fy=fy,interpolation = cv2.INTER_LINEAR)
#利用plt在线显示图片
plt.figure(1)
plt.imshow(img)
plt.title('原始图')
plt.figure(2)
plt.imshow(img_l_2)
plt.title('双内线插值缩小0.2倍')
plt.figure(3)
plt.imshow(resized_2)
plt.title('双内线插值放大1.5倍')
plt.show()

元の画像
線形縮小
ここに写真の説明を挿入

3.キュービック多項式補間

この方法では、3次多項式S(x)を使用して、理論的に最良の補間関数sin(x)/ xを近似します。

#OpenCV中三次多项式插值为INTER_CUBIC
#三次多项式缩小尺寸为原来0.2倍
img_l_3 = cv2.resize(img, dim, interpolation = cv2.INTER_CUBIC)
#这里进行放大1.5倍
fx = 1.5
fy = 1.5
resized_3 = cv2.resize(img,dsize=None, fx=fx, fy=fy,interpolation = cv2.INTER_CUBIC)
#利用plt在线显示图片
plt.figure(1)
plt.imshow(img)
plt.title('原始图')
plt.figure(2)
plt.imshow(img_l_3)
plt.title('三次多项式插值缩小0.2倍')
plt.figure(3)
plt.imshow(resized_3)
plt.title('三次多项式插值放大1.5倍')
plt.show()

元の画像
キュービック補間削減
キュービック補間ズーム

総括する

補間は画像処理の基本操作であり、一般的な方法としては、近接法、二次線形補間、三次多項式補間などがあります。近接方式は高速ですが、画像を拡大するとギザギザになりがちです。二次線形効果が優れており、3番目の効果が最適ですが、計算速度は遅くなります。
詳細は次のとおりです。
画像サイズ変換関数:
void cvResize(const CvArr
src、CvArr * dst、int補間= CV_INTER_LINEAR);
src入力image.dst出力image.interpolation補間メソッド:

その中で:

  • CV_INTER_NN-最近傍補間、
  • CV_INTER_LINEAR-双線形補間(デフォルトで使用)
  • CV_INTER_AREA-ピクセルリレーションを使用したリサンプリング。画像を縮小すると、波紋の発生を防ぐことができます。画像を拡大すると、CV_INTER_NNメソッドに似ています。
  • CV_INTER_CUBIC-立方体補間。
  • 関数cvResizeは、イメージsrcのサイズをdstと同じサイズに変更します。ROIが設定されている場合、関数は通常どおりROIをサポートします。

おすすめ

転載: blog.csdn.net/hu_hao/article/details/105624868