web-dev-qa-db-ja.com

C ++での画像分析のためのOpenCVバイナリイメージマスク

画像の外側にノイズが多いが、内側に形のある透明な円形の中心がある画像を分析しようとしています。中心は私が興味を持っている部分ですが、外部ノイズが画像のバイナリしきい値に影響を与えています。

ノイズを無視するために、既知の中心位置と半径の円形マスクを設定して、この円の外側のすべてのピクセルを黒に変更しようとしています。円の内側のすべてが、バイナリしきい値を使用して簡単に分析できるようになると思います。

誰かが私をこの種の問題に対して正しい方向に向けることができるのではないかと思っています。私はこの解決策を見てきました: Open CVで円の外側のすべてを黒く塗りつぶす方法 しかし、私の制約のいくつかは異なり、ソース画像がロードされる方法に混乱しています。

前もって感謝します!

7
MSTTm
//First load your source image, here load as gray scale
cv::Mat srcImage = cv::imread("sourceImage.jpg", CV_LOAD_IMAGE_GRAYSCALE);

//Then define your mask image
cv::Mat mask = cv::Mat::zeros(srcImage.size(), srcImage.type());

//Define your destination image
cv::Mat dstImage = cv::Mat::zeros(srcImage.size(), srcImage.type());    

//I assume you want to draw the circle at the center of your image, with a radius of 50
cv::circle(mask, cv::Point(mask.rows/2, mask.cols/2), 50, cv::Scalar(255, 0, 0), -1, 8, 0);

//Now you can copy your source image to destination image with masking
srcImage.copyTo(dstImage, mask);

次に、dstImageでさらに処理を行います。これがソース画像であると想定します。

enter image description here

次に、上記のコードはこれをグレースケール入力として提供します。

enter image description here

そして、これはあなたが作成したバイナリマスクです:

enter image description here

そして、これはマスキング操作後の最終結果です。

enter image description here

24
Derman

内部に形状のある透明な円形の中心を探しているので、ハフ変換を使用してその領域を取得できます。パラメータを慎重に選択すると、この領域を完全に取得するのに役立ちます。

詳細なチュートリアルはこちらです: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

黒の領域の外側のピクセルを設定するには:

マスク画像を作成します:cv::Mat mask(img_src.size(),img_src.type());

内側のポイントを白い色でマークします:

cv::circle( mask, center, radius, cv::Scalar(255,255,255),-1, 8, 0 );

これで、bitwise_ANDを使用して、マスクで囲まれたピクセルのみを含む出力画像を取得できます。

cv::bitwise_and(mask,img_src,output);

4
Giridhur