3

ソース画像があります。特定の部分をセグメント化し、別の画像として保存する必要があります。セグメント化する必要がある部分の気の利いたアウトラインがありますが、それを使用してソース画像からその部分を切り取るにはどうすればよいですか? ソース画像とキャニー エッジ アウトラインの両方を添付しました。私を助けて、解決策を提案してください。

ソース画像

キャニーエッジ

EDIT-1: アレクサンダー・コンドラツキー、これが境界を埋めるという意味ですか?ここに画像の説明を入力

EDIT-2 : Kannatによると、私はこれを行いました 輪郭のあるソース画像

輪郭の外側と内側の領域を 2 つの別々の画像に分割するにはどうすればよいでしょうか。

編集 3- マスクと輪郭線のソース イメージを「And-ing」することを考えました。C を使用しているので、少し苦労しています。これは私が使用するコードです:-

            hsv_gray = cvCreateImage( cvSize(seg->width, seg->height), IPL_DEPTH_8U, 1 );                       
                    cvCvtColor( seg, hsv_gray, CV_BGR2GRAY );                       
                    hsv_mask=cvCloneImage(hsv_gray);
            IplImage* contourImg =cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );                      
            IplImage* newImg=cvCreateImage( cvSize(hsv_mask->width, hsv_mask->height), IPL_DEPTH_8U, 3 );
            cvAnd(contourImg, hsv_mask,newImg,NULL);

サイズまたはタイプの不一致のエラーが常に発生します。サイズを調整しましたが、1つ(hsv_mask)が1チャネルで他が3チャネルであるため、タイプを調整できないようです。

@kanat-私もあなたのboundingrectを試しましたが、C形式ではうまくいかなかったようです。

4

2 に答える 2

0

2 番目の画像で使用cv::findContoursして、セグメントの輪郭を見つけます。次にcv::boundingRect、このセグメントの境界ボックスを見つけるために使用します。その後、マトリックスを作成し、2番目の画像から切り抜いたバウンディングボックスを保存できます(バイナリ画像であることがわかります)。必要な領域をトリミングするには、これを使用します。

cv::getRectSubPix(your_image, BB_size, cv::Point(BB.x + BB.width/2, BB.y + BB.height/2), new_image). new_imageその後、を使用して保存できますcv::imwrite。それでおしまい。

編集:

輪郭が 1 つしか見つからない場合は、これを使用します (そうでない場合は、見つかった輪郭の要素を反復処理します)。次のコードは手順を示していますが、申し訳ありませんが、今はテストできません。

std::vector<std::vector<cv::Point>> contours;
// cv::findContours(..., contours, ...);
cv::Rect BB = cv::boundingRect(cv::Mat(contours[0]));
cv::Mat new_image;
cv::getRectSubPix(your_image, BB.size(), cv::Point(BB.x + BB.width/2, 
BB.y + BB.height/2), new_image);
cv::imwrite("new_image_name.jpg", new_image);
于 2015-11-20T07:13:59.393 に答える
0

キャニー エッジ検出器によって作成された境界を塗りつぶし、それを元の画像のアルファ マスクとして使用できます。

于 2015-11-20T06:40:48.067 に答える