如何使用C ++使用OpenCV删除图像中不需要的部分?

时间:2013-11-19 10:42:55

标签: c++ opencv image-processing

这是我的输入图片:

http://www.lyndliving.com/media_library/1491/4f10819a58556504.jpg

我想从我的图片中删除字母(例如DINING ROOM)。我怎么能这样做?

我的代码如下。

Mat skel;
Mat image=imread("InputImage4.jpg",1);
cvtColor(image,image,CV_BGR2GRAY);
threshold(image,image,50,255,THRESH_BINARY_INV);
WallFinder wall;
wall.setLineLengthAndGap(100,20);
wall.setMinVote(80);
skel=wall.skeleton(image);

Mat skeleton(Mat& img)
    {
        threshold(img, img, 50, 255, THRESH_BINARY); 
        Mat skel(img.size(), CV_8UC1, Scalar(0));
        Mat temp;
        Mat eroded;
        Mat element = getStructuringElement(MORPH_CROSS, Size(3, 3));
        bool done;      
        do
        {
          erode(img, eroded, element);
          dilate(eroded, temp, element);
          subtract(img, temp, temp);
          bitwise_or(skel, temp, skel);
          eroded.copyTo(img);
          done = (countNonZero(img) == 0);
        } while (!done);
        dilate(skel,skel,Mat(),Point(-1,-1),2);
        erode(skel,skel,Mat(),Point(-1,-1),2);
        return skel;
    }

这是我的输出图像:

enter image description here

我必须先删除字母才能完成我的工作。 (像BATH一样)

2 个答案:

答案 0 :(得分:1)

使用here描述的文本检测项目来检测文本所在的区域,然后简单地应用图像中最大出现的颜色(即背景)和瞧。!

HTH

答案 1 :(得分:0)

这是我为裁剪图像而制作的代码,并进行了少量修改以满足您的要求。您需要手动选择要删除的区域。

#include <iostream>
#include "opencv2/opencv.hpp"
#include <stdio.h>

using namespace std;
using namespace cv;


Mat src,img,ROI;
Rect cropRect(0,0,0,0);
 Point P1(0,0);
 Point P2(0,0);

const char* winName="Crop Image";
bool clicked=false;
int i=0;
char imgName[15];


void checkBoundary(){
       //check croping rectangle exceed image boundary
       if(cropRect.width>img.cols-cropRect.x)
         cropRect.width=img.cols-cropRect.x;

       if(cropRect.height>img.rows-cropRect.y)
         cropRect.height=img.rows-cropRect.y;

        if(cropRect.x<0)
         cropRect.x=0;

       if(cropRect.y<0)
         cropRect.height=0;
}

void showImage(){
    img=src.clone();
    checkBoundary();
    rectangle(img, cropRect, Scalar(0,255,0), 1, 8, 0 );
    imshow(winName,img);
}


void onMouse( int event, int x, int y, int f, void* ){


    switch(event){

        case  CV_EVENT_LBUTTONDOWN  :
                                        clicked=true;

                                        P1.x=x;
                                        P1.y=y;
                                        P2.x=x;
                                        P2.y=y;
                                        break;

        case  CV_EVENT_LBUTTONUP    :
                                        P2.x=x;
                                        P2.y=y;
                                        clicked=false;
                                        break;

        case  CV_EVENT_MOUSEMOVE    :
                                        if(clicked){
                                        P2.x=x;
                                        P2.y=y;
                                        }
                                        break;

        default                     :   break;


    }


    if(clicked){
     if(P1.x>P2.x){ cropRect.x=P2.x;
                       cropRect.width=P1.x-P2.x; }
        else {         cropRect.x=P1.x;
                       cropRect.width=P2.x-P1.x; }

        if(P1.y>P2.y){ cropRect.y=P2.y;
                       cropRect.height=P1.y-P2.y; }
        else {         cropRect.y=P1.y;
                       cropRect.height=P2.y-P1.y; }

    }


showImage();


}
int main()
{

    cout<<"Click and drag for Selection"<<endl<<endl;
    cout<<"------> Press 's' to save"<<endl<<endl;
    cout<<"------> Press 'e' to reset"<<endl;
    cout<<"------> Press 'r' to reset"<<endl<<endl;
    cout<<"------> Press 'Esc' to quit"<<endl<<endl;


    src=imread("img.jpg",1);

    namedWindow(winName,WINDOW_NORMAL);
    setMouseCallback(winName,onMouse,NULL );
    imshow(winName,src);

    while(1){
    char c=waitKey();
    if(c=='s'&&ROI.data){
     sprintf(imgName,"%d.jpg",i++);
     imwrite(imgName,img);
     cout<<"  Saved "<<imgName<<endl;
    }

    if(c=='e') {
        if(cropRect.width>0&&cropRect.height>0){
        ROI=src(cropRect);
        ROI.setTo(Scalar(255,255,255));
        showImage();
       }
    }

    if(c==27) break;
    if(c=='r') {cropRect.x=0;cropRect.y=0;cropRect.width=0;cropRect.height=0;}
    showImage();

    }


    return 0;
}

<强>结果: - enter image description here