Create mask to select the black area
I have a black area around my image and i want to create a mask using OpenCv C++ that select just this black area so that i can paint it later. how Can i do that with out affect the image it self.
I try to converted to grayscale image and then using threshold to converted it to binary, but its affect my image since its contain black pixels.
This is the code i used to find the biggest contoure
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp""
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( )
{
Mat src;
src = imread("pano1.jpg", CV_LOAD_IMAGE_COLOR);
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
threshold(gray, gray,30, 255,THRESH_BINARY_INV); //Threshold the gray
imshow("gray",gray);
int largest_area=0;
int largest_contour_index=0;
Rect bounding_rect;
vector<vector<Point>> contours; // Vector for storing contour
vector<Vec4i> hierarchy;
findContours( gray, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
// iterate through each contour.
for( int i = 0; i< contours.size(); i++ )
{
// Find the area of contour
double a=contourArea( contours[i],false);
if(a>largest_area){
largest_area=a;cout<<i<<" area "<<a<<endl;
// Store the index of largest contour
largest_contour_index=i;
// Find the bounding rectangle for biggest contour
bounding_rect=boundingRect(contours[i]);
}
}
Scalar color(255,255,255); // color of the contour in the
//Draw the contour and rectangle
drawContours( src, contours,largest_contour_index, color, CV_FILLED,8,hierarchy);
rectangle(src, bounding_rect, Scalar(0,255,0),2, 8,0);
Mat inpainted;
inpaint(src, gray, inpainted, 3, INPAINT_NS);
imshow("inpainted image", inpainted);
namedWindow( "Display window", CV_WINDOW_AUTOSIZE );
imshow( "Display window", src );
waitKey(0);
return 0;
}
This is the result of the code:
Another question: if i want to crop the image instead of paint it, how can i do it??
Thanks in advance,
how do you create the canvas image, because the black area around the stitched image is not exactly black.
The image is the result of stitching two image using opencv stitching module.
but you do not initialize a canvas image where you are gonna put the stitching result beforehand?
You can do a findContour on the image, and the biggest one is the contour of your image, so just fill it and you have the mask (maybe you need to inverse the image, using absdiff)
You can do a waterShed starting form the 4 corners, so you can get that mask.
@alexandra: can you provide a .png version of the image? The jpeg compression is causing some artifacts: as @theodore said, the black part is not truly black
@theodore I try to use findContour but the biggest contour is not the contour of my image
Can you post the result of the findContours?
@alexandra as @LorenaGdL said can you post the image without the artifacts.
Have you tried it with the threshold set to 0 (you have put 30, so it is getting inside that tree)? You can do it 2 steps: split the image in 2 parts (top half and bottom half; or even 4 tl quarter, tr quarter...) and apply the algorithm. But the whatershed form each corner should be the best for resolving all the cases. ;)
Thanks, but i think the best solution is to crop the image. do you know how to do it ??