OpenCV Binary Image Mask for Image Analysis in C++

//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.cols/2, mask.rows/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);

Then do your further processing on your dstImage. Assume this is your source image:

enter image description here

Then the above code gives you this as gray scale input:

enter image description here

And this is the binary mask you created:

enter image description here

And this is your final result after masking operation:

enter image description here


Since you are looking for a clear circular center with a shape inside, you could use Hough Transform to get that area- a careful selection of parameters will help you get this area perfectly.

A detailed tutorial is here: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html

For setting pixels outside a region black:

Create a mask image : cv::Mat mask(img_src.size(),img_src.type());

Mark the points inside with white color :

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

You can now use bitwise_AND and thus get an output image with only the pixels enclosed in mask.

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