📅  最后修改于: 2023-12-03 14:54:00.730000             🧑  作者: Mango
布尔玛删除尺寸(Bouma-Deleting Dimension)又称为布尔玛定理,它是一种用于字体学研究的算法,可以通过删除一些特定的尺寸来实现识别不同字体之间的差异。也可以应用于图像处理,用于字符识别、特征提取等领域。
在一个字符的不同字体中,同样大小的字母所占据的像素并不相等,因此,通过对字符进行不同的缩放,可以识别不同字体的差异。但是,缩放会带来像素的变化,在图像处理中,这种变化是不可避免的,一些像素的连通性也会被破坏。
Bouma实验表明,字符的可识别的信息只与其边缘部分相关。同时,字符的边缘由于不同字体大致上都是一致的,因此,字符形状的区别,可以通过删除字符中对可识别性最小的像素,得到相对稳定的信息。这个像素通常位于字符边缘,并且在不同字体中都是相似的。
针对Bouma-Deleting Dimension算法的应用有很多,比如:
以下为使用Python对布尔玛删除尺寸进行应用示例:
import cv2
import numpy as np
# 读取图片
img = cv2.imread('font_sample.png', 0)
# 定义删除窗口大小和种子像素阈值
window_size = 3
threshold = 128
# 定义一个删除函数
def bouma_delete(img):
# 首先,将图片进行二值化处理
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# 然后,使用腐蚀操作对边缘进行处理
kernel = np.ones((window_size, window_size), dtype=np.uint8)
eroded = cv2.erode(img, kernel)
# 接着,提取边缘、种子和中心部分
contour = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
seed = [contour[0][0][0], contour[0][0][1]]
center = np.array([img.shape[1] / 2, img.shape[0] / 2], dtype=np.int32)
# 对图片进行类似于八矩形的处理,找到应该删除的像素
replace_point = []
for i in range(-window_size, window_size):
for j in range(-window_size, window_size):
if i == j or i == -j:
continue
p = np.array([seed[0] + i, seed[1] + j], dtype=np.int32)
if p[0] < 0 or p[1] < 0 or p[0] >= img.shape[1] or p[1] >= img.shape[0]:
continue
if img[p[1], p[0]] >= threshold and eroded[p[1], p[0]] < threshold:
replace_point.append(p)
# 最后,删除不必要的像素
for p in replace_point:
img[p[1], p[0]] = 0
# 返回新的二值化图片
return img
# 对图片进行尺寸删除操作
img_bouma = bouma_delete(img)
# 展示删除之前和删除之后的效果
cv2.imshow('font original', img)
cv2.imshow('font bouma', img_bouma)
# 等待按键关闭
cv2.waitKey(0)
cv2.destroyAllWindows()
以上代码为一个较为简单的开源代码,相关调用的函数可在Python中的OpenCV中进行查找。