去除图像中的文字

2018-04-24  本文已影响0人  Mz楓

分多种情况:

1.针对图像是8通道,并且要去掉的文字的颜色像素相较图像背景有较大差异,比如:    

图1

在这种情况下先用阈值法提取图像中文字,然后用OPENCV中inpaint()函数对图像修复。 调用inpaint()函数一个关键的点:确定修复掩膜。 修复掩膜只能为8位单通道的图像,其中非零像素表示需要修补的区域。 所以,用阈值法提取的文字图像作为修复掩膜。虽然阈值法的处理结果可能会导致一些误检点或者误检区域,但这些误检都在可容忍的错误范围之内。而且可用形态学方法中膨胀操作对阈值法提取的结果进行膨胀,膨胀操作的结果再作为修复掩膜。

代码:

#include "opencv2/core/core.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/photo/photo.hpp"

#include<iostream>

using namespace std;

using namespace cv;

//该方法可能产生误检点,但在可容忍的错范围内

Mat GetRedComponet(Mat srcImg)

{

 //如果直接对srcImg处理会改变main()函数中的实参 

 Mat dstImg = srcImg.clone(); 

 Mat_::iterator it = dstImg.begin();

 Mat_::iterator itend = dstImg.end();

    for(; it != itend; it++)

    {

        if((*it)[2] > 190)//对红色分量做阈值处理

        {

            (*it)[0] = 0;

            (*it)[1] = 0;

            //(*it)[2] = 255;//红色分量保持不变

        }

        else

        {

            (*it)[0] = 0;

            (*it)[1] = 0;

            (*it)[2] = 0;

        }

    }

    return dstImg;

}

void Inpainting(Mat oriImg, Mat maskImg)

{

    Mat grayMaskImg;

    Mat element = getStructuringElement(MORPH_RECT, Size(7, 7));

    dilate(maskImg, maskImg, element);//膨胀后结果作为修复掩膜

    //将彩色图转换为单通道灰度图,最后一个参数为通道数

    cvtColor(maskImg, grayMaskImg, CV_BGR2GRAY, 1);

    //修复图像的掩膜必须为8位单通道图像

    Mat inpaintedImage;

    inpaint(oriImg, grayMaskImg, inpaintedImage, 3, INPAINT_TELEA);

    imshow("原图", oriImg);

    imshow("图像复原结果图", inpaintedImage);

    waitKey(0);

}

int main(int argc, char* argv[])

{

    Mat srcImg;

    srcImg = imread("D:/openCV/data/naturalImage/data/opencv.jpg", 1);

    Mat imgComponet = GetRedComponet(srcImg);

    Inpainting(srcImg, imgComponet);

    return 0;

}

2.

上一篇下一篇

猜你喜欢

热点阅读