OPENCV2 图像修复 — 去除文字(下)

图像修复,指对受到损坏的图像进行修复重建或者去除图像中的多余物体。 
去除文字,是图像修复的一种应用。

提出一个问题: 
给定一张自然图像,该图像上已经写了一些文字(模拟图像遭到了破坏),则如何去掉文字,使得图像恢复原来的面目?

针对上述问题,本文提供两种思路: 
方法一:先用阈值法提取图像中文字,然后用图像减法。即: 
修复图 = 原图像 – 提取的文字图。 
具体描述请看:http://blog.csdn.net/learn_sunzhuli/article/details/47791273

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

对于本文给出的图像,用方法二的效果更好。效果图如下:

这里写图片描述

该方法具体实现代码如下,且在vs2010测试通过。

#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_<Vec3b>::iterator it = dstImg.begin<Vec3b>();
    Mat_<Vec3b>::iterator itend = dstImg.end<Vec3b>();
    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值