赞
踩
甲骨文图像预处理模型的主要目的是对图像进行初步处理,去除干扰元素,提取图像中的文字特征。其中,干扰元素主要包括点状噪声、人工纹理和固有纹理,其干扰程度不同,需要采用不同的方法进行处理。本模型采用图像滤波和形态学运算相结合的方法,对图像进行预处理,然后再进行特征提取。
首先,对图像进行灰度化处理,将彩色图像转换为灰度图像。然后,对图像进行高斯滤波,去除图像中的噪声。高斯滤波器的公式如下:
G
(
x
,
y
)
=
1
2
π
σ
2
e
−
x
2
+
y
2
2
σ
2
G(x,y) = \dfrac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}
G(x,y)=2πσ21e−2σ2x2+y2
其中,
G
(
x
,
y
)
G(x,y)
G(x,y)为高斯滤波器,
σ
\sigma
σ为标准差,
x
,
y
x,y
x,y为像素坐标。
接着,采用形态学运算中的腐蚀和膨胀操作,对图像进行进一步的处理。腐蚀操作可以消除图像中的小斑点,使图像中的文字更加清晰,其公式如下:
A
⊖
B
=
{
z
∣
(
B
)
z
⊆
A
}
A \ominus B = \{ z | (B)_z \subseteq A \}
A⊖B={z∣(B)z⊆A}
其中,
A
A
A为原始图像,
B
B
B为结构元素,
(
B
)
z
(B)_z
(B)z表示结构元素在图像
A
A
A的坐标为
z
z
z的位置进行覆盖,
⊖
\ominus
⊖表示腐蚀操作。
膨胀操作则可以填补文字中的空隙,使得文字更加完整,其公式如下:
A
⊕
B
=
⋃
b
∈
B
{
a
+
b
∣
a
∈
A
}
A \oplus B = \bigcup_{b\in B} \{ a+b | a\in A \}
A⊕B=b∈B⋃{a+b∣a∈A}
其中,
A
A
A为原始图像,
B
B
B为结构元素,
+
+
+表示图像的平移,
⊕
\oplus
⊕表示膨胀操作。
经过上述处理后,再采用二值化的方法,将图像转换为黑白图像,便于后续的特征提取。二值化的公式如下:
g
(
x
,
y
)
=
{
0
,
f
(
x
,
y
)
<
T
1
,
f
(
x
,
y
)
≥
T
g(x,y) = \left\{
其中,
g
(
x
,
y
)
g(x,y)
g(x,y)为二值图像,
f
(
x
,
y
)
f(x,y)
f(x,y)为灰度图像,
T
T
T为阈值。
最后,对图像进行轮廓提取,得到图像中的文字区域。轮廓提取的公式如下:
C
=
{
x
∣
x
∈
X
,
D
(
x
)
⊇
G
(
x
)
}
\boldsymbol{C} = \{\boldsymbol{x} | \boldsymbol{x}\in \boldsymbol{X}, \boldsymbol{D}(\boldsymbol{x})\supseteq \boldsymbol{G}(\boldsymbol{x})\}
C={x∣x∈X,D(x)⊇G(x)}
其中,
C
\boldsymbol{C}
C为轮廓,
X
\boldsymbol{X}
X为图像的像素集合,
D
(
x
)
\boldsymbol{D}(\boldsymbol{x})
D(x)为图像的膨胀结果,
G
(
x
)
\boldsymbol{G}(\boldsymbol{x})
G(x)为图像的轮廓结果。
甲骨文图像分割模型的主要目的是对图像中的文字进行分割,将不同的文字分割出来。本模型采用基于深度学习的方法,通过卷积神经网络对图像进行分割。
首先对已标注的甲骨文图像进行预处理,得到干净的图像,然后将图像划分为训练集和验证集,其中训练集用于训练模型,验证集用于评估模型的性能。接着构建卷积神经网络,采用卷积层、池化层和全连接层构成,最后通过Softmax函数输出图像的分割结果。卷积神经网络的公式如下:
f
i
+
1
(
x
)
=
σ
(
W
i
f
i
(
x
)
+
b
i
)
f_{i+1}(x) = \sigma(W_if_i(x)+b_i)
fi+1(x)=σ(Wifi(x)+bi)
其中,
f
i
(
x
)
f_i(x)
fi(x)为第
i
i
i层的输出,
σ
\sigma
σ为激活函数,
W
i
W_i
Wi为权重,
b
i
b_i
bi为偏置。
最后,训练模型,通过反向传播算法更新网络中的参数,使得模型的预测结果与标注结果尽可能接近。训练的目标函数如下:
min
w
,
b
1
N
∑
i
=
1
N
L
(
f
(
x
i
;
w
,
b
)
,
y
i
)
+
λ
∑
j
=
1
n
w
j
2
\min_{w,b} \dfrac{1}{N}\sum_{i=1}^{N}L(f(x_i;w,b),y_i) + \lambda \sum_{j=1}^{n} w_j^2
w,bminN1i=1∑NL(f(xi;w,b),yi)+λj=1∑nwj2
其中,
L
L
L为损失函数,
w
w
w和
b
b
b为网络中的参数,
λ
\lambda
λ为正则化参数。
经过上述步骤,便可以得到一个快速准确的甲骨文图像分割模型,如图4所示。
利用建立的甲骨文图像分割模型,对附件3中的200张甲骨文原始拓片图像进行单字分割,并将分割结果放在“Test_results.xlsx”中,如图5所示。其中,每个单元格表示一个文字,其分割结果为0或1,0表示该位置不是文字,1表示该位置是文字。
甲骨文文字识别模型的主要目的是对图像中的文字进行识别,通过识别出的文字,可以推断出图像中的问题。本模型采用基于深度学习的方法,通过卷积神经网络对图像进行识别。
首先,对训练集中的甲骨文字形进行预处理,得到干净的图像,然后将图像划分为训练集和验证集,其中训练集用于训练模型,验证集用于评估模型的性能。
接着,构建卷积神经网络,采用卷积层、池化层和全连接层构成,最后通过Softmax函数输出图像的识别结果。卷积神经网络的公式如下:
f
i
+
1
(
x
)
=
σ
(
W
i
f
i
(
x
)
+
b
i
)
f_{i+1}(x) = \sigma(W_if_i(x)+b_i)
fi+1(x)=σ(Wifi(x)+bi)
其中,
f
i
(
x
)
f_i(x)
fi(x)为第
i
i
i层的输出,
σ
\sigma
σ为激活函数,
W
i
W_i
Wi为权重,
b
i
b_i
bi为偏置。
最后,训练模型,通过反向传播算法更新网络中的参数,使得模型的识别结果与标注结果尽可能接近。训练的目标函数如下:
min
w
,
b
1
N
∑
i
=
1
N
L
(
f
(
x
i
;
w
,
b
)
,
y
i
)
+
λ
∑
j
=
1
n
w
j
2
\min_{w,b} \dfrac{1}{N}\sum_{i=1}^{N}L(f(x_i;w,b),y_i) + \lambda \sum_{j=1}^{n} w_j^2
w,bminN1i=1∑NL(f(xi;w,b),yi)+λj=1∑nwj2
其中,
L
L
L为损失函数,
w
w
w和
b
b
b为网络中的参数,
λ
\lambda
λ为正则化参数。
Python代码如下:
# 导入所需的库 import cv2 import numpy as np from skimage import morphology, measure # 读取图像 image = cv2.imread("Pre_test/1.png", 0) # 图像预处理 # 灰度化 gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 去噪 dilated_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))) # 边缘检测 edges = cv2.Canny(dilated_img, 100, 200) # 去除点状噪声和人工纹理 kernel = np.ones((3, 3), np.uint8) opening = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) # 利用轮廓检测算法提取甲骨文字轮廓 contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 根据轮廓的几何特征对文字和干扰元素进行初步判别 for contour in contours: area = cv2.contourArea(contour) perimeter = cv2.arcLength(contour, True) circularity = 4 * np.pi * area / (perimeter * perimeter) # 根据圆形度阈值判别 if circularity < 0.9: # 去除干扰元素 cv2.drawContours(image, contour, -1, (0, 0, 0), -1) # 显示结果图像 cv2.imshow("result", image) cv2.waitKey(0) cv2.destroyAllWindows()
问题2的数学建模如下:
甲骨文图像分割模型的建立可分为以下几个步骤:
模型建立的数学表达为:
假设原始甲骨文图像为
I
I
I,经过预处理和特征提取后得到特征图
F
F
F,分割模型
M
M
M的输入为
F
F
F,输出为分割结果
S
S
S,则有:
S
=
M
(
F
)
S = M(F)
S=M(F)
模型训练过程中,需要选择合适的损失函数
L
L
L来评估分割结果的准确性,可以选择交叉熵损失函数,即:
L
=
−
∑
i
=
1
n
y
i
log
(
p
i
)
L = -\sum_{i=1}^n y_i \log(p_i)
L=−i=1∑nyilog(pi)
其中
n
n
n为分割结果的像素数量,
y
i
y_i
yi为标注好的结果,
p
i
p_i
pi为模型预测的结果。模型的优化目标为最小化损失函数,即:
min
M
L
\min_{M} L
MminL
模型评估指标可以选择准确率、召回率和F1值,分别为:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
Precision = \frac{TP}{TP+FP}
Precision=TP+FPTP
R
e
c
a
l
l
=
T
P
T
P
+
F
N
Recall = \frac{TP}{TP+FN}
Recall=TP+FNTP
F
1
=
2
×
P
r
e
c
i
s
i
o
n
×
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F1 = \frac{2 \times Precision \times Recall}{Precision + Recall}
F1=Precision+Recall2×Precision×Recall
其中,
T
P
TP
TP为真正例,
F
P
FP
FP为假正例,
F
N
FN
FN为假负例。
下面是python代码示例:
# 导入所需的库 import numpy as np import tensorflow as tf import keras from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from keras.optimizers import Adam # 定义图像的预处理函数 def preprocess(image): # 将图像转为灰度图 image = image.convert('L') # 将图像进行二值化处理 image = image.point(lambda x: 0 if x < 128 else 255) # 去除图像中的噪声 image = image.filter(ImageFilter.MedianFilter()) return image # 定义图像的特征提取函数 def extract_features(image): # 提取图像的形状特征,包括笔画数、笔画方向等信息 # TODO: 使用相关的算法提取形状特征 # 提取图像的纹理特征,包括文字的纹理、颜色等信息 # TODO: 使用相关的算法提取纹理特征 return features # 定义甲骨文图像分割模型 def create_model(): model = Sequential() # 添加卷积层和池化层 model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) # 添加卷积层和池化层 model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 添加卷积层和池化层 model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 添加全连接层 model.add(Flatten()) model.add(Dense(256, activation='relu')) model.add(Dropout(0.5)) # 添加输出层 model.add(Dense(2, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001), metrics=['accuracy']) return model # 定义数据增强器 datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') # 加载训练集 train_generator = datagen.flow_from_directory( 'Train', target_size=(128, 128), batch_size=32, class_mode='categorical', color_mode='grayscale') # 加载验证集 validation_generator = datagen.flow_from_directory( 'Val', target_size=(128, 128), batch_size=32, class_mode='categorical', color_mode='grayscale') # 创建模型 model = create_model() # 训练模型 model.fit_generator( train_generator, steps_per_epoch=200, epochs=20, validation_data=validation_generator, validation_steps=50) # 对测试集中的图像进行预测 test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( 'Test', target_size=(128, 128), batch_size=32, class_mode='categorical', color_mode='grayscale') test_images = test_generator.next() predictions = model.predict(test_images) # 输出预测结果 print(predictions)
查看完整思路详见:
【腾讯文档】2024年MathorCup高校数学建模挑战赛全题目深度解析(详细思路+建模过程+代码实现+论文指导)
https://docs.qq.com/doc/DSFZYb1FsQ3hqbHNs
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。