我试图在图像中找到文本的边界框,目前正在使用这种方法:
// calculate the local variances of the grayscale image
Mat t_mean, t_mean_2;
Mat grayF;
outImg_gray.convertTo(grayF, CV_32F);
int winSize = 35;
blur(grayF, t_mean, cv::Size(winSize,winSize));
blur(grayF.mul(grayF), t_mean_2, cv::Size(winSize,winSize));
Mat varMat = t_mean_2 - t_mean.mul(t_mean);
varMat.convertTo(varMat, CV_8U);
// threshold the high variance regions
Mat varMatRegions = varMat > 100;
Run Code Online (Sandbox Code Playgroud)
给出这样的图像时:

然后,当我显示varMatRegions我得到这个图像:

正如你所看到的那样,它将左侧的文本块与卡片的标题结合起来,对于大多数卡片而言,这种方法效果很好,但在较繁忙的卡片上它可能会导致问题.
这些轮廓连接不好的原因是它使得轮廓的边界框几乎占据了整个卡片.
任何人都可以建议一种不同的方式来查找文本以确保正确检测文本吗?
200分,谁能在这两张卡上方找到文字.

我的简单python代码是这样的
import cv2
img=cv2.imread('Materials/shapes.png')
blur=cv2.GaussianBlur(img,(3,3),0)
gray=cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY)
returns,thresh=cv2.threshold(gray,80,255,cv2.THRESH_BINARY)
ret,contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area=cv2.contourArea(cnt) #contour area
if (area>1220):
cv2.drawContours(img,[cnt],-1,(0,255,0),2)
cv2.imshow('RGB',img)
cv2.waitKey(1000)
print(len(cnt))
import numpy as np
contours=np.array(contours)
print(contours)
Run Code Online (Sandbox Code Playgroud)
这很好.但最近没有我做任何改变.这是扔给我的
RET,轮廓,层次结构= cv2.findContours(THRESH,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError:没有足够的值来解压缩(预期3,得到2)
帮帮我们
谢谢.
我有pytesseract的一些问题.我需要将Tesseract配置为配置为接受单个数字,同时也只能接受数字,因为数字零通常与"O"混淆.
像这样:
target = pytesseract.image_to_string(im,config='-psm 7',config='outputbase digits')
Run Code Online (Sandbox Code Playgroud)
非常感谢,
尼尔
我想从图像中检测文本区域作为tesseract OCR引擎的预处理步骤,当输入只是文本时引擎运行良好,但当输入图像包含非文本内容时它会下降,所以我想只检测图像中的文本内容,任何如何做到这一点的想法会有所帮助,谢谢.
我一直在寻找一种可以在保持结构的同时从 PDF 中提取文本的工具。也就是说,给定这样的文本:
副标题1
身体 1
副标题2
身体2
或者
副标题1。身体 1
副标题2。身体2
我想要一个可以输出标题、副标题和正文列表的工具。或者,如果有人知道如何做到这一点,那也很有用:)
如果这 3 个类别的格式相同,这会更容易,但有时字幕可以是粗体、斜体、下划线或 3 的随机组合。标题也是如此。从 HTML/PDF/Docx 中简单解析的问题在于这些文本没有标准,因此我们经常会遇到被分成多个标签的句子(在 HTML 的情况下)并且非常难以解析。正如您所看到的,字幕并不总是在给定的段落之上,或者有时在要点中。这么多可能的格式组合......
到目前为止,我在这里使用 Tesseract 和这里使用 OpenCV遇到过类似的查询,但他们都没有完全回答我的问题。
我知道有一些机器学习工具可以从科学论文中提取“目录”部分,但这也不能削减它。有谁知道包/库,或者是否已经实现了这样的东西?或者有谁知道解决这个问题的方法,最好是在 Python 中?
谢谢!
我所指的文件是来自公司的 10-K,例如这个https://www.sec.gov/Archives/edgar/data/789019/000119312516662209/d187868d10k.htm#tx187868_10 并且说,我想提取项目7 以我上面提到的程序化和结构化的方式。但并非所有这些都被标准化来进行 HTML 解析。(PDF 文档就是保存为 PDF 的这个 HTML)
我想检测 X 射线图像上的文本。目标是将定向边界框提取为矩阵,其中每行都是检测到的边界框,每行包含所有四个边的坐标,即 [x1, x2, y1, y2]。我正在使用 python 3 和 OpenCV 4.2.0。
这是一个示例图像:
应检测字符串“test word”、“a”和“b”。
我遵循了有关为轮廓创建旋转框的OpenCV 教程和有关检测图像中的文本区域的stackoverflow 答案。
生成的边界框应如下所示:
我能够检测到文本,但结果包括很多没有文本的框。
这是我到目前为止所尝试的:
img = cv2.imread(file_name)
## Open the image, convert it into grayscale and blur it to get rid of the noise.
img2gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY)
image_final = cv2.bitwise_and(img2gray, img2gray, mask=mask)
ret, new_img = cv2.threshold(image_final, 180, 255, cv2.THRESH_BINARY) # for black text , cv.THRESH_BINARY_INV
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
dilated = …Run Code Online (Sandbox Code Playgroud) TL;DR:如何以不包含相邻(顶部和底部)段落的方式选择图像上的段落?
\n\n我有一组扫描图像,它们是单列文本,例如这个。这些图像都是黑白的,已经旋转,它们的噪音被减少,并且空白被修剪。
\n\n我想做的是将每个这样的图像分成段落。我最初的想法是测量每行的平均亮度,以找到文本行之间的空格,并尝试选择从该行开始的矩形以匹配缩进并测量该矩形的亮度。但这似乎有点麻烦。
\n\n而且,线条有时会稍微倾斜(最末端的垂直差异最大为 \xe2\x89\x88 10 px),因此有时会出现线条重叠。所以我想选择一个段落的所有字母并使用它们来绘制一个文本块,我使用这种方法得到了这个,但我不知道如何进一步进行。选择从左侧开始像素的每个字母矩形,并尝试包含开始不少于的每个矩形nfirst_rectangle_x - offset?的每个矩形。但那又怎样呢?
我的目标是从扫描的名片图像中删除任何非文本区域,但我不知道使用OpenCV执行该操作的步骤,我已按照这些步骤但不知道这是正确的,或者我也不知道注意图像中的任何变化(非文本区域仍然存在)任何想法将非常有用,谢谢.
1)将图像转换为灰度
2)二进制图像
3)反转颜色(cv :: bitwise_not)以获得白色像素文本
4)侵蚀图像(cv :: erode)
5)使用canny检测边缘
6)使用霍夫变换检测文本行(尚未)
码:
cv::Mat greyMat = [self.imageView.image CVGrayscaleMat];
cv::Mat bwMat;
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY);
cv::bitwise_not(bwMat, bwMat);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 1));
cv::erode(bwMat, bwMat, element);
std::vector<cv::Point>points;
cv::Mat_<uchar>::iterator it=bwMat.begin<uchar>();
cv::Mat_<uchar>::iterator end=bwMat.end<uchar>();
for (; it!=end; ++it)
if (*it)
points.push_back(it.pos());
cv::RotatedRect box=cv::minAreaRect(cv::Mat(points));
plImage* smothedImage=new IplImage(bwMat);
cvSmooth(smothedImage, smothedImage);
cvCanny(smothedImage, smothedImage, 10, 100);
Run Code Online (Sandbox Code Playgroud) opencv ×5
python ×5
c++ ×3
ocr ×3
tesseract ×3
image ×2
python-3.x ×2
bounding-box ×1
pdf ×1
text ×1