如何去除二值图像中不必要的黑色(主要是暗areas/noise造成的)
How do you remove the unnecessary blackness from binary images (mainly caused by dark areas/noise)
我正在处理教科书页面的图像,例如问题和手写笔记,并且想要二进制图像用于几个不同的任务,主要是 OCR。但问题是,如果图像有一点阴影或亮度级别不连续,它会给我很多黑色区域覆盖我的文字。
我在我的图片上使用了 from skimage.filters import try_all_threshold
,发现有些图片适用于特定类型的图片,有些则不然。我不能使用本地阈值,我必须根据不同的图像更改参数,因为我想自动化 OCR 过程。
img_path = DIR+str(11)+'.png'
sk_image = imread(img_path,as_gray=True)
fig,ax = try_all_threshold(sk_image,figsize=(20,15))
plt.savefig('threshold.jpeg',dpi=350)
为什么图像中会形成这个黑色区域,我该如何去除它??
Bilateral
或 Gauss
之类的去噪滤波器可以吗?如果没有,请推荐一些其他技术?
这是在 Python/OpenCV 中使用除法标准化的一种方法。
- 读取输入
- 转换为灰色
- 使用高斯模糊进行平滑处理
- 将灰度图像除以平滑图像
- 应用反锐化蒙版来锐化
- 应用大津阈值
- 保存结果
输入:
import cv2
import numpy as np
import skimage.filters as filters
# read the image
img = cv2.imread('math.png')
# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# blur
smooth = cv2.GaussianBlur(gray, (95,95), 0)
# divide gray by morphology image
division = cv2.divide(gray, smooth, scale=255)
# sharpen using unsharp masking
sharp = filters.unsharp_mask(division, radius=1.5, amount=1.5, multichannel=False, preserve_range=False)
sharp = (255*sharp).clip(0,255).astype(np.uint8)
# threshold
thresh = cv2.threshold(sharp, 0, 255, cv2.THRESH_OTSU )[1]
# save results
cv2.imwrite('math_division.jpg',division)
cv2.imwrite('math_division_sharp.jpg',sharp)
cv2.imwrite('math_division_thresh.jpg',division)
# show results
cv2.imshow('smooth', smooth)
cv2.imshow('division', division)
cv2.imshow('sharp', sharp)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
分区图像:
锐化图像:
阈值图像:
我正在处理教科书页面的图像,例如问题和手写笔记,并且想要二进制图像用于几个不同的任务,主要是 OCR。但问题是,如果图像有一点阴影或亮度级别不连续,它会给我很多黑色区域覆盖我的文字。
我在我的图片上使用了 from skimage.filters import try_all_threshold
,发现有些图片适用于特定类型的图片,有些则不然。我不能使用本地阈值,我必须根据不同的图像更改参数,因为我想自动化 OCR 过程。
img_path = DIR+str(11)+'.png'
sk_image = imread(img_path,as_gray=True)
fig,ax = try_all_threshold(sk_image,figsize=(20,15))
plt.savefig('threshold.jpeg',dpi=350)
为什么图像中会形成这个黑色区域,我该如何去除它??
Bilateral
或 Gauss
之类的去噪滤波器可以吗?如果没有,请推荐一些其他技术?
这是在 Python/OpenCV 中使用除法标准化的一种方法。
- 读取输入
- 转换为灰色
- 使用高斯模糊进行平滑处理
- 将灰度图像除以平滑图像
- 应用反锐化蒙版来锐化
- 应用大津阈值
- 保存结果
输入:
import cv2
import numpy as np
import skimage.filters as filters
# read the image
img = cv2.imread('math.png')
# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# blur
smooth = cv2.GaussianBlur(gray, (95,95), 0)
# divide gray by morphology image
division = cv2.divide(gray, smooth, scale=255)
# sharpen using unsharp masking
sharp = filters.unsharp_mask(division, radius=1.5, amount=1.5, multichannel=False, preserve_range=False)
sharp = (255*sharp).clip(0,255).astype(np.uint8)
# threshold
thresh = cv2.threshold(sharp, 0, 255, cv2.THRESH_OTSU )[1]
# save results
cv2.imwrite('math_division.jpg',division)
cv2.imwrite('math_division_sharp.jpg',sharp)
cv2.imwrite('math_division_thresh.jpg',division)
# show results
cv2.imshow('smooth', smooth)
cv2.imshow('division', division)
cv2.imshow('sharp', sharp)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
分区图像:
锐化图像:
阈值图像: