首页 > 解决方案 > 扫描后使用 OpenCV 库处理扫描图像(iOS swift)

问题描述

我正在尝试在 iOS (Swift) 中使用 OpenCV 处理扫描的图像,但扫描后我没有得到清晰的图像

以下代码的参考取自这里:-扫描的文档 - 使用 OpenCV + iOS 的文本和背景清晰度不好

下面是显示扫描前后图像质量的结果比较的图像。结果是一样的,在后处​​理图像中没有提高质量。

处理前的图像

处理后的图像

这是我的扫描图像代码。

+ (cv::Mat)cvMatFromUIImage3:(cv::Mat)image
{
//    NSString *foo = path;
//    std::string bar = std::string([image UTF8String]);
    cv::Mat input = image;
//    cv::imread(image,IMREAD_UNCHANGED);
    int maxdim = input.cols; //std::max(input.rows,input.cols);
    const int dim = 1024;
    if ( maxdim > dim )
    {
        double scale = (double)dim/(double)maxdim;
        cv::Mat t;
        cv::resize( input, t, cv::Size(), scale,scale );
        input = t;
    }
    if ( input.type()!=CV_8UC4 )
        CV_Error(CV_HAL_ERROR_UNKNOWN,"!bgr");
    cv::Mat result;
    input.copyTo( result ); // result is just for drawing the text rectangles

    // as previously...
    cv::Mat median;
    // remove highlight pixels e.g., those from debayer-artefacts and noise
    cv::medianBlur(input,median,5);
    cv::Mat localmax;
    // find local maximum
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(15,15) );
    cv::morphologyEx( median,localmax,cv::MORPH_CLOSE,kernel,cv::Point(-1,-1),1,cv::BORDER_REFLECT101 );

    std::vector< cv::Rect > bb;
    // detectLetters by @William, modified to internally do the grayscale conversion if necessary
    // https://stackoverflow.com/questions/23506105/extracting-text-opencv?rq=1
      std::vector<cv::Rect> letterBBoxes1=detectLetters(input);
//    detectLetters( input, bb );
    // compose a simple Gaussian model for text background (still assumed white)
    cv::Mat mask( input.size(),CV_8UC1,cv::Scalar( 0 ) );
    if ( bb.empty() )
        return image; // TODO; none found
    for ( size_t i=0;i<bb.size(); ++i )
    {
        cv::rectangle( result, bb[i], cv::Scalar(0,0,255),2,8 ); // visualize only
        cv::rectangle( mask, bb[i], cv::Scalar( 1 ), -1 ); // create a mask for cv::meanStdDev
    }
    cv::Mat mean,dev;
    cv::meanStdDev( localmax, mean, dev, mask );
    if ( mean.type()!=CV_64FC1 || dev.type()!=CV_64FC1 || mean.size()!=cv::Size(1,3) || dev.size()!=cv::Size(1,3) )
        CV_Error(CV_HAL_ERROR_UNKNOWN, "should never happen");
    double minimum[3];
    double maximum[3];
    // simply truncate the localmax according to our simple Gaussian model (+/- one standard deviation)
    for ( unsigned int u=0;u<3;++u )
    {
        minimum[u] = mean.at<double>(u ) - dev.at<double>( u );
        maximum[u] = mean.at<double>(u ) + dev.at<double>( u );
    }
    for ( int y=0;y<mask.rows;++y){
        for ( int x=0;x<mask.cols;++x){
            cv::Vec3b & col = localmax.at<cv::Vec3b>(y,x);
            for ( unsigned int u=0;u<3;++u )
            {
                if ( col[u]>maximum[u] )
                    col[u]=maximum[u];
                else if ( col[u]<minimum[u] )
                    col[u]=minimum[u];
            }
        }
    }
    // do the per pixel gain then
    cv::Mat dst;
    input.copyTo( dst );
    for ( int y=0;y<input.rows;++y){
        for ( int x=0;x<input.cols;++x){
            const cv::Vec3b & v1=input.at<cv::Vec3b>(y,x);
            const cv::Vec3b & v2=localmax.at<cv::Vec3b>(y,x);
            cv::Vec3b & v3=dst.at<cv::Vec3b>(y,x);
            for ( int i=0;i<3;++i )
            {
                double gain = 255.0/(double)v2[i];
                v3[i] = cv::saturate_cast<unsigned char>( gain * v1[i] );
            }
        }
    }
    return dst;
}

标签: c++iosswiftxcodeopencv

解决方案


推荐阅读