目录
一、动机
二、降噪二值化处理
1.一般二值化处理
2.降噪二值化处理
三、图片区域空白框判断
1.计算区域黑色像素比重
2.设置阈值筛选空白区域
3.可视化检查结果
一、动机
在使用 Surya 检测文本框时,对于一些特殊的文本,尤其是中文的古籍等,存在检测不准确的问题。常常会出现一些意料之外的错误——如漏检、误检、框压线等。本文聚焦于处理在文本检测框任务中出现的空白区域框检测的剔除问题——(空白区域即将背景视为文本的框)
二、彩色图降噪二值化处理为黑白图
想要剔除这些错误识别背景色的文本框,一种可行的办法是通过判断当前框内的黑白色构成(因为文本是黑色而背景可以转为白色)这种筛选方式就需要将初始的彩色图片转为二值黑白图片。用 OpenCV 或者 PIL 自带的库可以实现这一功能,但是简单实用操作后的图片存在很大的噪声模糊。
1.一般二值化处理
下面先给出一般的二值化操作。
from PIL import Image
# 彩色原图位置
image_path = ''
# 二值图结果输出位置
binary_path = ''
##########以上根据实际情况修改###########
image = Image.open(image_path)
# 读取转为灰度图
gray_img = image.convert('L')
# 设置阈值转为黑(0)白(255)
binary_img = gray_img.point(lambda x: 255 if x > 127 else 0)
binary_img.save(binary_path)
上述简单操作的效果图如下。可以看到转化图片中有很大的噪点影响。此时可以通过调整代码倒数第二行的阈值来改善效果,但十分麻烦,此处我们使用一种使用动态阈值和高斯模糊的降噪处理的二值化图。
2.降噪二值化处理
import cv2
import numpy as np
# 彩色原图位置
imagedir = ''
# 降噪二值图保存位置
denoisedir = ''
# 可调节超参数:降噪强度
area_threshold = 5
##########以上根据实际情况修改###########
denoise_img = cv2.imread(imagedir, cv2.IMREAD_GRAYSCALE)
_,binary = cv2.threshold(denoise_img, 100, 255, cv2.THRESH_BINARY_INV)
img_array = np.asarray(binary)
Denoise().maxArea(img_array, area_threshold=5)
img_max = img_array.astype(np.uint8)
final_img = 255 - img_max
cv2.imwrite(denoisedir, final_img)
class Denoise:
def maxArea(self, img, area_threshold):
self.maxsum = 0
row, col = img.shape
total_pixels = row * col
img1 = np.zeros((row, col), dtype=int)
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
for i in range(row):
for j in range(col):
if img[i, j] >= 50 and img1[i, j] == 0:
area = 0
stack = [(i, j)]
points = []
while stack:
x, y = stack.pop()
if img1[x, y] == 2:
continue
img1[x, y]