python - 使用 Python Opencv 在图像中查找问题文本 block

标签 python image opencv image-processing computer-vision

如何在带有 Python 代码问题的 jpg 文件中选择问题块?下面的代码选择文本。我想用他们的选择来选择问题块。

import cv2

image = cv2.imread('test2.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=4)

cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts\[0\] if len(cnts) == 2 else cnts\[1\]

ROI_number = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > 10000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
        ROI = image\[y:y+h, x:x+w\]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        ROI_number += 1

cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('image', image)
cv2.waitKey()

想要的结果:

enter image description here

我用鼠标在图片中绘制了矩形。原始图片中没有矩形。

原始文件在这里:

enter image description here

最佳答案

一个简单的方法是获取二值图像并执行 morphological operations
将文本连接成单个轮廓。结果如下:

二进制图像



扩张以连接轮廓



结果



代码

import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Morph operations
opening_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, opening_kernel, iterations=1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,50))
dilate = cv2.dilate(opening, kernel, iterations=2)

# Remove center line
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    x,y,w,h = cv2.boundingRect(c)
    ar = w / float(h)
    if area > 10000 and area < 12500 and ar < .5:
        cv2.drawContours(dilate, [c], -1, 0, -1)

# Dilate more
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10,10))
dilate = cv2.dilate(dilate, kernel, iterations=3)

# Draw boxes
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 100000:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)

cv2.imwrite('thresh.png', thresh)
cv2.imwrite('dilate.png', dilate)
cv2.imwrite('opening.png', opening)
cv2.imwrite('image.png', image)
cv2.waitKey()

关于python - 使用 Python Opencv 在图像中查找问题文本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60223779/

相关文章:

python - 有什么方法可以通过解析/拆分 URL 列表来创建 pandas 数据框?

python - 基于带有日期索引的 bool 系列过滤 pandas DataFrame?

python - 动态生成css内容不生效

image - 在 ffmpeg 中使用 filter_complex 输出作为 MKV 附件

OpenCV GpuMat 用法

python - 在 OpenCV 中,您可以使用 addWeighted 获得每个像素的权重吗?

python - 将切线添加到曲线,并将法线添加到切线。 OpenCV Python

python - 删除列表中字符串的所有扩展名

css - 在网格中的图像上创建一个带有文本的框

ios - networkActivityIndi​​cator可见逻辑问题