5

i'm new opencv . i writing a remove the background .
my input image enter image description here

i coded my program as follow steps :
- calculate average pixels

//define roi of image
cv::Rect roi(0, 0, 20 , 20 );

//copies input image in roi
cv::Mat image_roi = imgGray( roi );

//imshow("roi", image_roi);
//computes mean over roi
cv::Scalar avgPixelIntensity = cv::mean( image_roi );
//prints out only .val[0] since image was grayscale
cout << "Pixel intensity over ROI = " << avgPixelIntensity.val[0] << endl;

-create new Mat image base on average pixels values :

//create new mat image base on avgPixelIntensity
cv::Mat areaSampleArv(imgGray.rows, imgGray.cols,imgGray.type(),avgPixelIntensity.val[0]);
imshow("areaSampleArv", areaSampleArv);

-Invert image :

void image_invert(Mat& image){
int height, width, step, channels;
uchar *data;

height = image.cols;
width  = image.rows;
step   = (int)image.step;
channels = image.channels();
data = (uchar *)image.data;

for(int i = 0; i < height; i++){
    for(int j = 0; j < width; j++){
        for(int k = 0; k < channels; k++){
            data[i*step + j*channels + k] = 255 - data[i*step + j*channels + k];
        }
    }
}

//imwrite("/Users/thuydungle/Desktop/1234/inverted.png", image);
imshow("inverted", image);}

my image inverted result : enter image description here

-Add inverted image with original image:

 Mat dst;
 dst = areaSampleArv + im0;
 imshow("dst", dst);

any my image result : enter image description here

seem it is very bad and i can use thresholding for extraction numbers ?
so , can you tell me how to fix it ?
thank !

0

1 Answer 1

8

You could try cv:inRange() for color based threshold.

cv::Mat image = cv::imread(argv[1]);
if (image.empty())
{
    std::cout << "!!! Failed imread()" << std::endl;
    return -1;
}

cv::Mat threshold_image;

// MIN B:77 G:0 R:30    MAX B:130 G:68 R:50
cv::inRange(image, cv::Scalar(77, 0, 30), 
                   cv::Scalar(130, 68, 50), 
                   threshold_image);

cv::bitwise_not(threshold_image, threshold_image); 

cv::imwrite("so_inrange.png", threshold_image);

enter image description here

int erode_sz = 4;
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE,
                                   cv::Size(2*erode_sz + 1, 2*erode_sz+1),
                                   cv::Point(erode_sz, erode_sz) );

cv::erode(threshold_image, threshold_image, element);
cv::imwrite("so_erode.png", threshold_image);

enter image description here

cv::dilate(threshold_image, threshold_image, element);
cv::imwrite("so_dilate.png", threshold_image);

enter image description here

cv::imshow("Color Threshold", threshold_image);
cv::waitKey();

You could also execute cv::blur(threshold_image, threshold_image, cv::Size(3, 3)); after cv::bitwise_not() to get a slightly better result.

Have fun changing the code around.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.