コンピューター ビジョンのいくつかの古典的なアルゴリズム - 最小二乗法 + RANSAC + ハッシュ アルゴリズム (DCT 付き) + 画像クラスタリング アルゴリズム

コンピュータービジョンのいくつかの古典的なアルゴリズム

1. 最小二乗法(線形回帰関数を求める)

最小二乗法を理解する前に、線形回帰について説明する必要があります。いわゆる線形回帰の最も一般的な例は y=2x です。単項線形回帰方程式では、傾き 2 が回帰係数です。対応する関係と、線形回帰は、いくつかの離散点が一般に特定の直線に最も近いことを意味します

これは最小二乗法と何の関係があるのでしょうか? 実は最小二乗法(最小二乗法)とは、誤差の二乗和を最小化することで得られる線形回帰関数を求める方法なのですが、なぜ残差の二乗和を使うのでしょうか?フィッティング度が高い、つまりフィッティング関数と解くべき関数の y の類似性が高いため

最小二乗法を用いることで未知のデータを簡単に求めることができ、得られたデータと実際のデータとの誤差の二乗和を最小限に抑えることができます。

ここに画像の説明を挿入

2. RANSAC (モデルは既知、パラメーターは不明)

RANSAC、つまりランダム サンプリングの一貫性。これは方法やアルゴリズムではありません。既知のモデルのパラメーターを解決するためのアイデアやフレームワークです。特定の問題を制限するものではありません。コンピューター ビジョンの問題である場合もあります。それは統計数学である可能性があり、経済学の分野におけるモデルパラメータの推定問題である可能性さえあります。

これは、一連の離散観測データ内の数学モデルのパラメータを推定するための反復手法であり、特定の確率の下で合理的な結果を生成する非決定論的アルゴリズムでもあり、より多くの反復を使用して確率を高めることができます。

RANSAC の基本的な前提は、「内部グループ」データはモデル パラメーターのいくつかのセットを通じてそのデータ分布を説明できるのに対し、「外れ値」データはモデリングに適さないデータであるということです。データは、極端なノイズ、測定値の誤解、データに関する誤った仮定など、外れ値を指すノイズの影響を受ける可能性があります。

RANSAC は、(通常は小規模な) 内群セットが与えられた場合に、データ モデルを最もよく説明する、またはデータ モデルに最もよく適合するパラメータを推定できる手順が存在すると仮定します。

2.1 RANSAC と最小二乗法の違い

上記の内容から、これら 2 つは実際にフィッティングに使用されることがわかりますが、それらの間にはどのような関係があり、どのような違いがあり、さまざまな適用シナリオは何でしょうか?

実際の開発や生産では、データにある程度の誤差が生じますが、2 つの変数間の関係が線形回帰関数 Y=aX+b であることがわかっている場合、a と b の具体的な値を知りたい場合は、理論 要件を満たすために必要な点は 2 つだけと言われていますが、誤差が存在するため、ランダムに選択した 2 点によって得られる a と b は異なる可能性があります。最も必要なのは、最終的な理論モデルとテスト値の誤差が最も小さい

  • 最小二乗法: a と b の偏微分値が 0 のときの最小平均二乗誤差の値を計算することで、多くの場合、最小二乗法は線形回帰と同義になりますが、小さな誤差にのみ適しています。
  • RANSAC: モデルが決定され、最大反復回数が許可されている場合、RANSAC は常に最適な解を見つけることができます (80% の誤差を含むデータセットの場合、RANSAC は最小二乗法よりもはるかに優れています)。

まとめると、誤差が小さくて RANSAC を使用する場合には最小二乗法が適しており、誤差が少し大きくて最大反復回数が許容される場合には最小二乗法が適していると一方的に考えることができます。実際の画像処理の開発では、画像内のピクセル数が多いため、最小二乗法を使用すると膨大な量の計算が必要となり、計算速度が非常に遅くなります。

2.2 RANSACアルゴリズムのステップ

RANSAC アルゴリズムの入力データ: 観測データの集合であり、RANSAC の特殊性により、これらの観測データには通常、大きなノイズや無効な点が存在します。RANSAC には観測データに加えて、既知のモデルも必要です(関数として理解される)、いくつかの信頼できるパラメータも重要です

RANSAC アルゴリズムの実装プロセスは、大きく次の 6 つのステップに分けることができます。

  1. 入力データからランダムに複数の点を選択し、ノイズ点と無効点を除く有効な点を内グループとして設定します。
  2. 適切な内部群のモデルを計算し、入力データとして RANSAC アルゴリズムに渡します。
  3. 先ほど選択しなかった他の点を確立されたモデルに導入し、それが内群であるかどうかを計算します
  4. 内グループの数を記録し、上記の手順を繰り返します。
  5. 内群の数を計算する各プロセスで、内群の数が最大のものを選択します。内群の数が最大のモデルが必要な結果になります。

RANSACアルゴリズムを実行する過程では、数学モデルが異なれば、パラメータモデルの計算方法も異なるはずです。そのため、RANSACは計算モデルのパラメータを見つけることではなく、そのようなアイデアを提供することを目的としています。

RANSAC の最大の欠陥は、数学的モデルを知る必要があることです。

アルゴリズムの実行プロセスでは、次の 2 つの問題に注意する必要があります: 1. 最初に内部グループとしていくつの点を選択する必要があるか、2. 最大反復回数はどれくらいか?

2.3 RANSACのパラメータ決定

最初のステップで選択した点が内群の確率 w、選択された点の数が n であると仮定すると、w^n は選択された n 点がすべて内群である確率であり、1-w^n は次のようになります。選択された n 点のうち少なくとも 1 つが内群ではない確率があります。(1 − w n) k は、k 回繰り返した後にすべての n 点が内群ではない確率です。アルゴリズムを k 回実行した後の成功確率が p である場合、p の計算式を得ることができます: p = 1 − (1 − w^n)k

次に、上記の式を使用して k の計算式を取得します: K=log(1-P)/log(1-w^n)

これら 2 つの関数を通じて、構築したいモデルが最適解である確率が高い場合、w を決定するときに、k が大きいほど p も大きくなることがわかります。w が一定の場合、n が大きくなるほど大きな k が必要になりますが、一般に w は位置的なものであるため、n が小さくなるように選択します。

2.4 RANSACの適用

RANSACの最も代表的な適用シナリオはパノラマスティッチングであり、その実装プロセスは大きく4つのステップに分けられます。

  1. 1 つのシーンに対して複数の画像を、通常は順番に撮影します
  2. 特徴マッチング(SIFT)により次の画像と前の画像間の変換構造を計算
  3. 画像マッピング。前の画像の座標系に次の画像を重ねます。
  4. 変換された画像が結合されて、最終的なパノラマが得られます。

ここに画像の説明を挿入

2.5 RANSAC アルゴリズムの長所と短所

利点: 最適な計算モデルを見つけることができるという機能に利点があります。

短所: 多くの制限があるため、欠点も非常に明白です。

  • パラメータを計算する反復回数に上限はありません。反復回数の上限が設定されている場合、得られる結果が最適な結果にならない可能性があり、さらには誤った結果が得られる可能性があります。
  • RANSAC では信頼できるモデルを取得できる確率は一定であり、その確率は反復回数に比例します。
  • 問題に関連するしきい値を設定する必要があります
  • RANSAC は特定のデータセットから 1 つのモデルのみを推定できます。2 つ (またはそれ以上) のモデルがある場合、RANSAC は別のモデルを見つけることができません
  • 数学的モデルを知る必要がある

3. ハッシュアルゴリズム

ハッシュ アルゴリズムは、RANSAC や最小二乗法とは何の関係もありません。別のアルゴリズムです。コンピュータ ビジョンの分野では、画像の類似性比較によく使用されます。類似画像検索には 3 つのハッシュ アルゴリズムがあります: 平均ハッシュ アルゴリズム ( aHash)、差分ハッシュ アルゴリズム (dHash)、および知覚ハッシュ アルゴリズム (pHash)

ハッシュ アルゴリズムに関して言えば、ハッシュ関数について話さなければなりません。これは、あらゆる種類のデータから小さなデジタル「フィンガープリント」を作成する方法です。メッセージまたはデータを要約に圧縮して、データ量を小さくします。データの形式が固定されると、この関数はデータをスクランブルして、ハッシュ値と呼ばれるフィンガープリントを再作成します。ハッシュ値は通常、ランダムな文字と数字の短い文字列で表されます。

ハッシュ アルゴリズムによって得られた任意の長さのバイナリ値は、より短い固定長のバイナリ値、つまりハッシュ値にマッピングされます。また、ハッシュ値は、データを一意で非常にコンパクトに数値表現したもので、平文をハッシュしてハッシュ値を取得する場合、平文内の文字を変更しただけであっても、得られるハッシュ値ハッシュ アルゴリズムは、ほぼすべてのデジタル ファイルを、一見文字化けした数字と文字の文字列に変換する関数です

暗号化関数として、ハッシュ関数には 2 つの最も重要な特性があります。

  • 不可逆性により、入力情報から一見文字化けした文字列(ハッシュ値)出力を取得することは非常に簡単ですが、出力文字列から入力結果を推測することは非常に困難です
  • 出力値の一意性と予測不可能性。入力情報がわずかに異なる限り、ハッシュ アルゴリズムに従って取得される出力値も大きく異なります。

ハミング距離

ハミング距離は、2 つのハッシュ値の近さを比較するために使用される尺度であり、2 つの数値が 2 値の差に対応する位置の数を表します。

3.1 平均ハッシュ アルゴリズムと差分ハッシュ アルゴリズム

平均値ハッシュ アルゴリズムのプロセスは 6 つのステップに分かれています。

  1. スケーリング: 画像は 8*8 にスケーリングされ、構造は維持され、細部は削除されます。
  2. グレースケール: グレースケール画像に変換します
  3. 平均: グレースケール画像内のすべてのピクセルの平均を計算します。
  4. 比較: ピクセル値が平均値より大きい場合は 1 として記録され、それ以外の場合は 0 として記録され、合計 64 ビット
  5. ハッシュの生成: 上記の手順で生成された 1 と 0 を順番に組み合わせると、画像のフィンガープリント (ハッシュ) になります。
  6. フィンガープリントを比較する: 2 つの写真のフィンガープリントを比較し、ハミング距離、つまり 2 つの 64 ビット ハッシュ値のうち何ビットが異なっているかを計算します。異なるビットが少ないほど、写真は類似しています。

差分ハッシュ アルゴリズムは、処理の初期段階と後期段階では基本的に平均ハッシュ アルゴリズムと同じですが、ハッシュを比較する場合に違いがあり、差分ハッシュ アルゴリズムは 6 つのステップに分かれています。

  1. スケーリング: 画像は8*9にスケーリングされ、構造は維持され、細部は削除されます。
  2. グレースケール: グレースケール画像に変換します
  3. 比較: ピクセル値が次のピクセル値より大きい場合は 1 として記録され、そうでない場合は 0 として記録されます。このラインは次のラインと比較されません。各ラインには 9 ピクセル、8 つの差分があり、8 ラインあり、合計 64 ビットです。
#均值哈希算法
def aHash(img):
    #缩放为8*8
    img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)
    #转换为灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #s为像素和初值为0,hash_str为hash值初值为''
    s=0
    hash_str=''
    #遍历累加求像素和
    for i in range(8):
        for j in range(8):
            s=s+gray[i,j]
    #求平均灰度
    avg=s/64
    #灰度大于平均值为1相反为0生成图片的hash值
    for i in range(8):
        for j in range(8):
            if  gray[i,j]>avg:
                hash_str=hash_str+'1'
            else:
                hash_str=hash_str+'0'           
    return hash_str
  
#差值感知算法
def dHash(img):
    #缩放8*9
    img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
    #转换灰度图
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    hash_str=''
    #每行前一个像素大于后一个像素为1,相反为0,生成哈希
    for i in range(8):
        for j in range(8):
            if   gray[i,j]>gray[i,j+1]:
                hash_str=hash_str+'1'
            else:
                hash_str=hash_str+'0'
    return hash_str

3.2 離散コサイン変換 DCT と知覚ハッシュ アルゴリズム

上では 3 つのハッシュ アルゴリズムがあると述べましたが、そのうちの 2 つだけについて言及しています。3 番目の知覚ハッシュ アルゴリズムは、離散コサイン変換である新しい DCT に関連しています。

平均ハッシュ アルゴリズムは厳密すぎて精度が不十分なため、サムネイルの検索に適していますが、より正確な結果を得るには、DCT (離散コサイン変換) を使用して周波数を下げる知覚ハッシュ アルゴリズムを選択できます。知覚的ハッシュ アルゴリズムの 8 つのステップのポイント:

  1. 画像を縮小します。32 * 32 の方が適切なサイズであり、DCT 計算に便利です。
  2. グレースケールに変換: スケーリングされた画像をグレースケールに変換します。
  3. DCT を計算する: DCT は画像を一連の比率に分割します。
  4. Reduced DCT: DCT 計算後の行列は 32 * 32 で、左上隅の 8 * 8 は予約されており、画像の最低周波数を表します。
  5. 平均値の計算: DCT を低減した後のすべてのピクセルの平均値を計算します。
  6. DCT をさらに小さくします。DCT が平均値より大きい場合は 1 として記録され、それ以外の場合は 0 として記録されます。
  7. 情報のフィンガープリントを取得します。64 個の情報ビットを組み合わせます。順序は一貫性を維持するためにランダムです。
  8. 最後に、2 つの写真のフィンガープリントを比較して、ハミング距離を取得します。

離散コサイン変換 (離散コサイン変換) は、主にデータまたは画像の圧縮に使用され、空間領域信号を周波数領域に変換でき、非相関性能が優れています。DCT 変換自体は無損失であり、同時に、DCT により変換は対称です。 , そのため、量子化と符号化の後に DCT 逆変換を使用して、受信側で元の画像情報を復元できます。DCT 変換は、現在の画像解析および圧縮分野で非常に幅広い用途に使用されています。一般的な JPEG 静止画像符号化 DCT 変換は次のとおりです。 MJPEG や MPEG ダイナミック コーディングなどの規格で使用されます。

私はこのことについてはあまり詳しくないので、最初に理論を少しだけ説明できますが、機会があれば詳しく説明します。

4. 画像クラスタリングアルゴリズム K-Means

4.1 分類とクラスタリング

分類

分類は実際には、特定のデータからパターンをマイニングし、判断するプロセスです。分類学習の主なプロセスは、次の 3 つのステップに分けることができます。

  1. 学習データセットにはクラスラベル番号があり、正のデータセットか負のデータセットかを判定します
  2. 次に、データセットを学習してトレーニングし、トレーニングされたモデルを構築する必要があります。
  3. モデルを通じて予測データセットに対して予測を行い、その結果のパフォーマンスを計算します。

クラスタリング

広い意味では、クラスタリングとは、いくつかの点で類似しているデータ セット内のデータ メンバーをまとめることです。クラスタとは、同じクラスタ内のデータ要素が互いに類似しているが、異なるクラスタ内にあるデータ インスタンスのコレクションです。それぞれの要素が異なります

クラスタリングにはデータのカテゴリーを表す分類情報やグループ化情報がない、つまりデータにラベルがついていないため、通常、クラスタリングは教師なし学習として分類されます。この観点から見ると、分類は教師あり学習と似ています。

クラスタリングの目的もデータを分類することですが、データをどのように分類するかは事前には分からず、データ間の類似性を判断し、類似したデータを統合するのは完全にアルゴリズムそのものです。クラスタリングの結論が出るまでは、各カテゴリの特徴が全く分かりませんので、クラスタリングの結果を人間の経験を通して分析して、クラスタリングされたカテゴリがどのような特徴を持っているかを確認する必要があります。

つまり、クラスタリングは主に「クラスタリングのようなもの」であり、類似性によって類似した要素を集めることになり、ラベルがありません。一方、分類はラベルを使用してモデルをトレーニングし、新しいデータセットを予測するプロセスであり、データにはラベルが付いています。

4.2 K 平均法クラスタリング

K-Means クラスタリングは、最も一般的に使用されるクラスタリング アルゴリズムです。信号処理から生まれました。その目的は、データ ポイントを K 個のクラスタに分割することです。このアルゴリズムの最大の利点は、シンプルで理解しやすく、高速な操作であることです。デメリットクラスタリングの前にクラスタ数を指定する必要があること、このアルゴリズムの最大のメリットはシンプルで分かりやすく、動作速度が速いこと、デメリットはクラスタリング前にクラスタ数を指定する必要があることですクラスタリング前のクラスタの数。

K-Means クラスタリング アルゴリズムの分析プロセス

最初のステップ: K 値を決定します。つまり、データセットを K 個のクラスターまたはグループに分割します。

ステップ 2: データセットから K 個のデータ ポイントを重心 (Centroid) またはデータ センターとしてランダムに選択します。

ステップ 3: 各点から各重心までの距離を個別に計算し、各点を最も近い重心グループに分割します。

ステップ 4: 各重心がいくつかの点を集めたら、アルゴリズムを再定義して新しい重心を選択します (クラスターごとに、その平均を計算します。つまり、新しい k 個の重心点を取得します)。

ステップ 5: 反復が終了するか、反復終了の条件が満たされるまで、ステップ 3 と 4 を繰り返し実行します (クラスタリング結果は変わりません)。

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
#读取原始图像
img = cv2.imread('lenna.png') 
print (img.shape)
 
#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)
 
#停止条件 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
            cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
 
#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS
 
#K-Means聚类 聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)
 
#K-Means聚类 聚集成4类
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)
 
#K-Means聚类 聚集成8类
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)
 
#K-Means聚类 聚集成16类
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)
 
#K-Means聚类 聚集成64类
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)
 
#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))
 
centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))
 
centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))
 
centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))
 
centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))
 
#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)
 
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
 
#显示图像
titles = [u'原始图像', u'聚类图像 K=2', u'聚类图像 K=4',
          u'聚类图像 K=8', u'聚类图像 K=16',  u'聚类图像 K=64']  
images = [img, dst2, dst4, dst8, dst16, dst64]  
for i in range(6):  
   plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), 
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

K-Means クラスタリングと画像処理

中国の画像処理では、画像のセグメンテーション、画像のクラスタリング、および画像認識を K-Means クラスタリング アルゴリズムを通じて実現できます。アルゴリズムを通じてこれらのピクセルを K 個のクラスタにクラスタリングし、各クラスタの重心を使用してすべてのクラスタ ポイントを置き換えることができます。これにより、解像度を変更せずに画像の色を量子化および圧縮でき、画像の色レベルのセグメンテーションを実現できます。

画像処理のアプリケーションでは、K-Means クラスタリングには明らかな利点があります。効果はニューラル ネットワークほどではありませんが、一般的な場合には十分であり、シンプルで高速であり、大規模なデータを処理するためのアルゴリズムです。セットは非常に効率的であり、結果のクラスターが密な場合の効果は非常に理想的です。

欠点の 1 つは、クラスターの数 K を直前に指定する必要があること、もう 1 つはノイズや外れ値データの影響を受けやすいことです。これらの欠点は、一般的な問題を扱う場合には他の方法で補うことができます。


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

おすすめ

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