本稿では、高解像度画像に適用できる連結ドメインラベリング手法について説明する。この手法は画像ラベリングの計算を大幅に簡素化し、ラベリングの精度と速度の両方を制御可能である。
1. 全体的な考え方は、
任意の画像内で接続されたドメインを見つけることは、異なる領域の有効ピクセル間の関係を数えて決定することです。ほとんどの接続されたドメイン アルゴリズムは画像全体を走査して計算する必要があり、一部のアルゴリズムでは複数の走査が必要です。計算できるのは画像全体だけです正確な連結領域;
この論文の考え方は、画像内のすべてのピクセルを計算する必要はなく、いくつかの代表的なピクセルを使用して特定の領域の妥当性を判断することで、実際に地域情報を正確に表現できるということです
。この論文で採用された方法は次のとおりです。
まず、画像を複数の領域に分割し、各領域は固定長と幅を採用し、640x480 の場合は 4x4 マトリックス ウィンドウを使用するなど、画像全体がいくつかのペインに分割されます。画像を分割すると、160x120 のマトリックス ウィンドウが得られ、計算する必要がある接続領域はこれらの分割されたウィンドウで構成されます。第 2 ステップでは、マトリックス ウィンドウを分割した後、各ウィンドウの対角線を実行します。トラバーサル上のピクセル値
(計算の便宜上、2 本の中心線を使用しても同じ効果が得られます)、ウィンドウの特徴線上の有効ピクセル値が要件を満たしている場合、ウィンドウは 1 としてカウントされ、そうでない場合は 0 として記録されます。 160x120 の行列ウィンドウ全体が 1 と 0 としてマークされます; この時点で、画像全体の特性を表す行列が生成されています; 3 番目のステップは、特徴行列に対して連結領域計算を実行し、最初に連続領域を計算し
ます各行をマークし、それぞれの行内のすべての連続領域がマークされ、行情報、列情報、および有効番号が保存されます。その後、マークされた配列を走査して、その領域の面積が計算されます。各行の有効エリアも有効エリアです(この時点で 8 つの近傍の計算は、上下 2 行の 2 つのドメインになります)。有効な場合は、トラバーサル後に同じエリアとしてマークします。完了したら、すべての有効な領域のマークを取得できます。最後に、元の行列に対応する座標位置にマークを書き込み、マーク良い特徴行列を取得します。
4 番目のステップは、マークされた特徴行列を抽出することです。ラベル 1 から始まり、これは最初の接続領域です。すべての接続領域の座標情報は 1 回の走査で取得できます。最後に、座標変換後の特徴行列の座標は次のようになります。元の画像内の座標が、最終的な接続されたドメイン情報を取得します。
2. 特性解析
上記手法の設計ポイントは 3 つあります。
(1) ウィンドウ化、画像全体をいくつかのウィンドウに分割し、特徴線上の実効値を計算することで、計算処理が大幅に簡略化され、計算量が幾何学的に削減されます。 , 4x4 によると、ウィンドウはもともと 16 ピクセルを計算する必要がありますが、実際には 8 ピクセルだけを計算します。画像全体の最初の走査の速度は 2 倍に増加します。元の画像は 16 倍に縮小され、2 番目の走査は各行の連結領域を計算するために使用され、速度が 16 倍向上します。8x8 以上のウィンドウが使用されている場合、速度も向上します。(2) 行ブロックごとに連結領域を計算し、最初に連結領域を計算します
。接続されたドメインのブロックは 2 回計算され、計算プロセスが大幅に簡素化され、速度が再び向上します。 (3) 最後に、ブロックの座標を抽出する
とき接続されたドメインでは、元の画像にマッピングするために特徴マトリックスの座標のみを抽出する必要があり、元の画像の種類に影響されず、RGB、グレースケール、および 2 値化された画像に適用できます。元のイメージを除き、割り当てる必要がある追加メモリは、ウィンドウの設定によってはメモリ消費が非常に少ない場合でも、元のイメージのサイズの一部にすぎません。
キーコード1. 領域分割とRMS計算
在这里插入代码片
//整图计算有效区域,划分成若个窗格进行搜索,生成特征矩阵,支持ROI区域计算
static int SearchCentre(unsigned char *pimage,int width,int w_stride,int h_stride,const COLOR_LAB_THRESHOLEDS *color_thread,SEARCH_AREA *Area,unsigned char *pResult)
{
unsigned int i,j,k;
int FailCount=0;
COLOR_LAB LAB;
uint16_t *row_ptr=NULL;
for(i=Area->X_Start;i<Area->X_End;i+=h_stride) //行
{
for(j=Area->Y_Start*2;j<Area->Y_End*2;j+=w_stride*2) //列
{
FailCount=0; //每个区域内不符合阈值的累计
k=0;
for(k=0;k<w_stride*2;k+=2)
{
row_ptr=(uint16_t*)(pimage+(i+h_stride/2)*width*2+j+k); //取16位 行不变
if(!ColorMatchLAB(*row_ptr,color_thread))
{
FailCount++;
}
if(FailCount>((w_stride+h_stride)>>2))
{
break;
}
}
if(k==w_stride*2)
{
k=0;
for(k=0;k<h_stride;k++)
{
row_ptr=(uint16_t *)(pimage+(i+k)*width*2+j+w_stride); //取16位 列不变
if(!ColorMatchLAB(*row_ptr,color_thread))
{
FailCount++