コンピューター ビジョンの世界へ - デジタル画像 + 補間アルゴリズム + ヒストグラム + 畳み込みとフィルター処理

コンピューター ビジョンの世界へ - デジタル画像 + 補間アルゴリズム + ヒストグラム + 畳み込みとフィルター処理

1. デジタル画像

1.1 画像の基本

画像に関してよく聞くのは画像のピクセルですが、ピクセルとは一体何でしょうか? その値は何を意味するのでしょうか? この記事を通じて、コンピュータ ビジョンに関するいくつかの用語を大まかに理解し、頭にコンピュータ ビジョンの印象を残すことで、継続的な学習を促進することができます。

デジタル画像: コンピューターによって保存された画像は本質的にピクセルであり、これらのピクセルはデジタル画像と呼ばれます。

1.1.1 ピクセル、グレースケール、コントラスト

ピクセル、非常に単純ですが重要な語彙です。ピクセルは解像度の単位であり、ビットマップ画像の最も基本的な単位です。各ピクセルは独自の色を持ち、これら 1 つずつピクセルがさまざまな画像を構成し、レートとも呼ばれます。画像の解像度は、インチ単位のピクセル数 (単位は PPI) であり、PPI は 1 インチあたりの対角線上のピクセル数を示します。

画像については、グレースケール、チャネル、コントラストという 3 つの非常に重要な用語があります。

グレースケールは画像ピクセルの明るさと暗さの値、つまり白黒画像の中点の色の深さを表します。グレースケール画像はどのようにして得られるのでしょうか? 画像のチャネル (画像を 1 つ以上の色成分に分解するカラー チャネル) を変更することで、黒、白、グレーの視覚効果を示します。

  • 単一チャネル: ピクセルに必要な数値表現は 1 つだけで、グレースケールのみを表現できます (0 は黒、255 は白)。

  • 3 チャンネル: RGB モードとも呼ばれ、画像は色を表現できる赤、緑、青の 3 つのチャンネルに分割されます。

  • 4 つのチャネル: 3 つのチャネル RGB に基づいて透明度アルファ チャネルを追加します。0 の場合、完全な透明度を意味します。

コントラストもデジタル画像では非常に重要な概念です。異なる色の違いを指します。コントラスト = 最大グレー値/最小グレー値

カラー チャネルとは何かを理解した後、最も一般的に使用される RGB モデルの 1 つについても詳しく調べる必要があります。色の 3 原色とは、マゼンタ + イエロー + シアンを指します。RGB モデルの 3 つの色とは、赤+緑+青を含む光学三原色について話します

1.1.2 RGBカラーモデル

RGBカラーモデル

RGB カラーモデルとは、3 次元直交座標系表色系の単位立方体を指し、立方体の対角線上では各原色の量が等しく、暗いところから明るいところまで白、つまりグレースケールを生成します。立方体の他の 6 つの角 点は赤、黄、緑、シアン、マゼンタです

RGB 値は浮動小数点数に変換されます。浮動小数点計算の結果はより正確ですが、整数計算中に小数部分が失われるため、カラー値が著しく歪む可能性があります。

:カラーモード RBG に関しては、OpenCV には大きな穴があり、OpenCV の読み込む画像のチャンネル配置は RGB ではなく BGR になります。

# 由于在OpenCV中使用imread()方法读入的图像是BGR通道,我们怎么把它转为RGB通道
img = cv.imread('test.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

1.1.3 頻度と割り当て

画像の周波数振幅も、一般的に使用される 2 つの概念です。いわゆる周波数は、平面空間内のグレー レベルの勾配であるグレー値の変化の強さを指します。振幅は 1 以内です。最大絶対値 1 が表示されますが、これも正弦波であり、ピークから谷までの距離は一般的に

1.2 画像のサンプリングと量子化

コンピューターで保存された画像は 1 つずつ保存されており、そのピクセルがデジタル画像であると前述しましたが、画像をデジタル化する、つまり 1 つずつピクセルに変換するには、画像のサンプリングと量子化が必要です。

サンプリング: 画像を記述するために使用されるポイントの数。サンプリング結果の品質は画像の解像度によって測定されます。

量子化: 画像サンプリング後の点を表すために使用される値の範囲を指します。

数値化された座標値をサンプリングといい、数値化された大きさを量子化といいます。

いわゆるアップサンプリングとダウンサンプリングは、画像を縮小したり拡大したりすると言われています。

ダウンサンプリング(画像の縮小)は、画像を表示領域のサイズに合わせたり、対応する画像のサムネイルを生成することを目的とし、アップサンプリング(拡大画像/画像補間)は、元の画像を拡大して表示できるようにすることを主な目的としています。より高解像度の表示デバイスで表示される

2. 補間アルゴリズム

補間とは例えば100枚の画像を拡大したい場合、単純に画像を引き伸ばすだけでは画像の解像度が下がってしまいますが、解像度を落とさない、あるいは落とさないようにするにはどうすればよいでしょうか? 次に、新しいピクセルを挿入する必要があるため、100 ピクセルの画像が 10 倍に拡大され、1000 ピクセルになり、歪みと解像度の低下の問題が解決されます。ピクセル値と補間方法は? これが私たちの補間アルゴリズムが行うことです。ここでは、一般的に使用されるいくつかの補間方法を紹介します。

2.1 最も近い補間 最も近い補間

最近傍補間アルゴリズムの本質を説明するために例を使用します。たとえば、拡大する必要がある画像 img1 の左上隅には 4 つの隣接するピクセルがあります。画像を拡大した後、いくつかの新しいピクセルを追加する必要があります。これら 4 つのピクセルの間。これらの新しいポイントのピクセル値の決定は、それが属する位置によって異なります。

求める画素の座標を i+u, j+v (i, j は正の整数、u, v は 0 以上 1 未満の小数、以下同じ) とすると、値 f(i+ u 、j+v) の位置に応じて

最近傍補間アルゴリズムのコード実装については、タップして理解しましょう たとえば、元の 400 * 400 の画像を 800 * 800 に拡大すると、余分なピクセルは最近傍補間アルゴリズムによって補完されます。

import cv2
import numpy as np
# 定义一个函数,用来实现算法
def function(img):
    # 这三个值分别是高、宽和通道数(ing.shape返回的是一个三元组的值)
    height,width,channels =img.shape
    emptyImage=np.zeros((800,800,channels),np.uint8)
    sh=800/height
    sw=800/width
    for i in range(800):
        for j in range(800):
            x=int(i/sh)
            y=int(j/sw)
            emptyImage[i,j]=img[x,y]
    return emptyImage
 
img=cv2.imread("lenna.png")
zoom=function(img)
print(zoom)
print(zoom.shape)
cv2.imshow("nearest interp",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

コード分​​析: Python では、画像処理のためにいくつかの代表的なサードパーティ ライブラリ numpy、matplotlib、opencv-python を知る必要があります。これらは、操作を実現するのに役立つ多くのメソッドを提供します。np.zeros() は、numpy によって提供されるメソッドです指定された形状と 0 で満たされた型の配列を返します。画像処理では、空のキャンバスを作成することがわかります。このキャンバスは、この例で使用されます。サイズは 800x800 で、ピクセルで塗りつぶされます。それはデジタル画像になり、それを表示するとメソッド画像の要件が満たされます。

2 つのネストされた for ループ (画像は 2 次元) が補間のキー コードです。800x800 の各ピクセルを順番に走査します。では、この点にどの値を入力するかをどのように決定すればよいでしょうか? この値の決定は、その位置によって決定されると上で述べました。つまり、その位置を決定するには、800x800 の画像を 400x400 の画像に戻す必要があります。7 行目と 8 行目で、ズーム率を取得するには、12 行目と 13 行目でこの比率を使用します。つまり、大きい画像のピクセル位置を使用してこの比率を削除し、小さい画像内のこの点の位置を取得し、それを int 型に変換します。元の画像と同じである 特定の座標のピクセル値が維持されるため、新しいピクセルを割り当てる操作が実現されます

2.2 双一次補間

双線形補間を学ぶ前に、単線形補間について見てみましょう。単線形補間のプロセスでは 2 点の座標がわかります。これは、これら 2 点を通る直線の方程式を求めるのと同じです。この線分上のすべての点の座標を取得できます。

スケール変換: y = [(x1-x)/(x1-x0) ]*y0 + [(x-x0)/(x1-x0)]y1

双一次補間は、実際には 2 つの単一線形補間です。

[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-10DTbxAI-1649816773458)(OpenCV%E7%AC%94%E8%AE%) B0/image-20220412130627741.png )]

具体的なプロセス: Q12 と Q22 から単一の線形補間を実行して R2 を取得し、次に同じ方法を使用して Q11 と Q21 から R1 を取得し、R1 と R2 を取得して、これら 2 つの点で単一の線形補間を実行して P を取得します。必要な点を指定し、最近傍補間を使用して P ピクセルの値を決定します。

このアルゴリズムの実装プロセスを上記のコードで感じてみましょう

import numpy as np
import cv2
  
'''
python implementation of bilinear interpolation
'''
def bilinear_interpolation(img,out_dim):
    src_h, src_w, channel = img.shape
    dst_h, dst_w = out_dim[1], out_dim[0]
    print ("src_h, src_w = ", src_h, src_w)
    print ("dst_h, dst_w = ", dst_h, dst_w)
    if src_h == dst_h and src_w == dst_w:
        return img.copy()
    dst_img = np.zeros((dst_h,dst_w,3),dtype=np.uint8)
    scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_h
    for i in range(3):
        for dst_y in range(dst_h):
            for dst_x in range(dst_w):
  
                # find the origin x and y coordinates of dst image x and y
                # use geometric center symmetry
                # if use direct way, src_x = dst_x * scale_x
                src_x = (dst_x + 0.5) * scale_x-0.5
                src_y = (dst_y + 0.5) * scale_y-0.5
  
                # find the coordinates of the points which will be used to compute the interpolation
                src_x0 = int(np.floor(src_x))
                src_x1 = min(src_x0 + 1 ,src_w - 1)
                src_y0 = int(np.floor(src_y))
                src_y1 = min(src_y0 + 1, src_h - 1)
  
                # calculate the interpolation
                temp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i]
                temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i]
                dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)
  
    return dst_img
  
  
if __name__ == '__main__':
    img = cv2.imread('lenna.png')
    dst = bilinear_interpolation(img,(700,700))
    cv2.imshow('bilinear interp',dst)
    cv2.waitKey()

バイリニア補間法の計算は最近傍補間法よりも複雑で、計算量も非常に多くなりますが、グレースケールの不連続性の欠点がなく、画像がより滑らかに見えます。

共一次補間に関する問題- 座標系の選択

ソース イメージとターゲット イメージの原点 (0, 0) が左上隅で選択されている場合、5x5 のイメージを 3x3 に縮小する必要があると仮定して、補間式に従ってターゲット イメージの各ピクセルを計算します。ソース画像とターゲット画像の各ピクセルの対応は次のとおりです。

ここに画像の説明を挿入

この方法で得られた結果には一定の誤差が生じるため、すべての点が計算に参加するように、座標系の選択を変更する必要があります。つまり、幾何学的中心を一致させる (すべての座標に 0.5 を加算する) 必要があります。

3. ヒストグラム、フィルタリング、コンボリューション

3.1 ヒストグラム

3.1.1 ヒストグラム、その特性、および応用について理解する

ヒストグラムも画像処理において非常に重要な概念です. グレースケール ヒストグラムは画像内のグレースケールの分布を表し, 画像内の各グレースケール レベルの割合を直感的に示すことができます. 一般的に言えば,それはグレー レベルの関数であり,画像内の特定のグレー レベルを持つピクセルの数を表します。横軸はグレー レベル、縦軸はグレー レベルの周波数です。

ヒストグラムについては誰もが誤解しがちですが、ピクセルの空間的位置とヒストグラムの間にどのような関係があるのか​​が明確ではなく、両者の間には 1 つの関係しかなく、関係はありません。画像ヒストグラムはピクセルの空間的位置を考慮しないため、画像の回転や平行移動の変化の影響を受けず、画像の特徴として使用できます。

特定の画像は一意のヒストグラムに対応しますが、異なる画像も同じヒストグラムを持つ可能性があります。画像が 2 つの互いに素な領域で構成され、各領域のヒストグラムが既知である場合、画像全体のヒストグラムは、次のヒストグラムの合計になります。二つの地域

ヒストグラムの応用:ヒストグラムを通じて画像全体の明暗の概要を把握することができます。

ここに画像の説明を挿入

3.1.1 ヒストグラムの等化

ヒストグラム等化は、変換関数を通じて元の画像のヒストグラムを均一なヒストグラムに変更し、均一なヒストグラムに従って元の画像を変更して、均一なグレー分布を持つ新しい画像を取得します。ある ヒストグラムをほぼ平坦にするアルゴリズムで、画像を強調する(コントラストを高める)役割があります。

ピクセル値が不均一に分布している画像を、ピクセル値が比較的均一に分布している画像に変換します

元の画像の明るさの範囲を拡大するには、元の画像のピクセル値を新しいヒストグラムに均等にマッピングするマッピング関数が必要です。このマッピング関数には 2 つの条件があります。マッピング後の順序 明暗の大小関係は変更できません; 2. マッピング後の画像のピクセル値は元の範囲内にある必要があります。

イコライゼーション アルゴリズムには、いくつかの主要な手順があります。

  1. 元のグレースケール画像の各ピクセルを順番にスキャンして、画像のグレースケール ヒストグラムを計算します。
  2. グレースケールヒストグラムの累積ヒストグラムを計算します
  3. 累積ヒストグラムとヒストグラム等化の原理に従って、入力と出力の間のマッピング関係が得られます。
  4. 最後に、マッピング関係に従って結果が得られます: dst(x,y) = H'(src(x,y)) 画像変換

イコライゼーションプロセスの詳細な説明:

ここに画像の説明を挿入


ここに画像の説明を挿入

実際の開発ではopencvインターフェースを使用できますが、ヒストグラム等化のプロセスを理解する必要があります。

3.2 フィルタリングと畳み込み

3.2.1 フィルタリングと畳み込みの基本原理

線形フィルタリングは、画像処理の最も基本的な方法と言えます。これにより、画像を処理してさまざまな効果を生み出すことができます。コンボリューションの原理はフィルタリングと似ていますが、コンボリューションには小さな違いがあります。コンボリューション演算もコンボリューション カーネルです画像に対応する位置の乗算合計ですが、畳み込み演算では、乗算を行う前に畳み込みカーネルを 180 度反転する必要があります (畳み込みは記号 * で表されます)。

ここに画像の説明を挿入

畳み込みとフィルタリングは 2 つの異なる概念です。畳み込みがフィルタリングから派生するという意味ではありません。この 2 つは使用される時点ですでに最終的な形式になっています。追加の操作は必要ありません。フィルタリングと畳み込みが変換される場合のみ、操作中に、 180度反転するコンボリューションカーネルが追加されます

3.2.2 コンボリューション - フィルター/コンボリューション カーネル (カーネル)

コンボリューション カーネルは、入力画像が与えられた画像が処理されるときに、入力画像の小さな領域内のピクセルの加重平均が出力画像内の対応する各ピクセルになります。重みは関数によって定義されます。この関数はコンボリューションカーネルと呼ばれます

コンボリューション カーネルには特定のルールがあります。

  1. フィルターのサイズは、3x3、5x5、7x7 などの中心を持つように奇数にする必要があります。コンボリューション カーネルには中心と中心があり、半径もあります。たとえば、5x5 の半径カーネルは2です
  2. フィルター行列のすべての要素の合計は 1 に等しくなければなりません。これは、フィルター処理の前後で画像の明るさが変わらないことを保証するためです。しかし、それは必須ではありません
  3. フィルター行列のすべての要素の合計が 1 より大きい場合、フィルター処理された画像は元の画像より明るくなります。そうでない場合、1 より小さい場合、結果の画像は暗くなります。合計が 0 の場合、画像は黒にはなりませんが、非常に暗くなります。
  4. フィルタリングされた構造の場合、負の数または 255 を超える値が表示される場合があります。この場合、それらを 0 ~ 255 の間で直接切り捨てることができます。負の数値の場合は、絶対値を取得することもできます

実際の開発では、さまざまなコンボリューション カーネルを設計しますが、異なるコンボリューション カーネルで処理された画像は異なる効果を持つため、異なるコンボリューション カーネルは異なる画像モードを表すと考えることができ、コンボリューション エッジの抽出やエッジの抽出に非常役立ちます。また、特徴を抽出します。これは、後の学習の基礎となります。

このコンボリューション カーネルでコンボリューションされた画像の値が比較的大きい場合、その画像はコンボリューション カーネルに非常に近いと見なされます。

3.2.3 コンボリューションカーネルの適用

平滑平均フィルター

平滑平均値フィルタリングの適用例では、一般に処理対象の画像にはノイズ(高周波信号)が多く、周囲の画素との差が比較的大きいため、画像が鈍く滑らかに見えません。 3x3 を使用します コンボリューション カーネルは、画像のコンボリューションに使用されます。この 3x3 行列の各要素は 1/9 です。コンボリューション後 (ノイズに対応するピクセルは「溶解」されます)、画像全体がより滑らかに見えます (詳細ぼやけた)

ガウスフィルター

ガウス平滑化には水平方向と垂直方向にガウス分布があり、ピクセル平滑化後の中心点の重みが強調表示され、平均フィルタリングよりも優れた平滑化効果があります。

画像の鮮明化

画像の鮮明化には、ラプラス変換カーネル関数が使用されます。3x3 コンボリューション カーネルの中心位置が 9 であることを除き、残りの位置は -1 です。これは、中心ピクセルを 9 で乗算し、残りの隣接ピクセル値を減算することを目的としています。これにより、中心のピクセル値と他の隣接するピクセル値の間のギャップが広がり、その結果、画像のコントラストが強化され、画像が鮮明になります。

ソーベルエッジ抽出

ソーベルのエッジ検出は水平検出と垂直検出に分けられ、一般的には 2 つのエッジ抽出結果を融合しますが、水平か垂直かはコンボリューション カーネルの使用によって決まります。

ここに画像の説明を挿入

3.2.4 畳み込みそのものの計算

まず第一に、概念 -ステップ サイズを導入する必要があります。名前が示すように、ここでのステ​​ップ サイズは、画像を畳み込むときに畳み込みカーネルが毎回移動するピクセル数を表します。上で説明した例のいくつかは、1 つずつ移動しています。一度に 1 ピクセルずつ、そして順番に中心ピクセルのピクセル値を変更してさまざまな効果を実現しますが、毎回 s ピクセルを移動したい場合はどうすればよいでしょうか。結果は次のようになります: ((hf)/s + 1 , (wf)/s + 1)

しかしこれは多くの問題を引き起こします. f またはステップ サイズ s が 1 より大きい場合, 畳み込みごとに画像は小さくなり, 多くの情報が失われます. 問題を解決することを考えなければなりません. 一般的に言えば, To を使用します概念 - 塗りつぶし/パディング。最も単純なものは、元のすべてのピクセルがカバーされ、ピクセルの損失がないように、周囲のピクセル値 0 でピクセルの円を埋めることです。

ここに画像の説明を挿入

コンボリューション - 3 つの充填方法

塗りつぶされたピクセルの外側の円の数に応じて、フル、同一、有効の 3 つのモードに分けることができますが、塗りつぶされた円の数が異なるとどのような影響が生じるでしょうか? 塗りつぶし円の数の設定は、出力イメージのサイズが元のイメージよりも大きいか、変わらないか、または小さいかを直接決定します。これは、フィルターがイメージをフィルター処理するときに、コンボリューション カーネルの中心位置が出力イメージのサイズを決定するためです。

ここに画像の説明を挿入

3チャンネルコンボリューション

3 チャネルの畳み込みは実際には 3 次元の単一チャネルの畳み込みであり、対応するマルチチャネルは実際には多次元の単一チャネルの畳み込みであり、チャネルごとに異なる畳み込みカーネルを持ちます (抽出特徴が異なるため)。チャネル畳み込みの場合、各畳み込みカーネルは 3x3x3 です。単一チャネルの畳み込みカーネルは 2 次元の畳み込みカーネル、3 チャネルの畳み込みカーネルは立方体であることがわかります。図のフィルタ W0 は全体を指します。畳み込みカーネル、フィルター W1 は別の畳み込みカーネルを参照します

図の出力ボリュームはコンボリューション後の画像ですが、なぜ7x7x2の画像が3x3x2の画像になるのでしょうか?これは、パディングを使用しても、畳み込みのストライドが 1 ではなく 2 であるために発生します。

ここに画像の説明を挿入
1 つの画像に対して、n 個の複数のコンボリューション カーネルを設定して動作させることができます。上の画像では、2 つのコンボリューション カーネルを使用したため、出力 W0 と W1 の 2 つのチャネルがあります。今回は非常に重要な概念につながります。画像はコンボリューションとは関係ありません 出力はコンボリューションカーネルによって決まります スタイルであれ番号であれ、コンボリューションカーネルの種類と番号で決まります

CNN (Convolutional Neural Network) の優れている点は、フィルターの特性が人為的に設定されるのではなく、大量の画像を通じて自分で学習されることです。


著作権に関する声明: 上記の学習コンテンツと写真は、Badou Artificial Intelligence から取得または参照しています
。記事が役に立った場合は、ワンクリックでサポートすることを忘れないでください。

おすすめ

転載: blog.csdn.net/qq_50587771/article/details/124142152