Opencv 画像処理の一般的なアルゴリズムと方法のまとめ
1. デジタル画像処理の基礎
1.1 人間の目の画像の形成
- 光が目に入る: 光が物体で反射または散乱して目に入ると、光は角膜と水晶体を通って眼球の内部に入ります。
- 光の集束: 角膜と水晶体は光を網膜に集束させます。レンズはその形状を調整することで焦点距離を調整できるため、対象物の像が網膜にはっきりと映ります。
- 光を感知する光感受性細胞: 網膜は、光感受性細胞を含む組織の層であり、錐体と桿状体の 2 種類の細胞に分けられます。錐体は色と明るさの知覚を担っており、桿体は低照度の知覚を担っています。
- 神経シグナル伝達: 感光性細胞が光によって刺激されると、神経シグナルが生成され、視神経と脳に伝達されます。視神経と視覚野では、これらの信号がさらに処理および解釈されて、私たちが見る視覚画像が形成されます。
1.1 画像のデジタル化
画像のデジタル化は、画像をデジタル信号に変換するプロセスです。デジタル化された画像は通常、数値のマトリックスで構成され、各要素は画像上のピクセルを表し、ピクセルの色と明るさは数値で表されます。
画像をデジタル化するプロセスには、通常、次の手順が含まれます。
- 取得: 画像を取得するには、デジタル カメラ、スキャナー、ビデオ カメラなどのデジタル デバイスを使用する必要があります。デジタル化デバイスは、画像をコンピューターで処理できるデジタル信号に変換します。
- サンプリング: サンプリングは、連続した画像を個別のピクセルに変換するプロセスです。デジタイジング機器は画像をグリッドに分割し、各グリッドはピクセルと呼ばれ、各ピクセルの色と明るさの情報を収集し、たとえば、解像度が 640 480 の画像は、画像が640 480 = 307200 ポイントで構成されていることを意味します。
- 量子化: 量子化は、各ピクセルの色と明るさの値をデジタル値に変換するプロセスです。量子化中、連続信号は離散信号に変換されます。量子化レベルは、デジタル画像に表示できる色と明るさの量を決定します。例: 8 ビット イメージは、各サンプリング ポイントが2 8 2^8であることを意味します。28 = 256 レベル、最も暗いものから最も明るいものまで、256 レベルに区別できます。
- エンコーディング: エンコーディングは、デジタル化されたピクセル値をデジタル形式で保存するプロセスです。エンコード形式には通常、JPEG、PNG、BMP などがあります。
カラー画像の場合、この画像の内容は解像度のオーダーのピクセルで構成されます (例: 1920x1080)。タオバオで販売されているネイル画と同様に、1920×1080本のネイルで構成された絵画で、各ネイルの色は3つのチャンネル(RGB)で構成されています(それぞれR、G、Bと呼ばれる3種類のネイル)、
この 3 つのチャンネルは、水彩画で学ぶ 3 つの中心的な色 (赤、黄、青) のようなもので、この3 つの色によって異なる色を呼び出すことができます。色の間のレイヤー。
各チャンネルの下の各爪の色は、コンピューターの観点から 0 から 255 の値として表されます。
コンピューターサイエンスの観点から見ると、写真は数値であることがわかりました. いわゆるOpencv画像処理、P-picture、ビューティーなどの機能は、実際には数値の変化です. それらの数式とロジックを理解する. Opencvの共通アルゴリズム関数 明らかです。そのため、本稿では主に数学的線形代数の観点からアルゴリズム手法について説明します。
1.2 画像の種類
視覚または機器における画像の画像効果に応じて、画像は次のように分類できます。
- グレースケール画像: 白黒写真とも呼ばれ、単一チャンネル
- カラー画像:RGB、HSV、YUV、CMYK、Lab
通常、特定の色検出を行う場合、HSV 空間の画像を選択するのが一般的です. 次の例では、HSV の値を調整して、画像に必要な色を取得できます.
1.2.1 色の分割
色の特徴を検出するには、画像の RGB モードを H: 色、S: 彩度、V: 明度の HSV モードに変換する必要があります。
次のコードでは、スライダーで HSV の値を調整することで、画像の色の変化を観察できます。
createTrackbar は Opencv の API で、画像を表示しているウィンドウにスライド コントロールをすばやく作成でき、しきい値を手動で調整するために使用され、非常に直感的な効果があります
。 ) スライドバー関数を作成します
- trackbarName: スライド スペースの名前。
- windowName: スライド スペースが接続されている画像ウィンドウの名前。
- 値: 初期化しきい値;
- count: スライダー コントロールのスケール範囲; デフォルトの最小値は 0 です。
- onChange: コールバック関数の名前 (いわゆるコールバック関数は、スライダーが変更されるたびに新しい変数を渡す必要がある関数です)
cv2.getTrackbarPos はスライダーの位置の値を取得します
import cv2
import numpy as np
#定义HSV滑块的值
def empty(a):
h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
print(h_min, h_max, s_min, s_max, v_min, v_max)
return h_min, h_max, s_min, s_max, v_min, v_max
#图片拼接,将4张图片拼接到一起
def stackImages(scale,imgArray):
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range ( 0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
else:
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank]*rows
hor_con = [imageBlank]*rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
else:
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
hor= np.hstack(imgArray)
ver = hor
return ver
path = '1.jpg'
cv2.namedWindow("T
# 创建一个窗口,放置6个滑动条rackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",19,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",110,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)
cv2.createTrackbar("Val Min","TrackBars",153,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
while True:
img = cv2.imread(path)
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 调用回调函数,获取滑动条的值
h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
# 获得指定颜色范围内的掩码
mask = cv2.inRange(imgHSV,lower,upper)
# 对原图图像进行按位与的操作,掩码区域保留
imgResult = cv2.bitwise_and(img,img,mask=mask)
# cv2.imshow("Original",img)
# cv2.imshow("HSV",imgHSV)
# cv2.imshow("Mask", mask)
# cv2.imshow("Result", imgResult)
imgStack = stackImages(0.6,([img,imgHSV],[mask,imgResult]))
cv2.imshow("Stacked Images", imgStack)
cv2.waitKey(1)
1.3 ピクセル間の関係
コンピュータビジョンの下では、デジタル画像は実際にはマトリックスの形をしています
ピクセルの添え字は座標 (x, y) とも呼ばれ、座標の情報からピクセルとピクセルの空間的な位置関係を見つけることができます。
1.3.1 ドメイン
- 4-field : 座標 (x,y) を持つピクセル P の場合、P には、4-field ( x − 1 , y ) 、 ( x + 1 、 y ) 、 ( x 、 y − 1 ) , ( x , y + 1 ) (x-1,y),(x+1,y),(x,y-1),(x,y+1)( ×−1 、や)、( ×+1 、や)、( x ,y−1 ) 、( x ,y+1 )
- 対角フィールド: P には、4 つの斜めに隣接するピクセル( x − 1 , y − 1 ) 、 ( x − 1 、 y + 1 ) 、 ( x + 1 、 y − 1 ) 、 ( x + 1 、 y + 1 ) ( x-1,y-1),(x-1,y+1),(x+1,y-1),(x+1,y+1)( ×−1 、y−1 ) 、( ×−1 、y+1 ) 、( ×+1 、y−1 ) 、( ×+1 、y+1 )
- 8フィールド: 4フィールドと対角フィールドを合わせて8フィールド画素と呼ぶ
1.3.2 接続と接続
2 つのピクセルは、空間的な位置で接続されているだけでなく、他のピクセル値も類似性基準を満たす場合に接続されます。
ピクセルの類似性基準は、ピクセルのグレー値が等しいこと、またはピクセル値がすべてグレー セット v にあることを意味します。
たとえば、8 レベルのグレースケールでは、ピクセル値の範囲は 0 ~ 256 ( 2 8 2^828 )、7 レベルのグレー スケールのピクセル値の範囲は 0 ~ 128 であり、レベル 7 からレベル 8 までの 128 ~ 256 のピクセル値の範囲はグレー レベルのセットです。
- 4-connection : ピクセル p と q は両方とも集合 v の値であり、q と p は相互に 4 フィールドです
- 8-connection : ピクセル p、q は両方ともセット v の値であり、q、p は互いに 8 フィールドです
- 画素連結:連結を基本に足すという概念です。同じピクセルが存在する場合: p と q が接続され、q が r に接続され、r が s に接続され、s が t に接続され、p と t が接続されます。
接続された線が閉じたループを形成する場合、それらは接続されたドメインと呼ばれることもあります。
画像処理のアルゴリズム技術は、画像効果の変化を実現するために、さまざまな数学および線形代数論理と組み合わせて、ピクセルとピクセル値の間の空間位置関係を使用します。
2. 画像前処理技術
画像処理の入力形式と出力形式には、次の形式があります。
入力 | 出力 |
---|---|
単一の画像 | 単一の画像 |
複数の写真 | 単一の画像 |
単一の画像 | 数字や記号など |
複数の写真 | 数字や記号など |
画像予測処理の主な目的は、画像内の無関係な情報を除去し、有用な情報を抽出し (構造データの特徴抽出と同様)、関連情報の検出可能性を高め、データを最大限に単純化し、それによって特徴抽出と画像を改善することです。セグメンテーション、マッチングと認識の信頼性、およびそれをディープラーニングの分析と予測に適用する場合、具体的なプロセスは次のようになります。
画像予測処理フローには、主にグレースケール変換、幾何学的変換、画像強調、画像フィルタリングなどが含まれます。
2.1 グレースケール変換
グレースケール変換とは、画像のピクセル グレースケール値の特定のマッピング変換を指し、画像の明るさ、コントラスト、または色を調整して、特定の視覚効果を実現することができます。
ピクセルの元の値を s として記録します。グレースケール変換のマッピング関数は T(s) であり、変換されたピクセルは d です。つまり、d = T ( s ) d =T(s
)d=T ( s )
次に、いくつかの一般的な画像処理グレースケール変換方法を紹介します。
2.1.1 線形変換
線形変換は単純なグレースケール変換方法で、画像のグレースケール値を線形にマッピングします。通常、次の式で表されます。
g ( x , y ) = a ∗ f ( x , y ) + bg(x,y) = a*f(x,y) + bg ( x ,や)=a∗f ( x ,や)+b
其中, f ( x , y ) f(x,y) f ( x ,y )は、元のイメージのグレー値を表しますg ( x , y ) g(x,y)g ( x ,y )は変換されたグレー値を表し、a と b は定数であり、変換の大きさと方向はそれらを調整することで制御できます。
2.1.2 対数変換
対数変換は、通常、次の式で表される画像の暗い部分を強調できます。
g ( x , y ) = c ∗ log ( 1 + f ( x , y ) ) g(x,y) = c * log(1 + f(x,y))g ( x ,や)=c∗ログ( 1 _ _+f ( x ,y ))
其中, f ( x , y ) f(x,y) f ( x ,y )は、元のイメージのグレー値を表しますg ( x , y ) g(x,y)g ( x ,y )は、変換されたグレー値cccは、変換の大きさを制御するために調整できる定数です。
2.1.3 べき法則変換
べき乗変換は、画像の明るい部分の詳細を強調することができ、通常は次の式で表されます。
g ( x , y ) = c ∗ f ( x , y ) γ g(x,y) = c * f(x,y)^γg ( x ,や)=c∗f ( x ,や)c
其中, f ( x , y ) f(x,y) f ( x ,y )は、元のイメージのグレー値を表しますg ( x , y ) g(x,y)g ( x ,y )は、変換されたグレー値ccc和c cγ は、変換の大きさと方向を制御するために調整できる定数です。
2.1.4 反転
反転は、画像内の輝度値の高い領域を暗くし、輝度値の低い領域を明るくして、コントラストを高める単純なグレースケール変換方法です。反転の実装方法は非常に簡単で、各ピクセルのグレー値を反転するだけです。たとえば、元のイメージのピクセル グレー値は g であり、反転後のピクセル グレー値は 255-g です。
2.1.5 コントラスト強調
コントラスト強調は、画像のグレースケール値をより広い範囲に再マッピングすることにより、画像のコントラストを上げる方法です。コントラストを向上させる方法はたくさんあります.一般的に使用される方法の 1 つはグレースケール ストレッチングです.具体的には:
元の画像のピクセル値の範囲が [a,b] であると仮定し、それを [0,255] の範囲に線形に引き延ばすと、引き延ばし関数は次のように表すことができます。
g ( x ) = ( x − a ) × 255 b − a , x ∈ [ a , b ] g(x)=\frac{(xa)\times255}{ba}, x\in[a,b]g ( x )=b−a( ×−a )×255、バツε[ 、_b ]
そのうち、○○xは元の画像のピクセル値、g ( x ) g(x)g ( x )は引き伸ばされたピクセル値です。
OpenCV では、LUT (ルックアップ テーブル) を使用してグレースケール ストレッチを実現することもできます。
具体的な手順は次のとおりです。
(1) 伸縮関数g ( x ) g(x)を計算します。g ( x ),其中x ∈ [ a , b ] x\in[a,b]バツε[ 、_b ],aaaとbbbは、それぞれ元の画像の最小ピクセル値と最大ピクセル値です。g ( x ) = ( x − a ) × 255 b − ag(x)=\frac{(xa)\times255}{ba}g ( x )=b−a( ×−a )×255
(2) 256 256を作成する256 -要素ルックアップ テーブルルックアップ ルックアップlookup ,其中lookup ( i ) lookup( i )look up ( i ) は、元のイメージのピクセル値が ii であることを示します。ストレッチ後のピクセルiのピクセル値。
(3) 元の画像の各ピクセルをトラバースし、ルックアップ テーブルで対応する新しいピクセル値を見つけ、それを出力画像に割り当てます。
以下は、LUT を使用したグレースケール ストレッチのコード例です。
import cv2
import numpy as np
# 读取原图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 计算拉伸函数
a = np.min(img)
b = np.max(img)
g = lambda x: (x-a)*255/(b-a)
# 创建查找表
lookup = np.zeros(256, dtype=np.uint8)
for i in range(256):
lookup[i] = np.clip(g(i), 0, 255)
# 使用查找表进行灰度拉伸
img_stretched = cv2.LUT(img, lookup)
# 显示原图像和拉伸后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Stretched Image', img_stretched)
cv2.waitKey(0)
cv2.destroyAllWindows()
この例では、np.clip() 関数を使用して、ピクセル値を[0,255] [0,255]にクリップします。[ 0 ,255 ]範囲外の出力ピクセル値の問題を回避します。
2.1.6 コントラスト圧縮
コントラスト圧縮は、画像のグレースケール値をより狭い範囲に再マッピングすることにより、画像のコントラストを下げる方法です。コントラスト圧縮を実装する方法も多数ありますが、その 1 つが対数変換です。具体的には、対数変換は画像のグレー値の対数を取り、それを [0,255] の範囲にスケーリングします。式は次のとおりです。
g ( x ) = ( x − a ) × 255 b − a , x ∈ [ a , b ] g(x)=\frac{(xa)\times255}{ba}, x\in[a,b]g ( x )=b−a( ×−a )×255、バツε[ 、_b ]ここで、xxxは元の画像のピクセル値、g ( x ) g(x)g ( x )は圧縮されたピクセル値です。
OpenCV では、LUT (Look Up Table) を使用してコントラスト圧縮を実現できます。具体的な手順は次のとおりです。
(1) 圧縮関数g ( x ) g(x)を計算します。g ( x ),其中x ∈ [ a , b ] x\in[a,b]バツε[ 、_b ],aaaとbbbは、それぞれ圧縮された最小ピクセル値と最大ピクセル値です。g ( x ) = ( x − a ) × 255 b − ag(x)=\frac{(xa)\times255}{ba}g ( x )=b−a( ×−a )×255
(2) 256 256を作成する256 -要素ルックアップ テーブルルックアップ ルックアップlookup ,其中lookup ( i ) lookup( i )look up ( i ) は、元のイメージのピクセル値が ii であることを示します。圧縮後のピクセルiのピクセル値。
(3) 元の画像の各ピクセルをトラバースし、ルックアップ テーブルで対応する新しいピクセル値を見つけ、それを出力画像に割り当てます。
以下は、LUT を使用してコントラスト圧縮を実装するためのコード例です。
import cv2
import numpy as np
# 读取原图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 计算压缩函数
a = 50
b = 200
g = lambda x: (x-a)*255/(b-a)
# 创建查找表
lookup = np.zeros(256, dtype=np.uint8)
for i in range(256):
lookup[i] = np.clip(g(i), 0, 255)
# 使用查找表进行对比度压缩
img_compressed = cv2.LUT(img, lookup)
# 显示原图像和压缩后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Compressed Image', img_compressed)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.1.7 ガンマ補正
ガンマ補正は、画像のグレー値を非線形に変換することにより、画像の明るさを調整する方法です。ガンマ補正の原理は、非線形関数を介して元の画像のグレー値をマッピングすることです。これにより、輝度値が低い領域が暗くなり、輝度値が高い領域が明るくなります。具体的には、ガンマ補正はグレースケール値の変換に次の式を使用します。
g = A g γ g^ = A g^γg= Agc
このうち、g は元の画像のピクセル グレー値を表し、g' はガンマ補正後のピクセル グレー値を表し、A と γ はパラメータです。A はグレー値の大きさを制御し、通常は A=1 であり、γ はグレー値が変化する速度を制御します。通常、γ の範囲は [0.5, 2.5] の間です。γ が 1 未満の場合、画像内の輝度値の低い領域が拡大され、それによって画像のコントラストが改善されます; γ が 1 より大きい場合、画像内の輝度値の高い領域が拡大され、それによって画像のコントラストが向上します。画像が明るくなります。
反転、コントラスト強調、コントラスト圧縮、およびガンマ補正は、一般的に使用される画像グレースケール変換方法であり、画像の明るさ、コントラスト、およびその他の属性を調整するために使用できます。実際のニーズに応じて適切なグレースケール変換方法を選択すると、画像の視覚効果が向上し、画像の分析と処理の効果が向上します。
2.2 画像ヒストグラム
画像ヒストグラム: ヒストグラムとは、画像全体のグレー スケール範囲内のピクセル値 (0 ~ 255) の出現頻度をカウントすることを指し、これに基づいて生成されたヒストグラムを画像ヒストグラムと呼びます。ヒストグラムは、画像のグレー レベルの分布を反映しています。は画像の統計的特徴であり、
RBG を使用して 3 つのチャネルのヒストグラムをそれぞれ実装すると、これら 3 つのヒストグラムがこの画像の特性を表します。
2.2.1 ヒストグラム等化
ヒストグラム均等化は、画像のコントラストを向上させるより高度な方法です. 基本的な考え方は、画像のピクセル値を変換して、ピクセル値がグレースケール全体に均等に分散されるようにすることです. これにより、画像のコントラストが向上します.
イコライゼーション変換
イコライゼーションは、ヒストグラムの内容を左右に引き伸ばすことであることがわかります。(画像の画素領域の差が小さく見えるようにし、画像全体の色のバランスをとって、画像を観察したときに特定の色が他の位置と比べて目立たないようにします)
ヒストグラム均等化: ヒストグラム均等化は一般的な画像強調方法で、画像のグレー ヒストグラムを均等化して画像の輝度分布をより均一にし、画像のコントラストとディテールを強調します。具体的な実装方法は、次の手順を参照できます。
(1) 元の画像のグレー ヒストグラムを計算する;
(2) グレーのヒストグラムの累積分布関数を計算する;
(3) 累積分布関数に従って元の画像のグレー値をマッピングする;
(4) 等化された画像を取得する.
具体的には、元の画像のピクセル値の範囲が [0,255] で、そのグレースケール ヒストグラムがH ( i ) , i ∈ [ 0 , 255 ] H(i),i\in[0,255] であるとします。H ( i ) 、私ε[ 0 ,255 ],CDF=C ( i ) , i ∈ [ 0 , 255 ] C(i),i\in[0,255]C ( i ) 、私ε[ 0 ,255 ]、等化されたピクセル値はg ( i ) 、 i ∈ [ 0 , 255 ] g(i),i\in[0,255]g ( i ) 、私ε[ 0 ,255],则有: C ( i ) = ∑ j = 0 i H ( j ) C(i)=\sum_{j=0}^i H(j) C (私)=j = 0∑私H ( j ) g ( i ) = ⌊ 255 × C ( i ) MN ⌋ g(i)=\lfloor \frac{255 \times C(i)}{MN} \rfloorg (私)=⌊ミネソタ州255×C ( i )⌋うち、MMMとNNNは、それぞれ元のイメージの幅と高さです。OpenCV では、equalizeHist() 関数を使用してヒストグラムの均等化を実現できます。ヒストグラム等化は画像ノイズの強調につながる場合があるため、実際のアプリケーションでは注意して使用する必要があることに注意してください。
2.3 空間フィルタリング
空間フィルタリングは、画像のローカル近傍ピクセルに基づく画像処理方法であり、画像ピクセルの周囲の近傍ピクセルに対して加重平均またはその他の数学演算を実行することによって、画像の特性を変更します。
空間フィルタリングには、画像のノイズ除去、エッジ検出、画像強調など、幅広い用途があります。
一般的な空間フィルタリング アルゴリズムには、平均フィルタリング、中央値フィルタリング、ガウス フィルタリングなどがあります。
- 平均フィルタリング: ピクセルの周囲の隣接ピクセルのグレー値を平均化して、画像のノイズを減らします。
- メディアン フィルタリング: 隣接するピクセルの中央値を使用して現在のピクセル値を置き換えると、画像内のごま塩ノイズなどの非線形ノイズを効果的に除去できます。
- ガウス フィルタリング: 隣接するピクセルのグレー値は、特定の重みに従って重み付けされ、平均化されます。重みはガウス関数によって計算されます。これにより、画像を効果的に滑らかにし、画像の詳細をより適切に保持できます。
空間フィルタリングの一般的な手順は次のとおりです。
- 通常は行列である固定サイズのフィルター (畳み込みカーネルまたはテンプレートとも呼ばれます) を定義します。
- フィルタの中心を現在のピクセルに合わせ、フィルタ内のすべての要素と現在のピクセルの隣接ピクセルに対して重み付けまたはその他の数学演算を実行して、現在のピクセルの出力値を取得します。
- フィルターを移動し、すべてのピクセルが処理されるまで手順 2 を繰り返します。
さまざまなフィルタを使用して (畳み込みカーネルも行列です)、画像のピクセルを変更します. 主な 3 つの機能は、画像のぼかし/ノイズ除去、画像の勾配/エッジの検出、画像の鮮明化/凸状の画像強調です。これらの機能はすべてここにあります。これらの操作は画像のピクセルを変更するためです。
フィルター強調を使用して、画像内の関心のある部分を強調し、画像の高周波成分を強調して、画像内のオブジェクトの輪郭と詳細を明確にすることができます; 低周波成分を強調して、画像のノイズの影響、(画像のピクセル値を処理する)、または画像をぼかす。
2.3.1 平均フィルタリング
平均フィルタリングとは、現在のピクセル値を、現在のピクセル ポイントの周囲の N*N ピクセル ポイントの平均値で置き換えることです。
112 ∗ 6 + 110 ∗ 4 + 60 ∗ 8 + 6 ∗ 70 24 = 83.33 \frac{112*6+110*4+60*8+6*70}{24}=83.3324112 * 6 + 110 * 4 + 60 * 8 + 6 * 70=83.33
2.3.2 ボックスフィルタリング
ボックスフィルタリングはピクセル平均を計算せず、平均フィルタリングの結果を正規化するかどうかを自由に選択できます。つまり、フィルタリング結果が隣接するピクセル値の合計の平均であるか、隣接するピクセル値の合計であるかを自由に選択できます。ピクセル値。
2.3.3 ガウス フィルタリング
平均フィルタリングとボックス フィルタリングを実行する場合、その近傍の各ピクセルの重みは等しくなります。ガウス フィルターは、中心点の重みを増やし、中心点から離れた位置の重みを減らして、近傍の各ピクセル値の異なる重みの合計を計算します。
2.3.4 メディアンフィルタリング
現在のピクセルのピクセル値を、近傍のすべてのピクセル値の中央値に置き換えます。
2.3.5 バイラテラル フィルタリング
バイラテラル フィルター処理は、画像を平滑化しながらエッジ情報を保持する非線形フィルター処理方法です。その核となる考え方は、ピクセルの空間位置とピクセル値の間の類似性を重み付けすることによってフィルタリングの効果を達成することです。
バイラテラル フィルタリングの式は次のとおりです。
その中で、私はフィルタリングしました ( x , y ) I_{filtered}(x,y)私フィルターをかけた_( x ,y )は、フィルター処理されたピクセル値を表しますI ( i , j ) I(i,j)私(私,j )は近傍ピクセル( i , j ) (i,j)(私,j ) ,fp ( i , j ) f_{p}(i,j)へp(私,j )はピクセル( i , j ) (i,j)(私,j )中心ピクセル( x , y ) (x,y)( x ,y ) 、 ws w_{s}の類似度ws和 w r w_{r} wrそれぞれ空間重みとピクセル重みを表すW p ( x , y ) W_{p}(x,y)Wp( x ,y )は正規化された重みの合計であり、フィルター処理されたピクセル値の範囲が[0 , 255 ] [0,255][ 0 ,255 ]の間。
実際には、fp ( i , j ) f_{p}(i,j)へp(私,j )は通常、ガウス関数、空間重みws w_{s}wsそしてピクセル値の重みwr w_{r}wrガウス関数を使用して計算することもでき、その値は空間ドメイン パラメータとグレースケール ドメイン パラメータの 2 つのパラメータに依存します。空間ドメイン パラメータはフィルタの半径を決定し、グレースケール パラメータはグレースケールの違いに対するフィルタの感度を決定します。
2.3.6 エッジシャープニング
画像勾配は、画像が変化する速度を計算します
画像のエッジ部分では、グレー値が大きく変化し、勾配値も大きくなります; 逆に、画像の滑らかな部分では、グレー値が小さく変化し、対応する勾配値も小さくなります。一般に、画像の勾配計算は画像のエッジ情報です。
実は勾配は導関数なのですが、画像勾配は一般に画素値の差分を計算することで勾配の近似値を求めており、近似導関数とも言えます。この導関数は、微積分で表すことができます。
線形代数計算では、1 次元関数の 1 次微分が定義されます。
dfdx = lim ϵ → 0 f ( x + ϵ ) − f ( x ) ϵ \frac{df}{dx}=\lim_{ \epsilon\ 右矢印 0}\frac{f(x+\epsilon)-f(x)}{\epsilon}d ×df=ε → 0リムϵf ( x+) _−f ( x )
画像には二次元関数f ( x , y ) f(x,y) がありますf ( x ,y )の場合、x 方向と y 方向の 2 つの方向があるため、偏微分が必要です:
∂ f ( x , y ) ∂ x = lim ϵ → 0 f ( x + ϵ , y ) − f ( x , y ) ) ϵ \frac{\partial f(x,y)}{\partial x}=\lim_{\epsilon\rightarrow 0}\frac{f(x+\epsilon,y)-f(x,y)} {\ イプシロン}∂ ×∂ f ( x ,y )=ε → 0リムϵf ( x+、_や)−f ( x ,y )
∂ f ( x , y ) ∂ y = lim ϵ → 0 f ( x , y + ϵ ) − f ( x , y ) ϵ \frac{\partial f(x,y)}{\partial y}=\ lim_{\epsilon\rightarrow 0}\frac{f(x,y+\epsilon)-f(x,y)}{\epsilon}∂y _∂ f ( x ,y )=ε → 0リムϵf ( x ,y+) _−f ( x ,y )
この 2 次元関数の総勾配は次のとおりです。
G = ( ∂ f ( x , y ) ∂ x ) 2 + ( ∂ f ( x , y ) ∂ y ) 2 G= \sqrt{(\frac{\partial f (x,y)}{\partial x})^2+(\frac{\partial f(x,y)}{\partial y})^2}G=(∂ ×∂ f ( x ,y ))2+(∂y _∂ f ( x ,y ))2な
各ピクセルのグラデーションは、周囲の 8 ピクセルによって決定されます。
画像のエッジの基本的な特徴を計算するには, 同様の空間フィルタが必要です. ここで, 空間フィルタは演算子とも呼ばれます. エッジを計算するために主に使用される演算子は, Sobel, Robort, Laplacianです.
ソーベル演算子
ソーベル X 方向演算子テンプレート:
G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] (2) G_x=\left[ \begin{行列} -1 & 0 & +1\\ -2 & 0 & +2\ \ -1 & 0 & +1\\ \end{行列} \right] \tag{2}G×= な− 1− 2− 1000+ 1+ 2+ 1 な( 2 )
ソーベル y 方程式:
G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] (3) G_y=\left[ \begin{matrix} -1 & -2 & -1\\; 0&0&0\ \+1&+2&+1\\\end{行列}\right] \tag{3}Gy=
な− 10+ 1− 20+ 2− 10+ 1
な( 3 )
ロボットオペレーター
ロボット演算子テンプレート
G = [ − 1 0 0 1 ] (4) G=\left[ \begin{matrix} -1 & 0\\ 0 & 1 \end{matrix} \right] \tag{4}G=[− 1001]( 4 ) G = [ 0 − 1 1 0 ] (4) G_=\left[ \begin{matrix} 0 & -1 \\ 1 & 0\end{matrix} \right] \tag{4}G=[01− 10]( 4 )
a m ∗ nm*nなどの行列乗算による行列メートル∗nと ar ∗ cr*cr∗c はn = rn=rでなければなりませんn=rが発生する可能性があります。
演算子が2 ∗ 2 2*22∗2 、変更する必要がある画像に対応して、 m ∗ 2 m*2も必要ですメートル∗2の形は演算子で掛けますが、演算子と同じ形の方がいいです。
変化
ラプラシアン演算子
ラプラシアン演算子は、次のように定義される 2 次微分計算に基づいています。
G = ∂ 2 f ( x , y ) ∂ x 2 + ∂ 2 f ( x , y ) ∂ y 2 G= \frac{\partial^2 f(x,y)}{\partial x^2}+\ frac{\partial^2 f(x,y)}{\partial y^2}G=∂ ×2∂2 f(x,y )+∂y _2∂2 f(x,y )
その中:
∂ 2 f ( x , y ) ∂ x 2 = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) \frac{\partial^2 f(x, y)}{\部分 x^2}=f(x+1,y)+f(x-1,y)-2f(x,y)∂ ×2∂2 f(x,y)=f ( x+1 、や)+f ( x−1 、や)−2 f ( x ,y )
∂ 2 f ( x , y ) ∂ y 2 = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) \frac{\partial^2 f(x, y)}{\部分y^2}=f(x,y+1)+f(x,y-1)-2f(x,y)∂y _2∂2 f(x,y)=f ( x ,y+1 )+f ( x ,y−1 )−2 f ( x ,や)
ラプラシアン汎関数
G = [ 0 1 0 1 − 4 1 0 1 0 ] (4) G_=\left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 &0 \ end{行列}\right]\tag{4}G=
な0101− 41010
な( 4 )
2.4 座標変換
画像の座標変換は、画像の幾何学的計算とも呼ばれます. 一般的な基本的な変換には、画像の平行移動、ミラーリング、スケーリング、回転、アフィンがあります。
深層学習でよく使われます。データ増強
cv2.warpAffine() アフィン変換
dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
- src: 入力画像
- M: 2*3 変換行列 (遷移行列)
- dsize: 出力画像のサイズ。形式は (cols,rows)、幅は列に対応し、高さは行に対応します。
- flags: オプションパラメータ、補間方法の組み合わせ(int型)、デフォルト値INTER_LINEAR
- borderMode: オプション パラメータ、境界ピクセル モード (int 型)、デフォルト値 BORDER_CONSTANT
- borderValue: オプションのパラメータ、境界パディング値; デフォルトでは、Scalar() のデフォルト値は 0 です
画像を行列
warpAffine(img,M,(rows,cols)) と考えて基本的なアフィン変換効果を実現しますが、この場合は黒い境界線が表示されます。最後のパラメーターは borderValue で、境界線の塗りつぶしの色です。デフォルトは黒です。M は変換行列で、Opencv 関数は画像行列を渡します。
2.4.1 画像翻訳
画像翻訳中のMMMは変換行列です: [ 1 0 dx 0 1 dy ] (3) \left[ \begin{matrix} 1 & 0 & dx\\ 0 & 1 & dy \end{matrix} \right] \tag{3}[1001d ×日_]( 3 )
画像変換式は次のとおりです。 ここで、dx dxdx、ダイダイ_d yは( x , y ) (x,y)を意味します( x ,y )方向、次のように:
2.4.2 回転
画像回転のMM[ cos θ − sin θ 0 sin θ cos θ 0 ] (3) \left[ \ begin {matrix} \cos\theta & -\sin\theta & 0\\ \sin \theta&\cos\theta&0\end{行列}\right]\tag{3}[コス私罪私−罪私コス私00]( 3 )
2.4.3 スケーリング
画像スケーリングのMMMは変換行列です: [ S x 0 0 0 S y 0 ] (3) \left[ \begin{matrix} S_x & 0 & 0\\ 0 & S_y & 0 \end{matrix} \right] \tag{ 3}[S×00Syな00]( 3 )
2.4.4 ミラーリング
画像のサイズをm ∗ nm*nとするメートル∗n
水平ミラーリング、x 位置は変更されず、y 位置のみが反転:
α x , y = α x , n − y + 1 \alpha_{x,y}=\alpha_{x,n-y+1}ax , y=ax , n − y + 1
垂直ミラーリング、y 位置は変更されず、x 位置のみが反転:
α x , y = α m − x + 1 , y \alpha_{x,y}=\alpha_{m-x+1,y}ax , y=am − x + 1 , y
対角鏡像、x, y 位置が逆
α x , y = α m − x + 1 , n − y + 1 \alpha_{x,y}=\alpha_{m-x+1,n-y+1 }ax , y=am − x + 1 , n − y + 1
2.4.5 画像補正
matrix = cv2.getPerspectiveTransform(pts1,pts2)
imgOutput = cv2.warpPerspective(img,matrix,(width,height))
2.4.6 画像のスケーリング
opencv では、サイズ変更機能に似た画像のスケーリングに画像ピラミッドを使用します.
この方法によれば、画像ピラミッドは次のように分類できます:
ガウス ピラミッド: 画像を縮小することはダウンサンプリングとも呼ばれ、PryDown 関数を使用し
て画像を拡大することをアップサンプリングとも呼びます。
2.5 画像補間
線形補間法、補間されるピクセルの位置に関係なく、すべての方法で同じ補間カーネルが使用されます。この方法では、画像のエッジ ブラーが使用されます。
2 次元データに対してリサイズ操作を実行する場合、元の整数座標が 10 進座標に変換されることがよくありますが、非整数座標値に対する直感的で効果的な補間方法は双一次補間です。
2.5.1 最近傍補間
アルゴリズムの考え方: 補間の目的は、既知の画像のピクセル値に基づいて、未知のターゲット画像のピクセル値を取得することです. 補間変換プロセスは、下の図に示すようになります.
元の画像(行列)を仮定すると、各ピクセルの位置はsrcx, srcy src_x, src_yで表されますsr c×、sr cy,tagx , tagy tag_x,tag_yt a g×、t a gy補間により得られた注目画素点の位置座標を示します。
次の式でタグの位置を取得する方法:
ソース画像:
w:193 h:153
タグ画像:
w:375 h:284
最初に、元の画像とターゲット画像の間のマッピング関係を取得します
ratio = tagwsrcw = tagxscrx = 375 193 ratio_w = \frac{tag_w}{src_w} = \frac{tag_x}{scr_x}=\frac{375}{193}ラティオ_ _ _ _w=sr cwt a gwな=sc r×t a g×な=193375
ratioh = taghsrch = tagyscry = 284 153 ratio_h = \frac{tag_h}{src_h} = \frac{tag_y}{scr_y}=\frac{284}{153}ラティオ_ _ _ _時間=sr c時間t a g時間な=sc ryt a gyな=153284
値をマッピングしてタグの座標位置を取得
tagx = int ( srcx * ratio ) tag_x = int(src_x*ratio_w)t a g×=in t ( src c×∗ラティオ_ _ _ _w)
tagy = int ( srcy * ratioh ) tag_y = int(src_y*ratio_h)t a gy=in t ( src cy∗ラティオ_ _ _ _時間)
src ( x , y ) src_(x,y)を置くことができますsr c(× 、y )タグに割り当てられたピクセル値( x , y ) tag_(x,y)t a g(× 、や)
2.5.2 シングル線形補間
上の図のように、赤いブロックの真ん中に青いピクセル ブロックを挿入します。
2 点間の直線を見つけます。これらの 2 点間の任意の点はこの直線上にあり、3 点間の任意の 2 点は同じ勾配を持ちます
y − y 1 x − x 1 = y 2 − y 1 x 2 − x 1 \frac{y-y_1}{x-x_1}=\frac{y_2-y_1}{x_2-x_1}x − x1そして−そして1な=バツ2− ×1y2−y _1な
整理一下
y = x 2 − xx 2 − x 1 y 1 + x − x 1 x 2 − x 1 y 2 y=\frac{x_2 -x}{x_2 -x_1}y_1+\frac{x -x_1}{x_2 -x_1}y_2y=バツ2− ×1バツ2−x _y1+バツ2− ×1x − x1なy2
青いブロックのピクセル値を計算する式は次のとおりです。
f ( x , y ) = x 2 − xx 2 − x 1 f ( x 1 , y 1 ) + x − x 1 x 2 − x 1 f ( x 2 , y 2 ) f(x,y)=\frac {x_2 -x}{x_2 -x_1}f(x_1,y_1)+\frac{x-x_1}{x_2 -x_1}f(x_2,y_2)f ( x ,や)=バツ2−バツ1バツ2−×f ( x1、y1)+バツ2−バツ1バツ−バツ1なf ( x2、y2)
2.5.3 バイリニア補間
上の図に示すように、赤のピクセル ブロックを線形補間して、青と緑のピクセル ブロックのピクセル値を取得できます。具体的な式は次のとおりです。
最初に青色のピクセル ブロックを計算します。ここで、x、x1、x0 はマトリックス内のピクセル ブロックの位置座標であり、y についても同じことが言えます。
f ( x , y 0 ) = x 1 − xx 1 − x 0 f ( x 0 , y 0 ) + x − x 0 x 1 − x 0 f ( x 1 , y 0 ) f(x,y_0)=\ frac{x_1-x}{x_1 -x_0}f(x_0,y_0)+\frac{x-x_0}{x_1 - x_0}f(x_1,y_0)f ( x ,y0)=バツ1−バツ0バツ1−×f ( x0、y0)+バツ1−バツ0バツ−バツ0なf ( x1、y0)
f ( x , y 1 ) = x 1 − xx 1 − x 0 f ( x 0 , y 1 ) + x − x 0 x 1 − x 0 f ( x 1 , y 1 ) f(x,y_1)= \frac{x_1-x}{x_1 -x_0}f(x_0,y_1)+\frac{x-x_0}{x_1 - x_0}f(x_1,y_1)f ( x ,y1)=バツ1−バツ0バツ1−×f ( x0、y1)+バツ1−バツ0バツ−バツ0なf ( x1、y1)
再計算 绿色块の像素
f ( x , y ) = y 1 − yy 1 − y 0 f ( x , y 0 ) + y − y 0 y 1 − y 0 f ( x , y 1 ) f(x,y )=\frac{y_1-y}{y_1 -y_0}f(x,y_0)+\frac{y-y_0}{y_1 - y_0}f(x,y_1)f ( x ,や)=y1−y0y1−yf ( x ,y0)+y1−y0y−y0なf ( x ,y1)
2.5.4 バイキュービック
ターゲット画像の各ピクセルは、元の画像の対応するポイントの周囲の 4x4 = 16 ピクセルのグレー値によって重み付けされ、高解像度画像により近い拡大効果が得られます。
行の X 軸方向の 4 つの赤のピクセル ブロックと緑のピクセル ブロック間の距離は次のとおりです。2、1、-1、-2 行の Y 軸方向の 4 つの赤のピクセル ブロック間の
距離緑のピクセル ブロックは 2、1、-1、-2 です。
緑のピクセル ブロック (x, y) の値を取得する場合は、BiCubic 基底関数を使用して計算します。16 ピクセルの重みが取得され、緑のピクセル (x, y) の値は重み付けされた値に等しくなります。 16 ピクセルの重ね合わせ。
BiCubic 関数のパラメーター x は、ピクセル点からターゲット ピクセル点までの距離を示します。たとえば、(x-2, y-2) と (x, y) の間の距離は (2, 2) であるため、( x-2、y-2) 横軸の重みは W(2)、縦軸の重みは W(2) です。
BiCubic 重み式は次のとおりです
S ( x ) = { 1 − 2 ∣ x ∣ 2 + x 3 , ∣ x ∣ < 1 4 − 8 ∣ x ∣ + 5 ∣ x ∣ 2 − ∣ x ∣ 3 , 1 ≤ ∣ x ∣ < 2 0 , ∣ x ∣ ≥ 2 ( ) S(x)= \begin{cases} 1-2|x|^2+x^3,\quad |x|<1\\ 4-8|x| +5 |x|^2-|x|^3,\quad 1\leq |x|<2 \\ 0, \quad |x|\geq 2 \end{cases} \tag{}S ( × )=⎩
⎨
⎧1−2∣ × ∣2+バツ3、∣ × ∣<14−8∣ × ∣+5∣ × ∣2−∣ × ∣3、1≤∣ × ∣<20 、∣ × ∣≥2()
(x,y) ピクセル値を求める式:
f ( x , y ) = ABCT f(x,y)=ABC^Tf ( x ,や)=A B CT
A = [ S ( 2 ) S ( 1 ) S ( − 1 ) S ( − 2 ) ] A=[S(2) S(1) S(-1) S(-2)]あ=[ S ( 2 ) S ( 1 ) S ( − 1 ) S ( − 2 )]
B = S rc [ x − 1 : x + 1 , y − 1 : y + 1 ] B=Src[x-1:x +1,y-1:y+1]B=S rc [ x−1:バツ+1 、y−1:y+1 ]
C = [ S ( 2 ) S ( 1 ) S ( − 1 ) S ( − 2 ) ] C=[S(2) S(1) S(-1) S(-2)]ハ=[ S ( 2 ) S ( 1 ) S ( − 1 ) S ( − 2 ) ]
2.6 アフィン変換
画像アフィン変換とは、画像の回転、平行移動、スケーリングなどの操作を実現するために、一連の線形変換を介して、ある 2 次元平面上の点を別の 2 次元平面上の点にマッピングすることを指します。次のように、行列形式の線形変換として表すことができます。
2.7 データ拡張処理
データ拡張とは、一連の画像処理技術を使用してデータセットを拡張し、モデルの一般化能力と堅牢性を向上させることです。カラー画像のデータ拡張には、一般に次のものが含まれます。
- 色変換: 画像の色相、彩度、明るさを変更するなど、画像の色を変更します。色変換により、色の変化に対するモデルのロバスト性が向上します。
- 幾何学的変換: ランダムなトリミング、回転、反転など、画像の幾何学的構造を変更します。幾何学的変換により、オブジェクトの位置と角度の変化に対してモデルをよりロバストにすることができます。
- ノイズ追加: ガウス ノイズ、ごま塩ノイズなどのノイズを画像に追加します。ノイズを追加すると、イメージ ノイズの影響に対してモデルをより堅牢にすることができます。
- 画像の再構成: 画像をさまざまな周波数成分に分解し、各成分を強調してから、それらの成分を新しい画像に合成します。画像再構成により、画像の詳細とテクスチャに対してモデルをより堅牢にすることができます。
- コントラスト強化: 画像のコントラストを強化し、画像の明るさと色をより鮮やかにします。コントラスト強調により、モデルがさまざまなオブジェクトを区別しやすくなります。
3. 画像特徴抽出
画像特徴抽出とは、画像から画像を表現できる有用な特徴を抽出することです。画像の特徴は通常、エッジ、コーナー、テクスチャなどのピクセル値またはピクセル値の組み合わせで構成されます。一般的に使用される特徴抽出方法には、カラー ヒストグラム、勾配ヒストグラム、ローカル バイナリ パターン (LBP) などがあります。これらのメソッドは、画像のピクセル値に対して統計または計算を実行することにより、画像の説明を取得します。
画像の前処理と比較して、特徴抽出は画像から有用な情報を抽出することに注意を払い、画像分類、ターゲット検出、画像認識などの後続のタスクに効果的な入力を提供します。画像の前処理は、主に、元の画像に対してノイズ削減、スケール変換、回転、トリミング、およびその他の操作を実行して、特定のアプリケーション シナリオによりよく適応することです。
深層学習では、画像の特徴抽出は非常に重要なステップです。従来の画像特徴抽出方法では、人間の経験に大きく依存する特徴を手動で選択する必要があります。深層学習に基づく画像特徴抽出では、畳み込みニューラル ネットワーク (CNN) などの深層学習モデルを使用して、画像の特徴を自動的に学習し、手動で特徴を選択するプロセスを回避できます。この深層学習に基づく画像特徴抽出手法は、画像分類、物体検出、画像セグメンテーションなどのタスクで非常に優れた結果を達成しており、画像処理の分野における現在の研究ホットスポットの 1 つになっています。
3.1 画像の二値化
画像の 2 値化は、
画像上のピクセルのすべてのグレースケール値を黒 (0) または白 (255) に設定するプロセスです。つまり、画像全体を明確な白黒効果に分割します。
最も一般的に使用されるのは、画像内のしきい値よりもグレー値が大きいピクセルを白 (または黒) に設定し、しきい値より小さい点を黒 (または白) に設定するしきい値セグメンテーションです。通常は T で表されます。
また、閾値の選択は二値化セグメンテーション効果に直接影響するため、適応閾値セグメンテーション、適切な閾値をどのように選択するかがアルゴリズムの核心であるため、適応閾値セグメンテーションと呼ばれるアルゴリズムを通じてセグメンテーション閾値を自動的に計算する方法があります。
一般的な適応しきい値セグメンテーションには、バイモーダル法と最大クラス間分散法 (OTSU) があります。
3.1.1 バイモーダル法
バイモーダル法は、イメージのグレー ヒストグラムが 2 つのピークで構成されていることを前提としています。ヒストグラムの 2 つのピーク ポイントを見つけることによって、それらの中央値が 2 値化のしきい値として使用されます。この方法は、顕著なバイモーダル分布を持つ画像に適しています。
アルゴリズムの手順:
イメージに対してグレースケール処理を実行して、グレースケール ヒストグラムを取得します。灰色のヒストグラムの 2 つのピーク ポイントを見つけます。2 つのピーク ポイントの中央値は、2 値化のしきい値として使用されます。
式: h ( i ) h(i)
とするh ( i )はグレー値iiiのピクセル数pppはグレー値iiピクセルの総数に対するiのピクセルの比率μ \muμと分散σ 2 \sigma^2pμ = ∑ i = 0 L − 1 i ⋅ p ( i ) \mu = \ sum_ {i=0}^{L-1} i \cdot p( i )メートル=私は= 0∑L − 1私⋅p ( i ) σ 2 = ∑ i = 0 L − 1 ( i − μ ) 2 ⋅ p ( i ) \sigma^2 = \sum_{i=0}^{L-1} (i-\mu)^ 2 \cdot p(i)p2=私は= 0∑L − 1(私は−m )2⋅p(i)其中, L L L はグレー レベルの数を表します。
3.1.2 クラス間最大分散法
最大クラス間分散法は適応しきい値法であり、画像の局所的なグレー分布に従って適切なしきい値を自動的に選択できます。
アルゴリズムの原則:
クラス間最大分散法の核となる考え方は、画像を 2 つのクラスに分割して、2 つのクラス間の分散が最大になるようにすることです。分散が大きいほど、2 つのカテゴリ間の違いがより明確になるため、選択したしきい値がより適切になります。
具体的な実装手順は次のとおりです。
- イメージのグレースケール ヒストグラムをカウントして、各グレースケールのピクセル数を取得します。
- 各グレー レベルの重み、つまり、ピクセルの総数に対するグレー レベルの比率を計算します。
- グレー レベル 1 から始めて、各グレー レベルのクラス間分散、つまり、画像がグレー レベルによって 2 つのクラスに分割された後の 2 つのクラス間の分散が循環的に計算されます。分散の計算式は次のとおりです。 ( μ 2 − μ t ) 2 σ^2=ω_1(μ_1−μ_t)^2+ω^2(μ_2−μ_t)^2σ^2=ω_1 (μ_1 −μ_t )^2+ω_2 ( μ_2 −μ_t )^2p2=おお1(メートル1−メートルt)2+おお2 (m2−メートルt)2p _2=おお1(メートル1な−メートルt)2+おお2(メートル2な−メートルt)2其中, ω 1 \omega_1 おお1和 ω 2 \omega_2 おお2それぞれ、総ピクセル数に対する 2 種類のピクセルの比率μ 1 \mu_1メートル1和μ 2 \mu_2メートル2は 2 種類のピクセルの平均グレー値μ t \mu_tメートルtは、合計平均グレー値です。
- クラス間の分散が最大のグレー レベルをしきい値として見つけます。これは、イメージの適応しきい値です。
公式:
最米間方差法設計公式:σ 2 = ω 1 ( μ 1 − μ t ) 2 + ω 2 ( μ 2 − μ t ) 2 σ 2 = ω 1 ( μ 1 − μ t ) 2 + ω 2 ( μ 2 − μ t ) 2 σ^2=ω_1(μ_1−μ_t)^2+ω^2(μ_2−μ_t)^2σ^2=ω_1 (μ_1 −μ_t ) ^ 2+ω_2 (μ_2 −μ_t )^2p2=おお1(メートル1−メートルt)2+おお2 (m2−メートルt)2p _2=おお1(メートル1な−メートルt)2+おお2(メートル2な−メートルt)2
其中, ω 1 \omega_1 おお1和 ω 2 \omega_2 おお2それぞれ、総ピクセル数に対する 2 種類のピクセルの比率μ 1 \mu_1メートル1和μ 2 \mu_2メートル2は 2 種類のピクセルの平均グレー値μ t \mu_tメートルtは、合計平均グレー値です。
3.2 モルフォロジー処理
侵食と膨張は、画像形態学のコア操作です
腐食: 画像内のコンテンツが境界に沿って内側に縮小します (画像内の線が細くなり、一部の線のピクセル値が削除されます) 拡張: 画像内のコンテンツが境界に沿って内側に拡張します (画像内の線が細くなり、太くなり、増加し
ます線の一部のピクセル値)
これら 2 つの操作のロジックと機能は、前の記事で説明したフィルターを使用した平滑化プロセスと似ていますが、違いは、侵食はフィルター カーネル内のピクセルの最小値を求め、拡張は最大値を求めることです。そして、計算された値をアンカー位置のピクセルにコピーします。
3.2.1 開閉操作
オープニング操作は、画像の高度な性質を腐食させてから、膨張操作を実行することです。画像の外側のディテール (ノイズ) を除去するために使用できます。
クロージング操作は、最初に画像を展開し、次に侵食操作を実行することです。イメージの内部の詳細 (ノイズ) を消去するために使用できます。
浸食と膨張は逆の操作ですが、開く操作も閉じる操作も画像を元の状態に復元しません。
3.3 機能記述子
特徴記述子は、画像処理とコンピューター ビジョンで画像の局所的な特徴を記述するために使用されるアルゴリズムです。画像内の特徴点を数学的ベクトルとして表現する手法で、画像マッチング、物体検出、認識などのアプリケーションに使用できます。
機能記述子のアルゴリズムの原則には、通常、次の手順が含まれます。
- 特徴点の検出: まず、画像内のコーナー、エッジ、スポットなど、一意で識別可能な局所的な特徴点を検出する必要があります。
- 特徴点の記述: 各特徴点について、特徴点の局所的な特徴を記述するために、グラデーションの方向、色、テクスチャなど、周囲のピクセルの特徴値または特徴ベクトルを計算する必要があります。
- 特徴点マッチング: 異なる画像の特徴点記述子を比較することにより、画像登録、ターゲット追跡、認識などのタスクで特徴点マッチングを実行できます。
OpenCV は、さまざまな画像特徴抽出アルゴリズムを提供し、さまざまな特徴記述子をサポートしています。
以下は、一般的に使用される機能記述子の一部です。
- SIFT (Scale-Invariant Feature Transform): スケール不変特徴変換は、局所特徴に基づく記述子です。SIFT 記述子は、キーポイントの周囲の勾配方向のヒストグラムを計算することによって生成されます。これは、スケール不変および回転不変です。
- SURF (Speeded Up Robust Features): SURF は SIFT の高速化バージョンであり、いくつかの近似アルゴリズムを使用して計算を高速化し、SIFT と同様のスケール不変性と回転不変性を備えています。
- ORB (Oriented FAST and Rotated BRIEF): ORB は、FAST コーナー検出器と BRIEF バイナリ記述子に基づく改良版である、より高速な計算速度を備えた特徴記述子です。ORB 記述子は、回転不変およびスケール不変です。
- HOG (方向勾配ヒストグラム): HOG は、ターゲットの検出と分類のための特徴記述子です。これは、画像内の勾配方向のヒストグラムを計算することによって生成され、方向とスケールに不変です。
- LBP (Local Binary Patterns): LBP はローカル特徴記述子で、画像内の各ピクセルとその隣接ピクセルとの差を計算することによって生成されます。LBP 記述子には、回転の不変性とグレー スケールの不変性があります。