1 Star 0 Fork 0

刘亚翔/汉字

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
han.py 2.85 KB
一键复制 编辑 原始数据 按行查看 历史
刘亚翔 提交于 2024-06-23 08:16 . 作业
import cv2 as cv # 导入OpenCV库
import numpy as np # 导入numpy库
import matplotlib.pyplot as plt # 导入matplotlib的pyplot库
import os # 导入os库
# 确保文件路径正确
image_path = 'hanzi1.jpg' # 去掉了错误的引号
# 读取图片,0表示灰度图像
img = cv.imread(image_path, 0)
if img is None:
print(f"Error: 无法加载图像 {image_path}")
else:
plt.subplot(1, 7, 1)
plt.imshow(img, cmap='gray')
plt.axis('off')
#全局阈值处理
blur = cv.GaussianBlur(img, (5, 5), 0) # 阈值处理的效果受噪声影响较大,常需要先进行滤波等预处理
_, th = cv.threshold(blur, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
th1_inv = 255 -th
plt.subplot(1,7,2)
plt.imshow(th1_inv,cmap='gray')
plt.axis('off')
#腐蚀
kernel1 = np.ones((3,3), np.uint8)
eroded_img = cv.erode(th1_inv, kernel1, iterations=4)
plt.subplot(1,7,3)
plt.imshow(eroded_img,cmap='gray')
plt.axis('off')
#膨胀
kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, (4, 4)).astype(np.uint8)
dilated_img = cv.dilate(eroded_img, kernel2,iterations=8)
plt.subplot(1,7,4)
plt.imshow(dilated_img,cmap='gray')
plt.axis('off')
#闭运算
kernel3 = np.ones((5, 5), np.uint8)
closed_img = cv.morphologyEx(dilated_img, cv.MORPH_CLOSE, kernel3,iterations=25)
plt.subplot(1,7,5)
plt.imshow(closed_img,cmap='gray')
plt.axis('off')
#边缘检测
img_blur = cv.GaussianBlur(closed_img,(3,3), 0) #高斯滤波
canny = cv.Canny(img_blur, 100, 200) #Canny边缘检测
contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 查找轮廓
cv.drawContours(canny, contours, -1, (255), 2) # 画边界框
plt.subplot(1,7,6)
plt.imshow(canny,cmap='gray')
plt.axis('off')
#轮廓检测
img_copy = th.copy()# 复制图像以绘制边界框
valid_contours_indices = []# 创建一个列表来存储通过周长筛选的轮廓索引
for i, c in enumerate(contours):
perimeter = cv.arcLength(c, True)
print("轮廓周长:", perimeter)
x, y, w, h = cv.boundingRect(c)
# 根据周长阈值筛选并绘制边界框
if perimeter > 350 and perimeter < 600:
cv.rectangle(img_copy, (x, y), (x + w, y + h), (0, 255, 0), 2)
valid_contours_indices.append(i)# 将符合条件的轮廓索引添加到列表中
chars_folder = 'chars'
if not os.path.exists(chars_folder):
os.makedirs(chars_folder)
for i in valid_contours_indices:
# 获取当前轮廓的边界框坐标
x, y, w, h = cv.boundingRect(contours[i])
# 切割图像
roi = th[y:y+h+15, x:x+w+15]
# 创建文件保存路径
filename = os.path.join(chars_folder, f'{i}.jpg')
# 保存图像
cv.imwrite(filename, roi)
plt.subplot(1,7,7)
plt.imshow(img_copy,cmap='gray')
plt.axis('off')
plt.show()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liu-yaxiang/chinese-characters.git
[email protected]:liu-yaxiang/chinese-characters.git
liu-yaxiang
chinese-characters
汉字
master

搜索帮助