画像処理におけるターゲットエッジ検出
実験分析
画像のデジタル部分は、ソーベル演算子のエッジによって検出され、ターゲット領域を見つけるために積分画像に変換されます。
私のアイデアは、エッジ検出後に単純な2値化を実行してデジタルパーツを強調表示し、次に積分マップでターゲット領域を強調表示し、デジタル領域の左上隅の座標を見つけ、左上から右下に長方形を描くことです。
エッジ検出のためのソーベル演算子
Sobleオペレーターのエッジ検出ではSobelGrayImage関数を使用します。
数値の横に白い点があることがわかったので、後で簡単な2値化を実行します。
void bin(BYTE *pSrc, int width, int height, BYTE *pDst)
{
for(int i=0;i<height;i++)
for (int j = 0; j < width; j++)
{
pDst[i*width + j] = (pSrc[i*width + j]> 200 ? pSrc[i*width + j] : 0);
}
return;
}
次に、積分マップを計算します。
void integrogram(BYTE* inputMatrix, int width, int height, BYTE* outputMatrix)
{
BYTE *columnSum = new BYTE[width];
for (int i = 0; i < width; i++)
{
columnSum[i] = inputMatrix[i];
outputMatrix[i] = inputMatrix[i];
if (i > 0)
{
outputMatrix[i] += outputMatrix[i - 1];
}
}
for (int i = 1; i < height; i++)
{
int offset = i * width;
columnSum[0] += inputMatrix[offset];
outputMatrix[offset] = columnSum[0];
for (int j = 1; j < width; j++)
{
columnSum[j] +=(255, inputMatrix[offset + j]);
outputMatrix[offset + j] = min(255,outputMatrix[offset + j - 1] + columnSum[j]);
//全部变成255;
}
}
return;
}
この時点で、明らかなターゲット領域があります。
左上隅の最初の白いピクセルの座標を取得します。
void findROIxy(BYTE *pSrc,int width,int height,int *x,int *y)
{
for (int i = 0; i < height; i++)
for(int j=0;j<width;j++)
{
if (pSrc[i*width + j] != 0)
{
*x = j;
*y = i;
return;
}
}
}
左上から右下に長方形を描きます。
void drawRectangle(BYTE *pSrc, int x, int y, int width,int height,int draw_width, int draw_height,BYTE *pDst)
{
for (int i = x - 10; i < x + draw_width; i++)
{
pSrc[y*width + i] = 255;
pSrc[(y + draw_height)*width + i] = 255;
}
for (int i = y; i < y + draw_height; i++)
{
pSrc[i*width+x-10] = 255;
pSrc[i*width + x + draw_width] = 255;
}
}
結果
デバッグモードでの実行ごとに約10ミリ秒、リリースモードで約4ミリ秒かかります。
このプロセスは、単純な2値化であるため、あまり安定していません。ターゲット領域のピクセル値に類似したポイントに遭遇すると、長方形のフレームは大きく逸脱し、このアプローチには特定の制限があります。ほとんどの写真のデジタル領域のサイズは同じであるため、デフォルトでこの領域のサイズは固定されているため、他の質問に入れても機能しません。パラメーターを変更する必要があります。より正式なアプローチが必要です。