【问题标题】:How can make white background of the picture with texts in C++如何在C++中用文字制作图片的白色背景
【发布时间】:2021-04-26 14:02:15
【问题描述】:

我想裁剪 1280x720 图像上的文本并将文本放回 1280x720 白色图像上。我希望文字之外的地方是白色的。

其实我把图片中的所有文字都剪掉了拼贴,但是文字的大小变了,我不要这个。

我希望图片中文字的位置和大小不要改变。

如何在 Opencv 中做到这一点? c++ 或 python

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_modules.hpp>

#include <cmath>
#include <fstream>

using namespace std;
using namespace cv;

Mat detect_text(Mat input) {
    Mat large = input;
    Mat rgb;
    // downsample and use it for processing
    pyrDown(large, rgb);
    Mat small;
    cvtColor(rgb, small, COLOR_BGR2GRAY);
    // morphological gradient
    Mat grad;
    Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
    // binarize
    Mat bw;
    threshold(grad, bw, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU);
    // connect horizontally oriented regions
    Mat connected;
    morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1));
    morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);
    // find contours
    Mat mask = Mat::zeros(bw.size(), CV_8UC1);
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(connected, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE,
                 Point(0, 0));
    // filter contours
    cv::Mat croppedImage;

    Mat temp_Image(input.size(), CV_8UC3, Scalar(255, 255, 255));

    for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) {
        Rect rect = boundingRect(contours[idx]);
        Mat maskROI(mask, rect);

        maskROI = Scalar(0, 0, 0);
        // fill the contour
        drawContours(mask, contours, idx, Scalar(255, 255, 255), FILLED);
        // ratio of non-zero pixels in the filled region
        double r = (double)countNonZero(maskROI) / (rect.width * rect.height);

        // assume at least 45% of the area is filled if it contains text
        if(r > 0.45 &&
           (rect.height > 8 && rect.width > 8) // constraints on region size
           // these two conditions alone are not very robust. better to use
           // something
           // like the number of significant peaks in a horizontal projection as a
           // third condition
        ) {
            rect.x = rect.x;
            rect.y = rect.y;
            rect.height = rect.height + 10;
            rect.width = rect.width + 10;

            rectangle(rgb, rect, Scalar(0, 255, 0), 2);
            croppedImage = rgb(rect);

            //
            //  to put cropped texts in tem_image
            //
            // imwrite(string("test_text_contours.jpg"), temp_image);
        }
    }
    // imwrite(string("test_text_contours.jpg"), croppedImage);

    return croppedImage;
}

int main(int argc, char *argv[])
{
    Mat img = cv.imread("1.jpg");
    detect_text(img);
    return 0;
}

【问题讨论】:

    标签: python c++ opencv computer-vision


    【解决方案1】:

    这里是python代码:

    import cv2
    import numpy as np
    
    def get_white_image(img, crops):
        image_sizey, image_sizex, c = img.shape
        white_image = np.zeros([image_sizey, image_sizex, 3], dtype=np.uint8)
        white_image.fill(255)
        for crop in crops:
            white_image[crop[0]:crop[1], crop[2]:crop[3]] = img[crop[0]:crop[1], crop[2]:crop[3]]
        return white_image
    
    
    image = cv2.imread("baldo.jpg")
    cv2.imshow("image", image)
    crops = []
    crops.append([35, 80, 70, 140])
    crops.append([85, 95, 50, 160])
    crops.append([115, 145, 50, 90])
    crops.append([220, 240, 80, 125])
    result = get_white_image(image, crops=crops)
    cv2.imshow("result", result)
    cv2.waitKey(0)
    

    结果如下: Image and white image

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多