【问题标题】:How to remove background image with Opencv如何使用 Opencv 删除背景图像
【发布时间】:2013-09-10 03:51:19
【问题描述】:

我是新的 opencv 。我写了一个删除背景。
我的输入图片

我按照以下步骤编写了我的程序:
- 计算平均像素

//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;

-根据平均像素值创建新的 Mat 图像:

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

-反转图像:

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);}

我的图像反转结果:

-添加与原图倒置的图像:

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

任何我的图像结果:

看起来很糟糕,我可以使用阈值来提取数字吗?
那么,你能告诉我如何解决吗?
谢谢!

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    您可以尝试cv:inRange() 获取基于颜色的阈值。

    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);
    

    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);
    

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

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

    您也可以在cv::bitwise_not() 之后执行cv::blur(threshold_image, threshold_image, cv::Size(3, 3)); 以获得更好的结果。

    改代码玩得开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2017-07-06
      • 2020-12-05
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多