【问题标题】:Adaptive thresholding handling for big black letters大黑字的自适应阈值处理
【发布时间】:2019-01-21 23:10:15
【问题描述】:

我有一个包含非常大和非常小的字母的文档,我正在对其应用自适应阈值处理。

cvtColor(mbgra, dst, CV_BGR2GRAY);
GaussianBlur(dst, dst, Size(11, 11), 0);
adaptiveThreshold(dst, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 11, 3);

该算法运行良好,但我有一个关于大黑色字母的小问题,因为它像这样从内部变得空心

原始图像中的那些字母被黑色填充

问题是如何在不增加过滤器块大小的情况下使这些字母像原始图像中一样用黑色填充,因为这不能很好地处理小字母!

当然欢迎任何想法或建议!

【问题讨论】:

  • 你试过玩blockSize参数吗?也许增加社区会有所帮助?
  • 这是原图的剪切,也有小写字母,如果块很大,小写字母就不好玩了!
  • 需要自动吗?如果不是,您可以将较大的块应用于图像的某些部分。否则,您可以尝试在 pyramid 处增加窗口大小并选择经基本事实验证的最佳结果(前提是您有一个)。
  • @AhmedHegazy 您是否尝试过基本的二进制阈值(甚至可能是 OTSU?)然后应用形态过滤器(腐蚀/扩张)来读取小孔?
  • 在我看来,您真正的问题是从图像中提取带有小文本和大文本的文本 - 这将是在问题中发布的更好的图像。

标签: opencv image-processing adaptive-threshold image-thresholding


【解决方案1】:

以下代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt

image = cv2.imread("FYROJ.png")
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 3)

im_contours, contours, hier = cv2.findContours(thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
hier = hier[0]
kept_contours = [contour for idx, contour in enumerate(contours) if hier[idx][2] >= 0]

drawing = np.zeros_like(gray)
cv2.drawContours(drawing, kept_contours, -1, color=255)

ret, markers = cv2.connectedComponents(drawing)

watershed_res = cv2.watershed(image, np.int32(markers))

plt.imshow(watershed_res)
plt.show()

将生成此图像:

或许可以尝试从这里入手,选择原图黑色像素较多的区域……

【讨论】:

  • 非常感谢您的回答,但是检测轮廓将非常针对此图像,因为图像内部可能有很多噪音,例如图标和徽标。你怎么看?也请看看我更新的图片!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多