7

キャニーエッジアルゴリズムを使用すると、予想どおり太い色の線の反対側に2つのエッジが生成されますが、線と曲線の検出アルゴリズムをより簡単にするために、1つのエッジのみを表示したいのですが、どのようにできるかについてのアイデアそれを実現しますか?

ここに画像の説明を入力

コードは次のとおりです。

bool CannyEdgeDetection(DataStructure& col)
{

Mat src, src_gray;
Mat dst, detected_edges, fin;
int WhiteCount = 0, BCount = 0;

char  szFil1[32] = "ocv.bmp";
char  szFil2[32] = "dst.bmp";
src = imread(szFil1);
dst = imread(szFil1);
blur( src_gray, detected_edges, Size(3,3) );
Canny( src, dst, 100, 200, 3 );
imwrite(szFil2, dst );

IplImage* img = cvLoadImage(szFil2);
int height    = img->height;
int width     = img->width;
int step      = img->widthStep;
int channels  = img->nChannels;
uchar * datau      = (uchar *)img->imageData;

for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
for(int k=0;k<channels;k++){
datau[i*step+j*channels+k] = 255 - datau[i*step+j*channels+k];   
if (datau[i*step+j*channels+k]==0){
WhiteCount++;
col.pixel_col [i][j] = 2;
}
else{BCount++;
col.pixel_col[i][j] = 0;
}
}
}
}

cvSaveImage("img.bmp" ,img);

return 0;

}

これは元の画像ではありませんが、似ています:

ここに画像の説明を入力

白い背景で黒い画像を読み取れるようにするには、どの部分をコメントアウトしますか? または色付きの画像?

bool done;
do
{
  cv::morphologyEx(img, temp, cv::MORPH_OPEN, element);
  cv::bitwise_not(temp, temp);
  cv::bitwise_and(img, temp, temp);
  cv::bitwise_or(skel, temp, skel);
  cv::erode(img, img, element);

  double max;
  cv::minMaxLoc(img, 0, &max);
  done = (max == 0);
} while (!done);
4

1 に答える 1

3

そのプロセスはskeletonizationまたはと呼ばれthinningます。あなたはそれのためにグーグルすることができます。

ここにsimple method for skeletonization:スケルトン化 OpenCV In C#

以下は、output上記の方法を画像に適用したときに得られたものです(上記の方法は、入力画像のちょうど反対のケースで機能するため、スケルトン化の前に画像が反転されます)。white images in black background

ここに画像の説明を入力

于 2012-07-15T14:08:25.737 に答える