首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从图像中检测非文本数据: Python

从图像中检测非文本数据: Python
EN

Stack Overflow用户
提问于 2019-03-07 04:24:30
回答 2查看 1.9K关注 0票数 4

有什么方法可以从包含文本的图像中提取非文本数据吗?我有一个图像,让我们说,一封信,其中有文字,以及签名和标志。我想提取只是标志和标志,更确切地说,删除所有的东西,是文字。有什么办法吗?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 18:13:24

python解决方案:

代码语言:javascript
复制
import cv2
image = cv2.imread("test.png", 1)
img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU,img)
cv2.bitwise_not(img,img)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 5))
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, rect_kernel)
im2, contours, hier = cv2.findContours(img, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
    for c in contours:
        x,y,w,h = cv2.boundingRect(c)
        if(h>20):
            cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),1)

cv2.imshow("Result", image)
cv2.waitKey(0)

结果:

票数 4
EN

Stack Overflow用户

发布于 2019-03-07 06:36:30

您可以执行以下步骤:(代码中注释了重要的部分)

代码语言:javascript
复制
cv::namedWindow("result", cv::WINDOW_FREERATIO);
cv::Mat img = cv::imread(R"(wMHGk.png)");

// to gray
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
// threshold to for segmentation
cv::threshold(gray, gray, 150, 255, cv::THRESH_BINARY_INV);

// connect the text components (here it is 21 you can change it)
cv::dilate(gray, gray, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(21, 3)));
// remove noise
cv::erode(gray, gray, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)));

// last result (leaving only logo and sign)
cv::Mat result(img.size(), CV_8UC3);
result.setTo(cv::Scalar(255, 255, 255));

std::vector<std::vector<cv::Point> > contours;
cv::findContours(gray, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (unsigned int i(0); i<contours.size(); ++i) {
    cv::Rect rect = cv::boundingRect(contours[i]);
    if(rect.height > 20) { // only detect the logo and the sign, (here 20 also you can change it)
        cv::Mat submat1 = result(rect);
        cv::Mat submat2 = img(rect);
        submat2.copyTo(submat1);
        cv::rectangle(img, rect, cv::Scalar(0, 0, 255), 3);
    }
}

cv::imshow("result1", img);
cv::imshow("result2", result);

cv::waitKey();

,这是结果1:

及其结果2:清洁图像

注意:代码在C++中,您可以遵循这些步骤并在C++中重新实现它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55036072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档