
有什么方法可以从包含文本的图像中提取非文本数据吗?我有一个图像,让我们说,一封信,其中有文字,以及签名和标志。我想提取只是标志和标志,更确切地说,删除所有的东西,是文字。有什么办法吗?提前谢谢。
发布于 2019-03-07 18:13:24
python解决方案:
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)结果:

发布于 2019-03-07 06:36:30
您可以执行以下步骤:(代码中注释了重要的部分)
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++中重新实现它。
https://stackoverflow.com/questions/55036072
复制相似问题